Delphi:比较两个组件之间的属性

Posted

技术标签:

【中文标题】Delphi:比较两个组件之间的属性【英文标题】:Delphi: compare properties between two components 【发布时间】:2010-12-25 16:06:43 【问题描述】:

我想比较两个组件的“状态”,比如Comp1: TSomeComponentComp2: TSomeComponent,即我想比较这两个组件的所有已发布属性的值。某些属性已编入索引,例如 TListBox.Items 属性。是否有捷径可寻?我必须调用一些迭代 RTTI 代码吗?

【问题讨论】:

Delphi 2010 引入了一种新的和增强的 RTTI,远远超出了以前的可能。因此,重要的是要知道您当前使用什么 Delphi 版本来回答问题。 唉,我用的是 D2009。但是:无论如何,我将在未来某个时候转移到 D2010,所以这可能是我需要转换的推动力。这在 D2010 中可能吗? 既然你只关心published,你可以在任何版本的Delphi中使用RTTI来做到这一点。 【参考方案1】:

我使用的一个技巧(但我希望在 IDE 中集成类似的东西)是复制与 2 个组件相关的 dfm 部分(使用 ALT+F12)以访问 dfm,然后将 2 个组件粘贴到NotePad++ 和我使用比较插件来比较 2。 它提供了一个很好的视觉输出,但这比在 IDE 中选择更多组件(甚至从不同的窗口)需要更多时间,然后使用 IDE 中内置的比较工具进行比较。

【讨论】:

【参考方案2】:

一种简单的方法是将它们都用WriteComponent 序列化并比较结果字符串。但是请注意,这将仅比较 published 而不是 public 属性。但这就是你所说的你需要的,所以......

请注意,这会使索引属性的顺序变得重要。这可能是你想要的,也可能不是。

【讨论】:

谢谢克雷格,我实际上正在考虑这一点。我在最初的问题中没有写的是,我想在我(在存在差异的情况下)使用 WriteComponent 编写属性之前比较属性。 AFAIU 你不能挑出某些要使用 WriteComponent 编写的属性。这是真的? (目前,我只关心发布的道具......) 实际上,您可以摆弄要写入的属性。看看TComponent.DefineProperties 和相关的方法/组件。这是很多年前的事了,但我既隐藏了属性,也添加了未声明为已发布的属性。 克雷格,您可以在组件中执行此操作,但不能从调用序列化的代码中执行此操作。 @Craig:正确;必须修改/子类化组件才能做到这一点,但它可以做到;)虽然,那说;子类化组件是一个不好的理由。因此,如果要求仅比较特定的已发布属性,那么 RTTI 可能是最好的选择。【参考方案3】:

不幸的是,据我所知,Delphi 中没有简单的比较功能。 (我已经停在 D2007。)您可以向基类添加一个“比较”方法,并在此方法中构建所有字段的比较。 (它应该接受同一个基类的一个参数。)使用 D2007,您可以将其构建为帮助类,但您仍然需要指定字段。 其他类可以从这个基类继承并覆盖基类 Compare 方法。

使用 RTTI 可以更轻松地比较不同类型的类的字段,但它很复杂且容易出错。它需要对各种不同的类进行大量测试。

【讨论】:

以上是关于Delphi:比较两个组件之间的属性的主要内容,如果未能解决你的问题,请参考以下文章

Delphi自定义组件如何在属性面板中实现打开文件的对话框?

Delphi 2009:传递组件名称 onclick 事件然后设置属性

delphi 组件属性详解 记得以前有一个小工具 鼠标移动到组件上能自动查看delphi组件的作用 求工具

Delphi组件编辑器

delphi 的TXMLDocument组件 DOMVendor属性

哪位大虾来教教我delphi怎么保存组件属性啊?