如何捕获将TDBGrid作为其父级的按钮的单击事件?

时间:2009-04-14 15:43:28

标签: delphi vcl

我想在Delphi TDBGrid组件的左上角添加一个小按钮(在标题/标题单元格中)。我可以轻松地放置按钮,但现在不处理click事件。我猜这个事件被网格抓住了。我可以用任何方式强制这个特定事件转到按钮吗?注意我仍然需要网格来处理其标题按钮的点击事件,就像它目前一样。

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;
end;

**更新:**我发现我能够使用按钮的MouseDown事件似乎运行良好,但我无法使用点击事件。

procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if ( Button = mbLeft ) then
      TButton(Sender).Click;
end;

3 个答案:

答案 0 :(得分:1)

哇,这真是个顽强。 TDBGrid没有通用的“OnClick”事件处理程序,并且按钮的位置使得伪造它变得困难。我唯一能想到的就是创建自己的组件。这并不像最初听起来那么困难。从TDBGrid下降并覆盖MouseUp方法。看看TCustomDBGrid.MouseUp的实现方式。我没有测试过这个,但你可能会尝试这样的事情:在测试

的if语句之后
(cell.x >= FIndicatorOffset)

并触发点击事件,让它触发TitleClick(nil)或if if cell.x< FIndicatorOffset。然后将事件处理程序附加到网格的OnTitleClick事件,该事件调用Button1.Click如果Column = nil。 (是的,有点像黑客,但我想不出更简单的方法。如果我是你,我会把这个报告给QC作为一个错误。)

答案 1 :(得分:1)

我不确定为什么会吃点击消息。您实际上是通过MouseUp事件处理程序模拟click事件。

procedure TForm38.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ctrl: TButton;
begin
  ctrl := Sender as TButton;
  if (x > 0) and (x < ctrl.Width) and (y > 0) and (y < ctrl.Height)  then
    ctrl.Click;
end;

如果您测试一个普通按钮,您将看到在您释放鼠标之前不会发生单击事件。模拟按下按钮会产生奇怪的行为。

答案 2 :(得分:0)

以下是一个干净的解决方案,使用Delphi 1和Delphi 2007成功尝试:

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;

   // only add this line
   button1.ControlStyle := button1.ControlStyle + [csClickEvents];

end;