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的消息。

最简单的方法就像您已经讲过的那样设置标志。

10-05 22:26