在TDbGrid.OnColumnMoved
事件处理程序中,我调整了一些列标题的颜色。
我还使用网格的OnTitleClicked
事件来弹出(排序列)菜单。
不幸的是,在用户拖动列并且完成OnColumnMoved
之后,VCL调用OnTitleClicked
。这意味着我的排序顺序弹出窗口会在拖动列后出现。
我可以清除OnColumnMoved
中的一种方法来清除鼠标事件队列,以便不调用OnTitleClicked
吗?
This thread有此代码,但我在Msg
中没有OnTitleClicked
。
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE or PM_NOYIELD) do;
(如果没有办法这样做,没什么大不了的。我可以在
OnColumnMoved
中设置一个标志,以便OnTitleClick
忽略对其的下一次调用。) 最佳答案
如对问题的评论中所述,您将自己为PeekMessage
(var Msg: TMsg
)提供“Msg”。但是不可能丢弃触发OnTitleClick
的消息,因为它是引发两个事件的同一消息。如果已拖动列,则VCL响应WM_LBUTTONUP
消息执行列移动。稍后,在处理同一消息时,将调用OnTitleClick
。
IOW,尽管您可以使用PeekMessage
从消息队列中删除消息,但是由于我们在OnTitleClick
处理程序中,因此已经分发了触发OnColumnMoved
的消息。
最简单的方法就像您已经讲过的那样设置标志。