Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как добавить TCheckBox в TStringGrid?

01.01.2007

Автор: Joel E. Cant.

Пример демонстрирует добавление любого количества чекбоксов в StringGrid. В этом примере необходимо добавить TPanel, а в саму панель включить TstringGrid. Так же необходимо добавить невидимый TcheckBox на форму. Затем добавьте5 колонок и 4 строки в объект StringGrid.

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 
ShowMessage('There it is!!');
end;
 
// Заполняем заголовок StringGrid
procedure TForm1
.FormCreate(Sender: TObject);
begin
 StringGrid1
.Cells[0,0] := 'A Simple';
 StringGrid1
.Cells[1,0] := 'Way';
 StringGrid1
.Cells[2,0] := 'To';
 StringGrid1
.Cells[3,0] := 'Do It';
 StringGrid1
.Cells[4,0] := 'Check !!';
 
AddCheckBoxes; // добавляем чекбоксы...
end;
 
procedure TForm1
.AddCheckBoxes;
 
var i: Integer;
     
NewCheckBox: TCheckBox;
begin
  clean_previus_buffer
; // очищаем неиспользуемые чекбоксы...
 
for i := 1 to 4 do
 
begin
    StringGrid1
.Cells[0,i] := 'a';
    StringGrid1
.Cells[1,i] := 'b';
    StringGrid1
.Cells[2,i] := 'c';
    StringGrid1
.Cells[3,i] := 'd';
   
NewCheckBox := TCheckBox.Create(Application);
   
NewCheckBox.Width := 0;
   
NewCheckBox.Visible := false;
   
NewCheckBox.Caption := 'OK';
   
NewCheckBox.Color := clWindow;
   
NewCheckBox.Tag := i;
   
NewCheckBox.OnClick := CheckBox1.OnClick; //Связываем предыдущее событие OnClick
                                             
// с существующим TCheckBox
   
NewCheckBox.Parent := Panel1;
    StringGrid1
.Objects[4,i] := NewCheckBox;
    StringGrid1
.RowCount := i;
 
end;
  set_checkbox_alignment
; // расположение чекбоксов в ячейках таблицы...
end;
 
Procedure TForm1.clean_previus_buffer;
 
var NewCheckBox: TCheckBox;
      i
: Integer;
begin
 
for i := 1 to StringGrid1.RowCount do
   
begin
   
NewCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
   
if NewCheckBox <> nil then
     
begin
       
NewCheckBox.Visible := false;
        StringGrid1
.Objects[4,i] := nil;
     
end;
   
end;
end;
 
Procedure TForm1.set_checkbox_alignment;
 
var NewCheckBox: TCheckBox;
     
Rect: TRect;
      i
: Integer;
begin
 
for i := 1 to StringGrid1.RowCount do
   
begin
     
NewCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
     
if NewCheckBox <> nil then
       
begin
         
Rect := StringGrid1.CellRect(4,i); // получаем размер ячейки для чекбокса
         
NewCheckBox.Left := StringGrid1.Left + Rect.Left+2;
         
NewCheckBox.Top := StringGrid1.Top + Rect.Top+2;
         
NewCheckBox.Width := Rect.Right - Rect.Left;
         
NewCheckBox.Height := Rect.Bottom - Rect.Top;
         
NewCheckBox.Visible := True;
       
end;
   
end;
end;
 
procedure TForm1
.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
 
if not (gdFixed in State) then set_checkbox_alignment;
end;

Взято из https://forum.sources.ru