4

我有一个 Delphi 6 应用程序,其 TListBox 控件设置为 lbOwnerDrawVariable。在运行时,我将单个字符串添加到列表框中。我有 OnMeasureItem() 和 OnDrawItem() 的事件处理程序,我在每个事件处理程序的第一行代码上设置断点。但是,它们都没有被调用。不止一次。即使我在列表框上进行显式刷新重绘调用也不行。

这确实是基本的东西,那么我做错了什么会阻止调用这些事件处理程序并随后破坏我的所有者绘制代码?单个字符串确实正确显示在列表框中。我加入了一个 OnClick() 事件处理程序,只是为了看看它是否有效。

4

5 回答 5

4

OnMeasureItemOnDrawItem事件是(间接)响应来自 Windows的WM_MEASUREITEM和消息而触发的。WM_DRAWITEM确保您的应用程序中没有任何消息处理程序正在过滤掉该消息,或者 VCL 的内部CN_MEASUREITEMCN_DRAWITEM消息。

于 2011-12-13T07:20:09.950 回答
2

事实证明,问题是由于我使用的 TListBox 的 Columns 属性中的非零值造成的。在转换为所有者绘制之前,我一直在尝试使用列,并将 TListBox.Columns 属性保留为非零值。显然,非零 Columns 属性值会禁止触发与所有者绘制相关的事件触发。一旦我将该属性设置回零 OnMeasureItem() 并且 OnDrawItem() 开始触发。

于 2011-12-13T11:19:12.377 回答
1

这里真的很少出错。如果您设置一个测试应用程序来尝试这个,那么它的功能就像您期望的那样,并且事件处理程序被调用。

您报告的行为的最可能原因是如果在分配事件处理程序之前添加了项目。如果在设计时将项目添加到 .dfm 文件中,通常会发生这种情况。你说你在运行时添加项目。在分配事件处理程序之前,您可能太早添加它们。如果您添加项目以响应事件(例如按钮单击)会发生什么。尝试一下,因为您可以确定那时事件处理程序是由该点分配的。

如果这没有帮助,那么显然您的应用程序中有一些代码会干扰 VCL 代码。

于 2011-12-13T08:06:01.847 回答
1

我遇到了同样的问题:如果 Columns 属性不为零,则不会调用我的 OnDrawItem 事件处理程序。原来这是因为 Style 属性设置为 lbOwnerDrawVariable。可变项目高度不允许与多列一起使用,大概是因为如果允许项目高度不同,行将不会跨列对齐。一旦将 Style 属性设置为 lbOwnerDrawFixed,就会按预期调用 OnDrawItem 事件处理程序。

于 2014-04-01T19:54:00.403 回答
1

我有一个类似的问题,csOwnerDrawVariable 样式的组合框没有触发 OnMeasureItem 事件。正如 David Heffernan 所建议的那样,问题在于这些项目已在设计时添加到列表中。我最终使用的解决方法是将代码添加到 FormCreate 事件处理程序以将设计时列表复制到临时变量,然后清除列表并重新添加项目。笨拙但有效。

于 2014-07-10T00:19:31.340 回答