gpt4 book ai didi

delphi - 是否可以使用 RTTI 以编程方式更改属性写入方法来创建对象感知控件?

转载 作者:行者123 更新时间:2023-12-03 15:33:21 24 4
gpt4 key购买 nike

我有一个业务对象,我想更好地“连接”到我的 UI。我见过一些使对象具有数据感知能力的部分解决方案,但它们都涉及对我的业务对象的重大更改,包括额外的抽象层。

我一直在研究 Delphi 新版本中改进的 RTTI,它看起来非常有趣和有用。我想知道是否可以使用它以编程方式为所有属性注入(inject)新的写入方法。

其工作方式是,在构建表单时,我的 TEdit 后代将给出对对象属性的引用。然后,TEdit 将在该属性的属性中插入对其自身的引用(当然,在析构函数中删除自身或给予另一个引用)。 TEdit 还将确保属性的 write 方法被替换为在调用原始 write 方法后通知 TEdit 更改的方法。

这可行吗?最大的阻碍是注入(inject)新的写入方法是不可能的,因此这个问题的标题。

派生属性也存在潜在问题,但应该可以找到解决方案。

最佳答案

您的问题已经让您在编程技能方面领先于我,因此我将添加如何解决这个问题:

如果我尝试编写类似的内容,我可能会从 TBusinessObject 中的每个字段开始使用 TList。该列表将用于指示当您需要推出更改时需要更新的内容。

因此,当创建 TEdit 时,它会将自身添加到与 TBusinessObject 中的一条数据关联的列表中。当 TBusinessObject 更新该数据时,它将遍历附加对象的列表。它会看到 TEdit,并且知道它是 TEdit,并将运行代码来更新 .Text。如果我附加了 TCaption,那么代码将更新 .Caption。

正如您所指出的,TEdit 需要告诉 TBusinessObject 其值何时更新。我想这是一个棘手的地方 - 您可以创建一个新的 TEdit 并添加一个 TList 来维护它在更改时应该通知谁。如果您使用 .Tag 来指示 TBusinessObject 中的字段号,则 OnChange (或任何事件)可以调用类似 TBusinessObject.FieldUpdate[TEdit.Tag, NewValue] 的内容,然后触发您的业务逻辑。反过来,这可能会使 TBusinessObject 更新其他字段,这些字段可能有自己的 TList 来更新字段。

防止循环更新需要您有一种在不触发事件的情况下更新控件的方法。对于我编写的一个程序,我有两种更新控件的方法:SetValue 和 ChangeValue。 SetValue 禁用了所有事件(OnChange、OnValidate),更新了控件的值,然后重新启用了事件。 ChangeValue 只是更改值并允许根据需要触发任何控件的事件。

可能有更巧妙的方法可以做到这一点,但希望这能给您带来思考。

关于delphi - 是否可以使用 RTTI 以编程方式更改属性写入方法来创建对象感知控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9396176/

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