Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Встраивание CheckBox в StringGrid / 11 сообщений из 11, страница 1 из 1
10.10.2008, 14:22
    #35588125
rockclimber
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание CheckBox в StringGrid
Не сочтите извращенцем...
Хочу сделать такую штуку:
На форме лежит сетка, число ячеек может меняться. С каждой ячейкой ассоциирован 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
10.10.2008, 14:37
    #35588178
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание CheckBox в StringGrid
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
10.10.2008, 15:10
    #35588325
rockclimber
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание CheckBox в StringGrid
Мимопроходящий
Hello, rockclimber!
You wrote on Fri, 10 Oct 08 11:22:23 GMT:

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

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

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

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

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


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