gpt4 book ai didi

delphi - 修改子对象的行为

转载 作者:行者123 更新时间:2023-12-02 11:32:51 24 4
gpt4 key购买 nike

有没有办法通过在子类化组件时重新定义子对象来修改子对象的行为(方法)。例如,我正在子类化 Tlistbox ,并且我想修改其 Items 子对象的 Delete() 方法的行为。有正式的方法吗?谢谢

最佳答案

根据您的评论,您实际上不需要更改 Items 的行为属性(property)本身。还有其他方法可以检测何时在 ListBox 中操作项目,以便您可以根据需要更新自己的内部对象。

删除项目时,Items.Delete()方法只需调用 TCustomListBox.DeleteString()向其传递要删除的索引。 DeleteString()可以被后代覆盖。足够简单。

当添加/插入新项目时,事情并不是那么简单。 Items.Add()发送 LB_ADDSTRING直接向ListBox的HWND发送消息(除非 ListBox 的 Style 设置为虚拟模式,在这种情况下 Add() 只是退出而不执行任何操作)。与 Items.Insert() 相同方法(LB_INSERTSTRING消息)。要捕获这些消息,您必须覆盖 ListBox 的虚拟 WndProc()方法。

Items.AddObject()来电 Items.Add()首先,然后使用 Items.Objects[] setter 将对象分配给新项目。与 Items.InsertObject() 相同,调用Items.Insert()而不是Items.Add() .

通过 Items.Strings[] 更新现有项目的字符串时属性,事情变得有点复杂:

  1. TCustomListBox.InternalGetItemData() (可以被覆盖)被调用以检索项目的现有对象(如果有)。默认情况下,InternalGetItemData()来电 GetItemData() (也可以被覆盖),默认情况下发送 LB_GETITEMDATA消息到列表框的HWND .
  2. TCustomListBox.InternalSetItemData() (可以被覆盖)被调用以将项目的对象设置为零(以防下一步中的 Delete() 尝试销毁它)。默认情况下,InternalSetItemData()来电 SetItemData() (也可以被覆盖),默认情况下发送 LB_SETITEMDATA消息到列表框的HWND .
  3. Items.Delete()被调用来删除该项目。
  4. Items.InsertObject()调用以插入带有 nil 的新字符串对象
  5. TCustomListBox.InternalSetItemData()调用将原始对象恢复为新项目。

通过 Items.Objects[] 更新现有项目的对象时属性,如果 ListBox 的 StyleTCustomListBox.SetItemData() 未设置为虚拟模式被调用。

使用Items.Exchange()移动元素时方法,如果 ListBox 的 Style设置为虚拟模式然后 Exchange()只是退出而不做任何事情。否则,它使用 Items.Strings[]属性来交换两个项目字符串,并调用 Internal(Get/Set)ItemData()交换两个项目对象。

所以,基本上,管理内部对象所需的一切都可以归结为重写这些方法:

  1. TCustomListBox.DeleteString()
  2. TCustomListBox.WndProc()处理LB_(ADD/INSERT)STRING ,也许 LB_(GET/SET)ITEMDATA .
  3. TCustomListBox.Internal(Get/Set)ItemData()TCustomListBox.(Get/Set)ItemData()

关于delphi - 修改子对象的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37312649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com