Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 145

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Сделал отрисовку чекбоксов в StringGride.

Свойство Parent у чекбоксов делаю StringGrid.
Но при нажатии на чекбокс - ничего не происходит (галочка не ставится\не убирается).

Если в Parent чекбокса ставить, например, форму, то галочки ставятся, но представляется затруднительным отловить в какой ячейке произошел щелчок.

Вообще конечная цель - при нажатии на чекбокс отлавливать в какой именно ячейке было нажатие.
Может кто-нибудь посоветует альтернативные решения.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Grids, StdCtrls;
  8.  
  9. type
  10. TF = class(TForm)
  11. StringGrid1: TStringGrid;
  12. procedure FormCreate(Sender: TObject);
  13. procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  14. Rect: TRect; State: TGridDrawState);
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20.  
  21. var
  22. F: TF;
  23. cb: array[0..200] of TCheckBox;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. procedure TF.FormCreate(Sender: TObject);
  30. var row,col:Integer;
  31. begin
  32.  
  33. for row:= 1 to StringGrid1.RowCount - 1 do
  34. begin
  35. cb[row]:=TCheckBox.Create(F);
  36. cb[row].Parent:=StringGrid1;
  37. cb[row].Visible:=true;
  38. cb[row].OnClick:=StringGrid1.OnClick;
  39. StringGrid1.Objects[1,row]:= cb[row];
  40.  
  41. end;
  42.  
  43. end;
  44.  
  45. procedure TF.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  46. Rect: TRect; State: TGridDrawState);
  47. var
  48. R: TRect;
  49. begin
  50. if Assigned((StringGrid1.Objects[ACol, ARow] as TCheckBox)) then
  51. begin
  52. //(StringGrid1.Objects[ACol, ARow] as TCheckBox).Visible:= true;
  53. R:= StringGrid1.CellRect(ACol,ARow);
  54. R.Left:= R.Left + StringGrid1.Left + 4;
  55. (StringGrid1.Objects[ACol, ARow] as TCheckBox).BoundsRect:= R;
  56. end;
  57.  
  58.  
  59. end;
  60.  
  61.  
  62.  
  63. end.
  64.  


HotMan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: HotMan (статус: Посетитель)
Вопрос отправлен: 2 сентября 2009, 13:46
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 3 сентября 2009, 10:54; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 2 сентября 2009, 13:59 [#1]:

Там вся проблема в том, что StringGrid не совсем корректно обрабатывает сообщения от Windows. у него и перехватом клавиш тоже проблемы есть.
Наиболее правильный способ, как по мне - это рисовать чекбоксы в клеточках, а не вставлять целый компонент (представьте себе, что клеток несколько тысяч...). А при клике по ячейке просто отрисовывать в правильном положении.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 2 сентября 2009, 14:32 [#2]:

Да, я также делал в DrawGrid - рисовал скриншоты чекбоксов. Очень неплохо, могу прислать скриншот. У меня каждой строке соответствовал объект одного класса, у которого есть свойство Checked: Boolean. На OnDrawCell я просто по if Объект.Checked брал из TImageList нужную пикчу и отрисовывал её на ячейке.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
HotMan

HotMan (статус: Посетитель), 3 сентября 2009, 10:54 [#3]:

Вот нашел вариант, правда у полученного чекбокса не понятно как обрабатывать OnClick, но это не так страшно, ибо можно обрабатывать OnClick у StringGrid'а:

procedure TF.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var r:TRect;
begin
if(ACol=2)and(ARow=2) then
begin
r := Rect;
r.left:=r.left+sg.ColWidths[ACol] div 2-5;
r.top:=Rect.Top;
r.right := r.left + 14;
r.bottom := r.top + 20;
DrawFrameControl(sg.Canvas.Handle, r, DFC_BUTTON, {DFCS_BUTTONRADIO and} DFCS_CHECKED);
//StringGrid1.Canvas.TextOut(r.right+2, r.top-2, '');
end;
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.03 сек.