powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Встраивание CheckBox в StringGrid
11 сообщений из 11, страница 1 из 1
Встраивание CheckBox в StringGrid
    #35588125
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не сочтите извращенцем...
Хочу сделать такую штуку:
На форме лежит сетка, число ячеек может меняться. С каждой ячейкой ассоциирован CheckBox. Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 procedure  TForm1.FormCreate(Sender: TObject);
 var 
  row, col: integer;
 begin 
   for  row:=  1   to  StringGrid1.RowCount -  1   do 
     for  col:=  1   to  StringGrid1.colCount -  1   do 
      StringGrid1.Objects[ 1 ,  1 ]:= TCheckBox.Create(form1);
 end ;

 procedure  TForm1.FormDestroy(Sender: TObject);
 var 
  row, col: integer;
 begin 
   for  row:=  1   to  StringGrid1.RowCount -  1   do 
     for  col:=  1   to  StringGrid1.colCount -  1   do 
       if  Assigned((StringGrid1.Objects[Col, Row]  as  TCheckBox))  then 
      (StringGrid1.Objects[Col, Row]  as  TCheckBox).Free;
 end ;

 procedure  TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
 var 
  R: TRect;
 begin 
   if  Assigned((StringGrid1.Objects[ACol, ARow]  as  TCheckBox))  then 
     begin 
      (StringGrid1.Objects[ACol, ARow]  as  TCheckBox).Visible:= true;
      R:= StringGrid1.CellRect(ACol,ARow);
      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 ;
      (StringGrid1.Objects[ACol, ARow]  as  TCheckBox).BoundsRect:= R;
      StringGrid1.Cells[ACol, ARow]:= (StringGrid1.Objects[ACol, ARow]  as  TCheckBox).Name;
     end ;
 end ;
Каждый CheckBox должен динамически создаваться и уничтожаться, так как заранее неизвестно, сколько их будет. Они привязываются к ячейкам сетки и выводятся.
Код (написан по мотивам изучения DRKB) выполняется, ни на что не ругается. Но чекбоксов невидно...
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #35588178
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, rockclimber!
You wrote on Fri, 10 Oct 08 11:22:23 GMT:

r> StringGrid1.Objects[1, 1]:= TCheckBox.Create(form1);

Парент ты ему не указал.

r> if Assigned((StringGrid1.Objects[Col, Row] as TCheckBox)) then
r> (StringGrid1.Objects[Col, Row] as TCheckBox).Free;

кастинг тут излишен.

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #35588325
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
Hello, rockclimber!
You wrote on Fri, 10 Oct 08 11:22:23 GMT:

r> StringGrid1.Objects[1, 1]:= TCheckBox.Create(form1);

Парент ты ему не указал.О! Точно! В примере было, только я как обычно прошляпил. Теперь работает.
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #35925867
Andreeey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это всё замечательно. Сам реализовал аналогичный код. Но есть одно "но" - если таблица со скроллом (т.е. отображаются не все записи), то при перемотке, галочки отображаются неверно. Например, если поставить галочку в первой строке, то при перемотке на n позиций вниз галочка будет стоять в n+1 строке.. Подскажите, как это можно исправить.
Я так понимаю, что событие OnDrawCell выполняется только для тех ячеек, которые вместились в отображаемую область. А при перемотке в этой области также остаются те CheckBox'ы, которые были на своих местах до перемотки.
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #36202930
bobapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я хранил в Objects 0 или 1 отрисовывал руками крестик и обрабатывал сообщение о нажатии на поле...

Но все это как то... неправильно...
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #36203106
scorpyx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreeeyЭто всё замечательно. Сам реализовал аналогичный код. Но есть одно "но" - если таблица со скроллом (т.е. отображаются не все записи), то при перемотке, галочки отображаются неверно. Например, если поставить галочку в первой строке, то при перемотке на n позиций вниз галочка будет стоять в n+1 строке.. Подскажите, как это можно исправить.
Я так понимаю, что событие OnDrawCell выполняется только для тех ячеек, которые вместились в отображаемую область. А при перемотке в этой области также остаются те CheckBox'ы, которые были на своих местах до перемотки.Если в таблице много строк, то на создание обьектов уходит куча времени, да и зачем создавать то что не отображается, достаточно создать столько чек боксов сколько строк у вас отображается на экране и в событии скроллинга их передвигать, и изменять их значения, ну если это не катит и вы всё же хотите создать чекбоксов столкьо скольо срок, то в событии скролинга делайте их нивидимыми.
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #36203117
Фотография Мигалка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создать один - для редактирования. остальные рисовать самому.
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #36206370
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух ты, мой старый топик подняли...
Я решал эту проблему с перерывами целый год, теперь у меня есть целый свой компонент (полудоделаный, зато кучу всего умеет, основные идеи сперты из excel), комбобоксов нет, есть только их имитация своими силами (выводится квадратик с галочкой на canvas).
Чем не нравились тру комбобоксы - при выставлении опции goThumbTracking при скроллировании верхняя ячейка как бы "заползает" под заголовок, а комбобокс заползать не хочет, потому что рисуется поверх грида. Я плюнул на это дело и рисую имитацию, которая вполне себе "заползает".

