В обработчике события OnDrawCell элемента StringGrid поместите следующий код:

 

Code:

with (Sender as TStringGrid) do

with Canvas do

begin

   {...}

   Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);

   {...}

end;

  

Используйте метод Draw() или StretchDraw() класса TCanvas. Image1 - это TImage с предварительно загруженным в него bitmap-ом.

 

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids, StdCtrls;

 

type

TForm1 = class(TForm)

   StringGrid1: TStringGrid;

   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

     Rect: TRect; State: TGridDrawState);

   procedure FormCreate(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

const

cell_x = 2;

cell_y = 2;

 

var

Form1: TForm1;

CheckBox1: TCheckBox;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

var

r:trect;

begin

if(cell_x>=StringGrid1.LeftCol) and

  (cell_x<=StringGrid1.LeftCol+StringGrid1.VisibleColCount) and

  (cell_y>=StringGrid1.TopRow) and

  (cell_x<=StringGrid1.TopRow+StringGrid1.VisibleRowCount) then

    CheckBox1.Visible:=true

else

    CheckBox1.Visible:=false;

 

if (acol=cell_x) and (arow=cell_y) then

begin

  r:=stringgrid1.CellRect(cell_x,cell_y);

  r.Left:=r.left+stringgrid1.left+2;

  r.right:=r.right+stringgrid1.left+2;

  r.top:=r.top+stringgrid1.top+2;

  r.bottom:=r.bottom+stringgrid1.top+2;

  CheckBox1.BoundsRect:=r;

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

CheckBox1:=TCheckBox.Create(form1);

CheckBox1.parent:=form1;

CheckBox1.Caption:='proba';

end;

 

end.

 

 

Автор: SottNick

 

Если в таблице вы используете событие OnDrawCell для помещения в ячейку рисунка, причем различного, в зависимости, например, от соответствующего значения в двумерном массиве, и вам надо, чтобы после изменения значения в массиве обновилось изображение (Refresh не подходит, т.к. будет мелькать), то измените значение у ячейки (DrawGrid не годится):

 

Code:

StringGrid1.Cells[i,j]:='';

или

Code:

StringGrid1.Cells[i,j]:=StringGrid1.Cells[i,j];

если там что-то хранится

Code:

procedure TForm1.FormCreate(Sender: TObject);

begin

{Высоту combobox'а не изменишь, так что вместо combobox'а

будем изменять высоту строки grid'а !}

StringGrid1.DefaultRowHeight := ComboBox1.Height; {Спрятать combobox}

ComboBox1.Visible := False; ComboBox1.Items.Add('Delphi Kingdom');

ComboBox1.Items.Add('Королевство Дельфи');

end;

 

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

{Перебросим выбранное в значение из ComboBox в grid}

StringGrid1.Cells[StringGrid1.Col,

StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];

ComboBox1.Visible := False; StringGrid1.SetFocus;

end;

 

procedure TForm1.ComboBox1Exit(Sender: TObject);

begin

{Перебросим выбранное в значение из ComboBox в grid}

StringGrid1.Cells[StringGrid1.Col,

StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];

ComboBox1.Visible := False; StringGrid1.SetFocus;

end;

 

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,

ARow: Integer; var CanSelect: Boolean);

var

R: TRect;

begin

if ((ACol = 3) and (ARow <> 0)) then

begin

   {Ширина и положение ComboBox должно соответствовать ячейке StringGrid}

   R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;

   R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;

   R.Bottom := R.Bottom + StringGrid1.Top; ComboBox1.Left := R.Left + 1;

   ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left;

   ComboBox1.Height := (R.Bottom + 1) - R.Top; {Покажем combobox}

   ComboBox1.Visible := True; ComboBox1.SetFocus;

end;

CanSelect := True;

end;