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

标签 delphi delphi-2010

TDbGrid.OnColumnMoved 事件处理程序中,我调整了一些列标题颜色。

我还使用网格的 OnTitleClicked 事件来弹出一个(排序列)菜单。

不幸的是,在用户拖动列并完成 OnColumnMoved 后,VCL 调用 OnTitleClicked。这意味着我的排序顺序弹出窗口会在拖动列后出现。

OnColumnMoved 中是否可以清除鼠标事件队列,以便 OnTitleClicked 不会被调用?

This thread有此代码,但我在 OnTitleClicked 中没有 Msg

while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, 
  PM_REMOVE or PM_NOYIELD) do;

(如果没有办法做到这一点,也没什么大不了的。我可以在 OnColumnMoved 中设置一个标志,以便 OnTitleClick 忽略对其的下一次调用。)

最佳答案

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

IOW,虽然您可以使用 PeekMessage 从消息队列中删除消息,触发 OnTitleClick 的消息已经发送,因为我们处于 OnColumnMoved处理程序。

最简单的方法看起来就像按照您所说设置标志。

关于delphi - 如何在 TDbGrid.OnColumnMoved 中放弃鼠标单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498746/

相关文章:

delphi - FNV的实现

delphi - 将泛型类型的成员强制转换为 TObject?

listview - 为什么ListView会忽略自定义绘图中的字体和画笔设置?

delphi - Delphi 的 TWAIN 扫描组件

string - 为什么我无法在 RichEdit 控件 (Delphi) 中插入逗号加空格

delphi - 使用大的 TObjectList 并释放未使用的部分

delphi - 获取给定 DLL、EXE 或 BPL 所需的 BPL 列表

delphi - 属性不继承?

delphi - 使用编译器指令更改用户变量?

delphi - delphi中子窗体中的消息显示