Delphi

КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"

[Главная страница] [Delphi] [Контакты]

Загрузка BMP файлов в StringGrid


Попробуем собрать в сетку картинки из набора 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;

Как видно из кода, в момент создания формы решаются следующие задачи:

  • поиск всех файлов картинок (*.bmp) в каталоге, определенном переменной BmpPath;
  • запись имени файла в ячейку сетки
  • создание объекта класса TBitmap с одновременной установкой ссылки на этот объект в ячейке сетки строк;
  • загрузка изображения в объект;
  • переход к новой ячейке.

В исходном коде есть функции 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.

grid1

Источник: Д.Осипов - Delphi. Профессиональное программирование.

Исходный код здесь. Выполнен на Delphi XE.