КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
[Главная страница] [Delphi] [Контакты]
Попробуем собрать в сетку картинки из набора Delphi 7 (по умолчанию они расположены в каталоге C:\Program Files\Common Files\Borland Shared\Images\Buttons). Для этого откройте новый проект и разместите в нем сетку строк TStringGrid. Проведите с ее свойствами следующие манипуляции:
ColCount := 10; RowCount = 20; Align := alClient;
DefaultColWidth := 75;
DefaultRowHeight := 50; FixedCols := 0; FixedRows := 0;
Теперь вернитесь к форме, найдите в Инспекторе объектов событие OnCreate() и опишите его, как предложено в листинге:
Листинг 1.
procedure TForm1.FormCreate(Sender: TObject);
var
BmpPath: string;
SR: TSearchRec;
i, aCol, aRow: Integer;
BMP: TBitmap;
begin
BmpPath := 'c:\Program Files\Common Files\Borland Shared\Images\Buttons\';
aCol := 0;
aRow := 0;
i := FindFirst(BmpPath + '*.bmp', faAnyFile, SR);
while i = 0 do
begin
StringGrid1.Cells[aCol, aRow] := SR.Name;
BMP := TBitmap.Create; // создаем объект
StringGrid1.Objects[aCol, aRow] := BMP; // связываем объект с ячейкой
with StringGrid1.Objects[aCol, aRow] as TBitmap do
LoadFromFile(BmpPath + SR.Name);
aCol := aCol + 1;
if aCol > StringGrid1.ColCount - 1 then
begin
aRow := aRow + 1;
aCol := 0;
end;
i := FindNext(SR);
end;
FindClose(SR);
end;
Как видно из кода, в момент создания формы решаются следующие задачи:
В исходном коде есть функции FindFirst(), FindNext() и FindClose(), применяемые для поиска файлов и каталогов.
Обратимся к событию, отвечающему за прорисовку ячеек сетки:
Листинг 2.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if StringGrid1.Objects[ACol, ARow] is TBitmap then
with StringGrid1.Canvas do
Draw(Rect.Left + 15, Rect.Top + 20, TBitmap(StringGrid1.Objects[ACol, ARow]));
end;
Этих двух процедур было бы вполне достаточно для сбора и отображения картинок, но следуя правилу, принятому в Delphi, необходимо обеспечить уничтожение созданных нами объектов.
![]() |
Внимание Еще раз акцентирую внимание на том, что сетка хранит не сами объекты, а только ссылки на них, и с уничтожением таблицы созданные вами объекты не разрушаются. Ответственность за их уничтожение лежит на программисте. |
В обработчике события OnCreate() формы проекта мы создаем несколько десятков объектов TBitmap. Предлагаю освободить занимаемые ресурсы в момент закрытия формы.
Листинг 3.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
aCol, aRow: Integer;
begin
for aCol := 0 to StringGrid1.ColCount - 1 do
begin
for aRow := 0 to StringGrid1.RowCount - 1 do
begin
if StringGrid1.Objects[aCol, aRow] is TBitmap then
with StringGrid1.Objects[aCol, aRow] as TBitmap do Free;
end;
end;
end;
Если пример был повторен правильно, ячейки сетки заполнятся рисунками из коллекции Delphi.

Источник: Д.Осипов - Delphi. Профессиональное программирование.
Исходный код здесь. Выполнен на Delphi XE.