我想在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;
答案 0 :(得分:1)
(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;