gpt4 book ai didi

delphi - 当我执行 OnDblClick 事件 (Form1) 打开 Form2 时,它会触发 Form2 的 OnCellClick 事件,而无需单击 form2 网格

转载 作者:行者123 更新时间:2023-12-03 14:52:57 25 4
gpt4 key购买 nike

事件形式 1:

procedure TForm1.Panel1DblClick(Sender: TObject);
begin
TForm2.Create(Self).ShowModal;
end;

事件形式 2:

procedure TForm2.DBGrid1CellClick(Column: TColumn);
begin
ShowMessage('Test');
end;

我应该怎样做才能避免 fom2 的 onCellClick 事件?

最佳答案

操作系统在按下鼠标左键第二次时发布 WM_LBUTTONDBLCLK。当您在此处执行 ShowModal 调用时,应用程序在显示对话框之前没有机会处理尚未发布的 WM_LBUTTONUP 消息。由于 TDBGrid 在控件处理 WM_LBUTTONUP 消息时触发 OnCellClick 事件,并且该消息恰好被发布到网格,因为模式形式是现在事件窗口,您遇到问题。

网格的行为有点像 documented ;

Occurs when the user releases the mouse in one of the cells of the grid.

尽管有人可能会说它应该提到你甚至不必按鼠标按钮......

这是一个不幸的设计决定,这不是点击的工作原理。想象一下按下一个单元上的按钮并在另一个单元上松开。不应触发 OnCellClick。当前的行为相当令人困惑,该事件会在您按下按钮的单元格上触发 - 前提是您在有效单元格上而不是在空白区域上释放按钮。

正如您所发现的,您甚至可以通过按下不同表单上的按钮并将其释放到该表单上的网格单元格来触发事件。在这种情况下,事件会针对当前选定的单元格触发,而鼠标位置在其中根本不起任何作用。我的观点是 OnCellClick 完全是一团糟。



您可以使用kobik's answer寻求解决方案。如果由于某种原因在任何时间段内第二次按下鼠标按钮,则以下解决方案将失败。


正如问题评论中所建议的那样,发布自己收到的消息来延迟对话框的显示是行不通的,因为发布的消息比输入消息具有更高的优先级。请参阅documentation有关更多详细信息,请参阅 GetMessage

如果您点击链接,您会注意到计时器方法(也如问题评论中所建议的那样)将起作用。与评论不同的是,时间间隔并不重要,因为 WM_TIMER 消息具有最低优先级。这是一件好事,使其成为一种万无一失的方法。

我想将计时器放在模式对话框上,因为它拥有问题控制。

procedure TForm2.FormCreate(Sender: TObject);
begin
DBGrid1.Enabled := False;
Timer1.Interval := 1;
Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
DBGrid1.Enabled := True;
Timer1.Enabled := False;
end;

关于delphi - 当我执行 OnDblClick 事件 (Form1) 打开 Form2 时,它会触发 Form2 的 OnCellClick 事件,而无需单击 form2 网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54401270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com