在 TDbGrid.OnColumnMoved
事件处理程序中,我调整了一些列标题颜色。
我还使用网格的 OnTitleClicked
事件来弹出一个(排序列)菜单。
不幸的是,在用户拖动列并完成 OnColumnMoved
后,VCL 调用 OnTitleClicked
。这意味着我的排序顺序弹出窗口会在拖动列后出现。
在 OnColumnMoved
中是否可以清除鼠标事件队列,以便 OnTitleClicked
不会被调用?
This thread有此代码,但我在 OnTitleClicked
中没有 Msg
。
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE or PM_NOYIELD) do;
(如果没有办法做到这一点,也没什么大不了的。我可以在 OnColumnMoved
中设置一个标志,以便 OnTitleClick
忽略对其的下一次调用。)
最佳答案
正如问题评论中提到的,您将为 PeekMessage
提供“消息”你自己(var Msg: TMsg
)。但丢弃触发OnTitleClick
的消息这是不可能的,因为触发这两个事件的是同一条消息。 VCL 执行列移动以响应 WM_LBUTTONUP
如果已拖动列,则显示消息。稍后在处理同一消息时 OnTitleClick
被调用。
IOW,虽然您可以使用 PeekMessage
从消息队列中删除消息,触发 OnTitleClick
的消息已经发送,因为我们处于 OnColumnMoved
处理程序。
最简单的方法看起来就像按照您所说设置标志。
关于delphi - 如何在 TDbGrid.OnColumnMoved 中放弃鼠标单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498746/