首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi 6 TListBox OnMeasureItem()和OnDrawItem()从未调用lbOwnerDrawVariable()列表框

Delphi 6 TListBox OnMeasureItem()和OnDrawItem()从未调用lbOwnerDrawVariable()列表框
EN

Stack Overflow用户
提问于 2011-12-13 06:05:06
回答 5查看 2.6K关注 0票数 4

我有一个Delphi 6应用程序,它的TListBox控件设置为lbOwnerDrawVariable。在运行时,我向列表框中添加一个字符串。我为OnMeasureItem()和OnDrawItem()设置了事件处理程序,并在每个事件处理程序的第一行代码上设置了断点。然而,他们两个都没有被称为。一次也没有。即使我在列表框中进行了显式的、刷新、重绘调用,也不会。

这是非常基本的东西,那么,我做错了什么才能抑制那些事件处理程序的调用,进而破坏我的所有者绘制代码呢?单个字符串确实正确地显示在列表框中。我添加了一个OnClick()事件处理程序,以查看它是否有效。

EN

回答 5

Stack Overflow用户

发布于 2011-12-13 07:20:09

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

票数 4
EN

Stack Overflow用户

发布于 2011-12-13 11:19:12

结果发现,问题是由于我正在使用的TListBox的列属性中有一个非零的值。在转换为所有者绘图之前,我一直在尝试使用列,并保留了非零值的TListBox.Columns属性。显然,非零列属性值抑制了所有者绘制相关事件触发的触发。一旦我将该属性设置为零,OnMeasureItem()和OnDrawItem()就开始触发。

票数 2
EN

Stack Overflow用户

发布于 2011-12-13 08:06:01

在这里几乎没有什么可以出错的。如果您设置了一个测试应用程序来尝试这一点,那么它的功能就像您所期望的那样,并且调用了事件处理程序。

您报告的行为最有可能的原因是在分配事件处理程序之前添加了项。这通常发生在设计时在.dfm文件中添加项时。您说您要在运行时添加这些项。在分配事件处理程序之前,您可能过早地添加了它们。如果您添加项目以响应事件,例如单击按钮,会发生什么情况。尝试一下,因为您可以确定,然后事件处理程序就会按照这个点分配。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8485018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档