![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CheckBox на заголовке Grid а [D5]
hoper © (2003-01-17 23:23:00)возможно ли поместить checkbox на заголовок грида (Grid/DBGrid)?
DrawFrameControl с Rect, принадлежащим заголовку не работает (Control рисуется, но при первой возможности стирается)
hoper (2003-01-24 01:12:00) [1]?
hoper (2003-01-23 02:45:00) [2]Спасибо, danilka, это к stringgrid"у, как-нибудь пригодится.
А как быть с dbgrid"ом, то есть как в общих чертах должна выглядеть процедура обработки сообщений компонента?
в голову пришло ниженаписанное, но в этом явно что-то не так:
if Message.Msg = WM_Paint then
begin
WndProc(Message);
//добавление checkbox"a
//и прочие действия
end
else
WndProc(Message);
видимо, вызывается WndProc формы, а не грида
делать наследника не очень хочется, т.к. придётся делать много изменений, к тому же, интересно разобраться с windowproc
только, блин, не ругайтесь, я впервые сталкиваюсь с обработкой сообщений
danilka (2003-01-21 10:11:00) [3]да, с учетом заголовков, процедура StringGrid1DrawCell выглядит вот-так:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
r:trect;
begin
if (cell_x=0) and (cell_y=0) then CheckBox1.Visible:=true else begin
if (cell_x=0) then CheckBox1.Visible:=(cell_y>=StringGrid1.TopRow) and
(cell_y<=StringGrid1.TopRow+StringGrid1.VisibleRowCount);
if (cell_y=0) then CheckBox1.Visible:=(cell_x>=StringGrid1.LeftCol) and
(cell_x<=StringGrid1.LeftCol+StringGrid1.VisibleColCount);
if (cell_x>0) and (cell_y>0) then begin
CheckBox1.Visible:=(cell_x>=StringGrid1.LeftCol) and
(cell_x<=StringGrid1.LeftCol+StringGrid1.VisibleColCount) and
(cell_y>=StringGrid1.TopRow) and
(cell_y<=StringGrid1.TopRow+StringGrid1.VisibleRowCount);
end;
end;
if (acol=cell_x) and (arow=cell_y) then begin
r:=stringgrid1.CellRect(cell_x,cell_y);
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;
CheckBox1.BoundsRect:=r;
end;
end;
danilka (2003-01-21 09:54:00) [4]компонены есть, куча великая, только они либо платные, либо кривые, лучше самому нарисовать.
а вообще, посмотри код, вроде катит без проблем. накатал на скорую руку, могут быть глюки.
рисуешь форму, ложишь на нее tstringgrid, по-умолчанию он обзовется как stringgrid1, вставляешь этот код и все.
const
cell_x=2; cell_y=3; //ячейка, с чекбоксом
var
Form1: TForm1;
CheckBox1: TCheckBox;
implementation
{$R *.DFM}
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
r:trect;
begin
if (cell_x>=StringGrid1.LeftCol) and
(cell_x<=StringGrid1.LeftCol+StringGrid1.VisibleColCount) and
(cell_y>=StringGrid1.TopRow) and
(cell_x<=StringGrid1.TopRow+StringGrid1.VisibleRowCount) then
CheckBox1.Visible:=true else CheckBox1.Visible:=false;
if (acol=cell_x) and (arow=cell_y) then begin
r:=stringgrid1.CellRect(cell_x,cell_y);
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;
CheckBox1.BoundsRect:=r;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckBox1:=TCheckBox.Create(form1);
CheckBox1.parent:=form1;
CheckBox1.Caption:="proba pera";
end;
Кулюкин Олег (2003-01-21 08:55:00) [5]Либо написать свой компонент - наследник грида, там Вам будет доступна обработка отрисовки заголовокв, либо подменить WindowProc у грида, ждать собщения WM_Paint и отрисовывать все ручками.
А зачем там чекбокс?
hoper (2003-01-21 03:07:00) [6]может, есть компонент с такой фичей?
hoper (2003-01-21 03:06:00) [7]нет?