Постановка задачи.Пароходная компания имеет один прогулочный пароход. Общее число мест – 25, из них 5 – места первого класса, 20 – места экономкласса. Программа должна запрашивать необходимое число билетов, комфортность (первый класс или эконом), «выдавать билет» с указанием места и уровня комфортности. Если заказ выполнить невозможно – печатать сообщение об отсутствии мест в данной категории. Проект обучает работе с массивами.
Реализация. Для решения задачи используем два массива: для первого и «эконом» классов. Опишем глобальные данные:
procedure SchitatPM(var class1, classe:integer);
const n1=5; // Места в 1-м классе
ne=20; // Места в экономклассе
var
mesta1:array[1..n1] of integer;
mestae:array[1..ne] of integer;
zakaz1, zakaze, pusto1,pustoe:integer;
i,j:integer;
s:string;
Ниже приведен код необходимых обработчиков.
procedure TForm1.FormCreate(Sender: TObject);
begin
for i:= 1 to n1 do
mesta1[i]:=0;
for i:= 1 to ne do
mestae[i]:=0;
end;
procedure Tform1.SchitatPM(var class1:integer; var classe:integer) ;
var i:integer;
begin
class1:=0;
for i:=1 to n1 do
if mesta1[i]=0 then class1:=class1+1;
classe:=0;
for i:=1 to ne do
if mestae[i]=0 then classe:=classe+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var p1,pe:integer;
begin
SchitatPM(pusto1,pustoe);
if edit1.Text<>'' then
zakaz1:=strtoint(edit1.Text)
else
zakaz1:=0;
if edit2.Text<>'' then
zakaze:=strtoint(edit2.Text)
else
zakaze:=0;
if pusto1<zakaz1 then
begin
showmessage('Недостаточно мест в первом классе');
exit;
end;
if pustoe<zakaze then
begin
showmessage('Недостаточно мест в эконом классе');
exit;
end;
// Занимаем места в первом классе
for i:= 1 to n1 do
begin
if zakaz1>0 then
if mesta1[i]=0 then
begin
mesta1[i]:=2;
zakaz1:=zakaz1-1;
end;
end;
// Занимаем места в экономклассе
for i:= 1 to ne do
begin
if zakaze>0 then
if mestae[i]=0 then
begin
mestae[i]:=2;
zakaze:=zakaze-1;
end;
end;
// Выдаем номера мест в первом классе
s:='';
for i:=1 to n1 do
begin
if mesta1[i]=2 then
begin
s:=s+ ' '+inttostr(i);
mesta1[i]:=1;
end;
end;
showmessage(' В первом классе места:'+s);
// Выдаем номера мест в эконом классе
s:='';
for i:=1 to ne do
begin
if mestae[i]=2 then
begin
s:=s+ ' '+inttostr(i);
mestae[i]:=1;
end;
end;
showmessage(' В эконом классе места:'+s);
end;
Задание 1. Продумайте интерфейс и самостоятельно реализуйте его так, чтобы пользователю было удобно «купить» билет. Сделайте наглядным план расположения мест, отметьте свободные и проданные. Используйте для плана компонент TStringGrid.
Задание 2. Изначально сделайте все места свободными. По мере продажи отмечайте проданные места. Введите продажу по датам.
Проект «Таблица рисунков»
Постановка задачи.Простейший проект знакомит с компонентом TDrawGrid и его свойствами.
Компонент TDrawGrid является непосредственным родителем строковой таблицы TStringGrid, поэтому передает ей все свои свойства, методы и события за исключением специфичных для строк свойств Cells, Cols, Objects и Rows.
В приведенном примере компонент TDrawGrid используется для показа картинок и текста одновременно. Результат работы проекта приведен на рис. 35.
Рис. 35. Проект «Таблица рисунков»
Реализация. Найдите подходящие рисунки примерно одинакового размера и сохраните их в папке проекта. Создайте пустую форму для данного приложения и положите на нее таблицу DrawGrid. Значения фиксированных строки и столбца сделайте равными 0. Задайте число строк и столбцов так, чтобы число ячеек таблицы равнялось числу файлов с картинками. В приведенном примере шесть файлов с изображениями, поэтому таблица имеет три столбца и две строки. Установите для компонента DrawGrid1 следующие значения свойств.
В свойствах DrawGrid1 найдите DefaultRowHeight и DefaultRowWidth и сделайте их значения такими, чтобы они были немного больше размеров растрового рисунка. Установите свойство ScrollBars таблицы, равным ssNone. Оно означает – не вставлять полосы прокрутки.
В описание класса TForm1 вставьте такое поле sBitMap:
public
sBitMap: TStringList;
Это поле будет использоваться для хранения картинок и текстовых строк. Его необходимо создать и наполнить в момент создания окна, и уничтожить при его уничтожении. Поэтому создайте следующие обработчики событий OnCreate и OnDestroy для формы:
procedure TForm1.FormCreate(Sender: TObject);
// Эта процедура создает и наполняет список slBitMap
const fname:array[0..5] of String=('Ананас.bmp','Вишня.bmp',
mas:array[0..5] of String=('Ананас','Вишня', 'Апельсин',
'Яблоко','Арбуз','Груша');
var k:integer;
begin
// Создаем список строк
sBitMap:=TStringList.Create;
// Вставляем в него названия картинок
for k:=0 to 5 do
begin
sBitMap.Add(mas[k]);
// Свойство Objects служит для хранения картинок
sBitMap.Objects[k]:=TBitMap.Create;
(sBitMap.Objects[k] as TBitMap).LoadFromFile(fname[k]);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
sBitMap.Free; // Уничтожает список строк
end;
Теперь необходимо создать обработчик события OnDrawCell. Этот обработчик обязателен для компонента TDrawGrid, так как без него компонент не сможет заполнить пустые клетки каким-либо изображением или текстом.