0

请参阅我之前的这个问题/答案组合。它描述了如何为 IDE 创建属性编辑器。

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

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

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

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

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

4

2 回答 2

3

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

话虽如此,如果您的编辑器显示一个弹出对话框进行编辑,它应该作为组件编辑器而不是(或除了)属性编辑器来实现。属性编辑器一次只能编辑一个属性,尽管它可能对其他属性具有只读依赖性。例如,Glyph同时编辑Font属性(反之亦然)的属性编辑器不是一个好的设计。但是编辑两者的组件编辑器是完全可以接受的。

于 2017-08-27T16:14:56.963 回答
0

解决方案 1

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

解决方案 2

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

于 2017-08-26T23:11:52.913 回答