СтатьиПрограммирование в Delphi

Картинки в ячейках StringGrid Delphi

При разработке программ в Delphi, очень часто возникает необходимость в целях дизайна или просто в рамках задачи, выводить графическую информацию. В компоненте StringGrid, не смотря на название, так же есть возможность размещать рисунки. Если в рамках поставленной задачи, речь идет не о простом раскрашивании ячеек StringGrid каким-либо цветом, а именно вывод изображения, для этого используется свойство Canvas. Свойство Canvas имеет специальный метод, позволяющий выводить графические объекты в заданное координатами место на компоненте.

Canvas.StretchDraw (const Rect: TRect; Graphic: TGraphic);

Данный метод размещает изображение в указанном координатами прямоугольнике (параметр Rect), увеличивая или уменьшая его по вертикали и горизонтали. В параметре Graphic указывается выводимое изображение. Если размеры контейнера для вывода не пропорциональны исходному рисунку, то изображение может быть искажено.

Процедура вывода изображения выполняется в событии "рисования" ячейки OnDrawCell. В этой процедуре нам нужно:

- загрузить рисунок из внешнего файла в графическую переменную;

- выбрать ячейку, в какую вывести изображение;

- назначить подходящий размер ячейки StringGrid, пропорционально изображению;

- выполнить отрисовку.

В итоге, должен получиться подобный программный код:

procedure TMyForm.MyStringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
img: TPicture;
begin
// создание графического объекта
img := TPicture.Create;

// загрузка в графическую переменную изображения из внешнего файла
img.LoadFromFile('001.bmp');

// условие, определяющее нужную ячейку
if ((ACol = 1) and (ARow = 1)) then begin

// назначение размера ячейки по ширине и высоте
MyStringGrid.ColWidths[ACol] := img.Width;
MyStringGrid.RowHeights[ARow] := img.Height;

// вывод рисунка в текущей ячейке
MyStringGrid.Canvas.StretchDraw(Rect, img.Graphic);
end;
end;

Иногда изображение слишком велико, для вывода в ячейку, тогда его следует пропорционально уменьшить, назначив ширине и высоте ячеек меньший размер:

StringGrid1.ColWidths[1]:=Picture.Width div 2; // назначить ширину ячейки в 2 раза меньше рисунка
StringGrid1.RowHeights[1]:=Picture.Height div 2; // назначить высоту ячейки в 2 раза меньше рисунка

Если, например, есть фиксированная ширина ячейки, то нужно подогнать высоту в соответствии с отношениями сторон рисунка:

MyStringGrid.ColWidths[1] := 200;
MyStringGrid.RowHeights[1] := MyStringGrid.ColWidths[1] * (img.Width div img.Height);

В примере выше использован рисунок формата BMP. Если нужно использовать рисунок JPG, то следует подключить соответствующую библиотеку:

uses
JPEG;


Комментарии

03.04.2016 16:30 Зимфира [гость]
Спасибо большое
14.07.2016 16:17 Энди [гость]
Занимаясь темой много чего пересмотрел, и мои впечатление - отличные статьи по гриду, и вообще - отличный сайт! Все лаконично и по делу. Автору респекты
Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Сколько ножек у трeхногого табурета? (цифра)