Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

6.1.4. Проект «Таблица рисунков»

Постановка задачи. Простейший проект знакомит с компонентом 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',

'Апельс.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;