3

我有一个小按钮,我想添加到 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;
4

3 回答 3

1

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

(cell.x >= FIndicatorOffset)

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

于 2009-04-14T16:14:14.140 回答
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;

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

于 2009-04-14T16:38:59.760 回答
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;
于 2009-04-15T07:11:13.407 回答