При разработке программ в 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;
Создание и работа с текстовыми файлами в Delphi
Процедура MkDir в Delphi, описание и примеры
Изменение цвета ячеек Delphi Stringgrid
Тёмный Заяц
- 08 октября 2023, 00:03 ↓Антон
- 03 июля 2020, 21:36 ↓Уточните, картинка не вся выводится в ячейку или не помещается в нее? Картинка в данном примере выводится в исходном размере (физический размер). Поэтому важно подогнать размер ячейки под размер изображения.
Тигр 1488
- 03 июля 2020, 18:42 ↓Картинка вставляется но делится ровно попалам в ячейке