题
我有一个小按钮我要添加到一个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;
不隶属于 StackOverflow