|
Вопрос # 3 145/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Сделал отрисовку чекбоксов в StringGride.
Свойство Parent у чекбоксов делаю StringGrid.
Но при нажатии на чекбокс - ничего не происходит (галочка не ставится\не убирается).
Если в Parent чекбокса ставить, например, форму, то галочки ставятся, но представляется затруднительным отловить в какой ячейке произошел щелчок.
Вообще конечная цель - при нажатии на чекбокс отлавливать в какой именно ячейке было нажатие.
Может кто-нибудь посоветует альтернативные решения.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Grids, StdCtrls;
-
- type
- TF = class(TForm)
- StringGrid1: TStringGrid;
- procedure FormCreate(Sender: TObject);
- procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
- Rect: TRect; State: TGridDrawState);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- F: TF;
- cb: array[0..200] of TCheckBox;
-
- implementation
-
- {$R *.dfm}
-
- procedure TF.FormCreate(Sender: TObject);
- var row,col:Integer;
- begin
-
- for row:= 1 to StringGrid1.RowCount - 1 do
- begin
- cb[row]:=TCheckBox.Create(F);
- cb[row].Parent:=StringGrid1;
- cb[row].Visible:=true;
- cb[row].OnClick:=StringGrid1.OnClick;
- StringGrid1.Objects[1,row]:= cb[row];
-
- end;
-
- end;
-
- procedure TF.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 + 4;
- (StringGrid1.Objects[ACol, ARow] as TCheckBox).BoundsRect:= R;
- end;
-
-
- end;
-
-
-
- end.
-
 |
Вопрос задал: HotMan (статус: Посетитель)
Вопрос отправлен: 2 сентября 2009, 13:46
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 3 сентября 2009, 10:54; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 2 сентября 2009, 13:59 [#1]:
Там вся проблема в том, что StringGrid не совсем корректно обрабатывает сообщения от Windows. у него и перехватом клавиш тоже проблемы есть.
Наиболее правильный способ, как по мне - это рисовать чекбоксы в клеточках, а не вставлять целый компонент (представьте себе, что клеток несколько тысяч...). А при клике по ячейке просто отрисовывать в правильном положении.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 2 сентября 2009, 14:32 [#2]:
Да, я также делал в DrawGrid - рисовал скриншоты чекбоксов. Очень неплохо, могу прислать скриншот. У меня каждой строке соответствовал объект одного класса, у которого есть свойство Checked: Boolean. На OnDrawCell я просто по if Объект.Checked брал из TImageList нужную пикчу и отрисовывал её на ячейке.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|