Картинки в осередках stringgrid delphi

При розробці програм в Delphi, дуже часто виникає необхідність в цілях дизайну або просто в рамках завдання, виводити графічну інформацію. У компоненті StringGrid. не дивлячись на назву, так само є можливість розміщувати малюнки. Якщо в рамках поставленого завдання, мова йде не про просте розфарбовуванні осередків StringGrid будь-яким кольором. а саме виведення зображення, для цього використовується властивість Canvas. Властивість Canvas має спеціальний метод, що дозволяє виводити графічні об'єкти в заданий координатами місце на компоненті.

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

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

Процедура виведення зображення виконується в подію "малювання" осередки OnDrawCell. У цій процедурі нам потрібно:

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

- вибрати комірку, в яку вивести зображення;

У підсумку, повинен вийти подібний програмний код:

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, то слід підключити відповідну бібліотеку:

Ще матеріали з цього розділу