Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
CheckBoxes в StringGrid

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay