Delphi 如何在TDbGrid.OnColumnMoved中放弃鼠标单击
在Delphi 如何在TDbGrid.OnColumnMoved中放弃鼠标单击,delphi,delphi-2010,Delphi,Delphi 2010,在TDbGrid.OnColumnMoved事件处理程序中,我调整了一些列标题的颜色 我还使用网格的OnTitleClicked事件弹出一个(排序列)菜单 不幸的是,在用户拖动列并完成OnColumnMoved之后,VCL调用OnTitleClicked。这意味着在拖动列后会出现“我的排序顺序”弹出窗口 在OnColumnMoved中是否有方法可以清除鼠标事件队列,以便不会调用OnTitleClicked 有此代码,但我在OnTitleClicked中没有Msg while PeekMessag
TDbGrid.OnColumnMoved
事件处理程序中,我调整了一些列标题的颜色
我还使用网格的OnTitleClicked
事件弹出一个(排序列)菜单
不幸的是,在用户拖动列并完成OnColumnMoved
之后,VCL调用OnTitleClicked
。这意味着在拖动列后会出现“我的排序顺序”弹出窗口
在OnColumnMoved
中是否有方法可以清除鼠标事件队列,以便不会调用OnTitleClicked
有此代码,但我在OnTitleClicked
中没有Msg
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE or PM_NOYIELD) do;
(如果没有办法,那也没什么大不了的。我可以在
OnColumnMoved
中设置一个标志,这样OnTitleClick
就会忽略对它的下一个调用。)如问题的评论中所述,您可以为自己提供peek消息的“Msg”(var Msg:TMsg
)。但是不可能丢弃触发OnTitleClick
的消息,因为触发这两个事件的是同一条消息。如果列被拖动,VCL将根据WM_LBUTTONUP
消息执行列移动。稍后在处理同一消息的过程中,将调用OnTitleClick
注意,虽然您可以使用PeekMessage
从消息队列中删除消息,但触发OnTitleClick
的消息已被调度,因为我们处于OnColumnMoved
处理程序中
最简单的方法看起来像是按照您所说的那样设置标志。您知道您可以声明自己的Msg:tagMsg
(或TMsg')变量,并在调用PeekMessage`时使用它?不要认为这是答案,但仅供参考…嗯-不是每个OnColumnMoved事件都会为我触发OnTitleClick事件(Delphi 10.1),因此该标志不可靠。我可以使用计时器,因此如果OnTitleClick在OnColumnMoved的0.25秒内发生,它将被忽略。但这就像用大锤杀死跳蚤一样。对此有进一步的想法吗?