如何为单个属性编辑器使用两个属性?

时间:2017-08-26 23:11:53

标签: delphi ide custom-component propertyeditor

请参阅我的this prior question/answer组合。它描述了如何为IDE创建属性编辑器。

我创建了另一个属性编辑器,用于完全不同的目的。在这种情况下,它是String类型的字形字符选择器(因为它可以包含多个字形字符)。与我在提到的问题/答案中的另一个不同,这个问题非常特定于我的特定TCollectionItem类的特定属性。

一切都很好,我可以为这个特定的属性调用这个属性编辑器。但是,我有一个两难的境地。属性编辑器本质上与字体直接相关。用户可以从特定字体中选择字符(字形)。我的属性编辑器可以更改字体,并浏览该字体中包含的字形。

我的这个组件还具有在单独的TFont属性中指定字体的功能。当涉及在同一属性编辑器中使用的Glyph属性和Font属性的组合时,会出现问题。当我为Glyph属性调用此编辑器时,它还需要知道它需要使用的Font。相反,当用户在此编辑器中选择字体和字形字符时,还需要同时更新GlyphFont属性。

长话短说,PropertyB取决于PropertyA。如果PropertyA发生变化,那么PropertyB将会有一组完全不同的可能值。因此,我在IDE中安装的任何编辑器都需要允许用户同时更改 PropertyAPropertyB

如何让属性编辑器可以访问多个属性?

2 个答案:

答案 0 :(得分:3)

-v有一个公共TPropertyEditor方法,您可以使用它来访问当前正在编辑其属性的对象(可以同时编辑具有相同属性的多个对象,如果属性编辑器允许它)。然后,您将可以访问同一对象中的所有其他属性。

话虽这么说,如果您的编辑器显示一个用于编辑的弹出对话框,它应该作为组件编辑器实现,而不是(或除了)属性编辑器。属性编辑器一次只能编辑一个属性,尽管它可能具有其他属性的只读依赖性。例如,{em>编辑 GetComponent()属性的Glyph属性编辑器,反之亦然,这不是一个好的设计。但编辑的组件编辑器完全可以接受。

答案 1 :(得分:0)

解决方案1 ​​

代替属性编辑器,实现组件编辑器。这样的组件编辑器可以访问整个组件,而不仅仅是单个属性。

解决方案2

将您的所有属性包装在专用的TPersistent类中,然后为该类创建一个TClassProperty属性编辑器。各个属性实际上不会调用属性编辑器。相反,他们的父TPersistent将调用一个组合属性编辑器,该编辑器可以访问此类中的所有属性。一个很好的现有示例是TFont编辑器。