scorpyxЕсли в таблице много строк, то на создание обьектов уходит куча времени
Ага, а когда они на экране и их много (пару десятков), да еще если DoubleBuffered выключить, а goThumbTracking включить, то такая лажа получается в процессе скроллирования, аж смотреть противно.
...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #36329603
AlexyFFF0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не проще нарисовать рисунок типа CheckBox'а и просто делать в ячейке рисунок с крестиком (true) или без крестика (false)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Встраивание CheckBox в StringGrid
    #39746256
Tim Woo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дабы не плодить темы...

Добрый день уважаемые, помогите зафиксить код
Попытался сделать чекбоксы как описано вот тут, переделав под свои нужды: http://www.delphisources.ru/pages/faq/base/checkboxes_in_stringgrid.html

В моем гриде чекбоксы должны рисоваться во втором ряду с первой по последнюю колонку.
Все вроде бы работает. Но есть проблема:
При первой отрисовке и скроллинге колонка [0,j] принимает в себя чужие чекбоксы
[0,0] - чекбокс самой последней колонки
[fixed_col, 1] - чекбокс первой невидимой колонки
Скриншот чтоб было понятно: http://i.piccy.info/i9/0ef4b9da6ddba3ed1b75afdfc2519e08/1544547343/29709/1225901/Bezymiannyi.png

Как зафиксить неправильную отрисовку этих двух чекбоксов?

Код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
procedure TFormMain.GridCheckBoxClick(Sender: TObject);
var cb: TCheckBox;
begin
    cb := Sender as TCheckBox;
    ShowMessage(IntToStr(cb.Tag));
end;

procedure TFormMain.clean_previus_buffer;
var NewCheckBox: TCheckBox;
    i: Integer;
begin
  for i := 0 to Grid.ColCount do begin
    NewCheckBox := (Grid.Objects[i, 1] as TCheckBox);
    if (NewCheckBox <> nil) then begin
      NewCheckBox.Visible := false;
      Grid.Objects[i, 1].Free;
    end;
  end;
end;

procedure TFormMain.set_checkbox_alignment;
var NewCheckBox: TCheckBox;
    Rect: TRect;
    i: Integer;
begin
  for i := 1 to Data.nQ do begin
    NewCheckBox := (Grid.Objects[i, 1] as TCheckBox);
    if (NewCheckBox <> nil) then begin
      Rect := Grid.CellRect(i, 1); // получаем размер ячейки для чекбокса
      NewCheckBox.Left := Grid.Left + Rect.Left + 5;
      NewCheckBox.Top := Grid.Top + Rect.Top + 5;
      NewCheckBox.Width := 14;
      NewCheckBox.Height := 14;
      NewCheckBox.Visible := True;
    end;
  end;
end;

procedure TFormMain.GridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if not (gdFixed in State) then
    set_checkbox_alignment;
end;

procedure TFormMain.AddCheckBox(i : Word);
var NewCheckBox: TCheckBox;
begin
  NewCheckBox := TCheckBox.Create(Application);
  NewCheckBox.Width := 0;
  NewCheckBox.Visible := False;
  NewCheckBox.Color := clWindow;
  NewCheckBox.Tag := i;
  NewCheckBox.OnClick := GridCheckBoxClick; // Связываем событие OnClick с существующим
  NewCheckBox.Parent := Panel2;
  Grid.Objects[i, 1] := NewCheckBox;
  NewCheckBox.Checked := True;
end;

procedure TFormMain.FillMatrixGrid;
var i: Word;
begin
  with Grid do begin
    ColCount := Data.nQ + 2;  // 2 = Имена и Всего
    RowCount := Data.nM + 3;  // 2 = Индексы, Чекбоксы и Верные

    ColWidths[0] := 161;
    Cells[0,0] := 'Коды';
    ColWidths[ColCount-1] := 50;
    Cells[ColCount-1, 0] := 'Всего';
    clean_previus_buffer; // очищаем старые чекбоксы...
    for i := 1 to Data.nQ do begin
      Cells[i,0] := IntToStr(i);
      AddCheckBox(i);
    end;
    set_checkbox_alignment; // расположение чекбоксов в ячейках таблицы...
  end;
end;

...
Рейтинг: 0 / 0
Встраивание CheckBox в StringGrid
    #39746321
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно создавать миллион чекбоксов, нужно их просто рисовать в ячейках грида
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Встраивание CheckBox в StringGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]