Читайте также:
|
|
Постановка задачи. Пароходная компания имеет один прогулочный пароход. Общее число мест – 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. Изначально сделайте все места свободными. По мере продажи отмечайте проданные места. Введите продажу по датам.
6.1.4. Проект «Таблица рисунков»
Постановка задачи. Простейший проект знакомит с компонентом TDrawGrid и его свойствами.
Компонент TDrawGrid является непосредственным родителем строковой таблицы TStringGrid, поэтому передает ей все свои свойства, методы и события за исключением специфичных для строк свойств Cells, Cols, Objects и Rows.
В приведенном примере компонент TDrawGrid используется для показа картинок и текста одновременно. Результат работы проекта приведен на рис. 35.
Рис. 35. Проект «Таблица рисунков»
Реализация. Найдите подходящие рисунки примерно одинакового размера и сохраните их в папке проекта. Создайте пустую форму для данного приложения и положите на нее таблицу DrawGrid. Значения фиксированных строки и столбца сделайте равными 0. Задайте число строк и столбцов так, чтобы число ячеек таблицы равнялось числу файлов с картинками. В приведенном примере шесть файлов с изображениями, поэтому таблица имеет три столбца и две строки. Установите для компонента DrawGrid 1 следующие значения свойств.
В свойствах DrawGrid 1 найдите DefaultRowHeight и DefaultRowWidth и сделайте их значения такими, чтобы они были немного больше размеров растрового рисунка. Установите свойство
ScrollBars таблицы, равным ssNone. Оно означает – не вставлять полосы прокрутки.
В описание класса TForm 1 вставьте такое поле sBitMap:
public
sBitMap: TStringList;
Это поле будет использоваться для хранения картинок и текстовых строк. Его необходимо создать и наполнить в момент создания окна, и уничтожить при его уничтожении. Поэтому создайте следующие обработчики событий OnCreate и OnDestroy для формы:
procedure TForm1.FormCreate(Sender: TObject);
// Эта процедура создает и наполняет список slBitMap
const fname:array[0..5] of String=('Ананас.bmp','Вишня.bmp',
'Апельс.bmp','Яблоко.bmp','Арбуз.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, так как без него компонент не сможет заполнить пустые клетки каким-либо изображением или текстом.
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var k,w,wr: integer;
{Рисует картинку из sBitMap.Objects[k] и текст из sBitMap}
begin
// Уменьшаем высоту картинки для вывода под ней текста:
Rect.Bottom:=Rect.Bottom-DrawGrid1.Canvas.TextHeight('1') – 2;
// Пересчитываем координаты ячейки в индекс списка:
k:=2*ACol + ARow;
{ Рисуем картинки в ячейках, при этом картинка растягивается по ячейке, поэтому ячейки не делайте слишком большими }
DrawGrid1.Canvas.StretchDraw(Rect,(sBitMap.Objects[k] as TBitMap));
// Центрируем текст по горизонтали и выводим его
w:=DrawGrid1.Canvas.TextWidth(sBitMap[k]);
wr:= (Rect.Right – Rect.Left - w) div 2;
DrawGrid1.Canvas.TextOut(Rect.Left + wr, Rect.Bottom + 1,
sBitMap[k]);
end;
Дата добавления: 2015-08-20; просмотров: 44 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Метод обмена | | | Рисование в таблице TDrawGrid |