Вставка объектов в ячейки
В обработчике события 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-ом.
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
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.
|
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
Автор: SottNick
Если в таблице вы используете событие OnDrawCell для помещения в ячейку рисунка, причем различного, в зависимости, например, от соответствующего значения в двумерном массиве, и вам надо, чтобы после изменения значения в массиве обновилось изображение (Refresh не подходит, т.к. будет мелькать), то измените значение у ячейки (DrawGrid не годится):
Code: |
StringGrid1.Cells[i,j]:=''; |
или
Code: |
StringGrid1.Cells[i,j]:=StringGrid1.Cells[i,j]; |
если там что-то хранится
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки
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;
|
- Подробности
- Родительская категория: StringGrid
- Категория: Вставка объектов в ячейки