Rob*_*ank 6 delphi delphi-2010
在TDbGrid.OnColumnMoved事件处理程序中,我调整了一些列标题颜色.
我还使用网格的OnTitleClicked事件来弹出(排序列)菜单.
不幸的是,在用户拖动列并OnColumnMoved完成后,VCL调用OnTitleClicked.这意味着在列拖动后会出现我的排序顺序弹出窗口.
有没有办法OnColumnMoved可以清除鼠标事件队列,以免OnTitleClicked被调用?
这个线程有这个代码,但我没有Msg在OnTitleClicked.
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE or PM_NOYIELD) do;
Run Code Online (Sandbox Code Playgroud)
(如果没有办法做到这一点,那就不大了.我可以设置一个标志,OnColumnMoved以便OnTitleClick忽略下一次调用.)
正如对问题的评论中所提到的,您将为PeekMessage自己(var Msg: TMsg)提供"Msg" .但丢弃触发的消息OnTitleClick是不可能的,因为它是触发两个事件的相同消息.WM_LBUTTONUP如果已拖动列,VCL将执行列移动以响应消息.稍后在处理相同的消息时OnTitleClick调用.
IOW,虽然您可以从消息队列中删除消息,但由于我们处于处理程序中PeekMessage,OnTitleClick因此已经调度了触发消息OnColumnMoved.
最简单的方法就像你告诉你的那样设置旗帜.