Delphi - база знаний

       

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


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



Компилятор: Delphi

Автор: 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;

Взято с Исходников.ru



Содержание раздела