【问题标题】:How do I catch the click event of a button who has a TDBGrid as its parent?如何捕获以 TDBGrid 作为其父级的按钮的单击事件?
【发布时间】:2009-04-14 15:43:28
【问题描述】:

我有一个小按钮要添加到 Delphi TDBGrid 组件的左上角(在标题/标题单元格中)。我可以轻松放置按钮,但现在未处理单击事件。我猜这个事件被网格捕获了。有什么办法可以强制此特定事件转到按钮?请注意,我仍然需要网格来处理其标题按钮的点击事件,就像现在一样。

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 事件,这似乎工作得很好,但我不能使用 click 事件。

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

【问题讨论】:

  • 鼠标点击时按钮是否按下?
  • 当然可以。但是点击事件并没有发生。您可以使用调试 DCU 对其进行测试。在 TCustomButton.Click 上放置一个断点,您会看到该例程永远不会被调用。

标签: delphi vcl


【解决方案1】:

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

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;

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

【讨论】:

  • 谢谢吉姆。我将其更改为使用 MouseUp 事件。 MouseDown 有效,但实际上并不会显示按下的按钮,这有点奇怪,你们密切关注它。
【解决方案2】:

哇,这是一个顽固的人。 TDBGrid 没有通用的“OnClick”事件处理程序,并且您的按钮的位置使其难以伪造。我唯一能想到的就是创建自己的组件。这并不像一开始听起来那么困难。从 TDBGrid 下降并覆盖 MouseUp 方法。看一下 TCustomDBGrid.MouseUp 的实现方式。我还没有对此进行测试,但您可能可以尝试这样的事情:在测试的 if 语句之后

(cell.x >= FIndicatorOffset)

并触发点击事件,如果 cell.x

【讨论】:

    【解决方案3】:

    以下是一个干净的解决方案,在 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      相关资源
      最近更新 更多