如何在TDbGrid.OnColumnMoved中放弃鼠标单击

时间:2011-12-14 02:03:17

标签: delphi delphi-2010

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忽略对它的下一次调用。)

1 个答案:

答案 0 :(得分:6)

正如问题评论中所述,您将自己为PeekMessage提供“Msg”(var Msg: TMsg)。但是丢弃触发OnTitleClick的消息是不可能的,因为它是触发这两个事件的相同消息。如果已拖动列,VCL将执行列移动以响应WM_LBUTTONUP消息。稍后在处理相同的消息期间OnTitleClick被调用。

IOW,虽然您可以使用PeekMessage从邮件队列中删除邮件,但由于我们位于OnTitleClick处理程序中,因此已分派触发OnColumnMoved的邮件。

最简单的方法就像你所说的那样设置旗帜。