在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
忽略对它的下一次调用。)
答案 0 :(得分:6)
正如问题评论中所述,您将自己为PeekMessage
提供“Msg”(var Msg: TMsg
)。但是丢弃触发OnTitleClick
的消息是不可能的,因为它是触发这两个事件的相同消息。如果已拖动列,VCL将执行列移动以响应WM_LBUTTONUP
消息。稍后在处理相同的消息期间OnTitleClick
被调用。
IOW,虽然您可以使用PeekMessage
从邮件队列中删除邮件,但由于我们位于OnTitleClick
处理程序中,因此已分派触发OnColumnMoved
的邮件。
最简单的方法就像你所说的那样设置旗帜。