КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
[Главная страница] [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.