如何赶上一个按钮,谁拥有的TDBGrid作为其父的单击事件?

StackOverflow https://stackoverflow.com/questions/748190

  •  09-09-2019
  •  | 
  •  

我有一个小按钮我要添加到一个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;
有帮助吗?

解决方案

我不知道为什么它吃的点击消息。实际上,你通过模拟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;

如果您测试一个正常的按钮,您将看到Click事件不会发生,直到你松开鼠标。模拟按钮点击向下创建古怪的行为。

其他提示

哇,这是一个恶棍。 TDBGrid中没有一个通用的“点击”事件处理程序,您的按钮的位置,让人难以伪造它。我能想到的唯一的事情就是创建自己的组件。这并不困难,因为它听起来在第一。从TDBGrid中下降并重写的MouseUp方法。看看TCustomDBGrid.MouseUp的实现方式。我没有测试过这一点,但你也许可以尝试这样的:对于

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

和打完点击事件,有它火TitleClick(无)或东西,如果cell.x

用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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top