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

Автор: 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. := StringGrid1. + Rect.+2;

  NewCheckBox.Width := Rect.Right - Rect.Left;

  NewCheckBox.Height := Rect.Bottom - Rect.;

  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;

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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...