如何为单个 属性 编辑器使用两个属性?
How to use two properties for a single property editor?
参考我的this prior question/answer组合。它描述了如何为 IDE.
创建一个 属性 编辑器
我为完全不同的目的创建了另一个 属性 编辑器。在本例中,它是 String
类型的字形字符选择器(因为它 可以 包含多个字形字符)。与我提到的 question/answer 中的另一个不同,这个非常特定于我的特定 TCollectionItem
class 上的特定 属性。
一切都很好,我可以为这个特定的 属性 调用这个 属性 编辑器。但是,我有一个进退两难的境地。 属性 编辑器本质上与字体直接相关。用户可以从特定字体中选择一个字符(字形)。我的 属性 编辑器可以更改字体,并浏览该字体中包含的字形。
我的这个组件还可以在单独的 TFont
属性 中指定字体。当我的 Glyph
属性 和 Font
属性 在同一个 属性 编辑器中组合使用时,问题就出现了。当我为 Glyph
属性 调用此编辑器时,它还需要知道它需要使用的 Font
。相反,当用户在此编辑器中选择字体和字形字符时,还需要更新 Glyph
和 Font
属性。
长话短说,PropertyB
取决于 PropertyA
。如果 PropertyA
改变,那么 PropertyB
将有一组完全不同的可能值。因此,我在 IDE 中安装的任何编辑器都需要允许用户同时更改 both PropertyA
和 PropertyB
。
我怎样才能让一个 属性 编辑器可以访问多个 属性?
解决方案 1
代替 属性 编辑器,实施组件编辑器。这样的组件编辑器将可以访问整个组件,而不仅仅是单个 属性。
解决方案 2
将您的两个属性包装在专用的 TPersistent
class 中,然后为此 class 创建一个 TClassProperty
属性 编辑器。各个属性实际上不会调用 属性 编辑器。相反,它们的父级 TPersistent
将调用组合的 属性 编辑器,该编辑器可以访问此 class 中的所有属性。 TFont
编辑器就是一个很好的例子。
TPropertyEditor
有一个 public GetComponent()
方法,您可以使用该方法访问当前正在编辑 属性 的对象(多个对象具有相同的属性 可以同时编辑,如果 属性 编辑器允许的话)。然后您将可以访问同一对象中的所有其他属性。
话虽这么说,如果您的编辑器显示用于编辑的弹出对话框,则应将其实现为组件编辑器而不是(或除此之外)属性 编辑器。 属性 编辑器一次只能 edit 一个 属性,尽管它可能对其他属性具有只读依赖性。例如,Glyph
属性 编辑器也 编辑 Font
属性,反之亦然,这不是一个好的设计。但是编辑两者的组件编辑器是完全可以接受的。
参考我的this prior question/answer组合。它描述了如何为 IDE.
创建一个 属性 编辑器我为完全不同的目的创建了另一个 属性 编辑器。在本例中,它是 String
类型的字形字符选择器(因为它 可以 包含多个字形字符)。与我提到的 question/answer 中的另一个不同,这个非常特定于我的特定 TCollectionItem
class 上的特定 属性。
一切都很好,我可以为这个特定的 属性 调用这个 属性 编辑器。但是,我有一个进退两难的境地。 属性 编辑器本质上与字体直接相关。用户可以从特定字体中选择一个字符(字形)。我的 属性 编辑器可以更改字体,并浏览该字体中包含的字形。
我的这个组件还可以在单独的 TFont
属性 中指定字体。当我的 Glyph
属性 和 Font
属性 在同一个 属性 编辑器中组合使用时,问题就出现了。当我为 Glyph
属性 调用此编辑器时,它还需要知道它需要使用的 Font
。相反,当用户在此编辑器中选择字体和字形字符时,还需要更新 Glyph
和 Font
属性。
长话短说,PropertyB
取决于 PropertyA
。如果 PropertyA
改变,那么 PropertyB
将有一组完全不同的可能值。因此,我在 IDE 中安装的任何编辑器都需要允许用户同时更改 both PropertyA
和 PropertyB
。
我怎样才能让一个 属性 编辑器可以访问多个 属性?
解决方案 1
代替 属性 编辑器,实施组件编辑器。这样的组件编辑器将可以访问整个组件,而不仅仅是单个 属性。
解决方案 2
将您的两个属性包装在专用的 TPersistent
class 中,然后为此 class 创建一个 TClassProperty
属性 编辑器。各个属性实际上不会调用 属性 编辑器。相反,它们的父级 TPersistent
将调用组合的 属性 编辑器,该编辑器可以访问此 class 中的所有属性。 TFont
编辑器就是一个很好的例子。
TPropertyEditor
有一个 public GetComponent()
方法,您可以使用该方法访问当前正在编辑 属性 的对象(多个对象具有相同的属性 可以同时编辑,如果 属性 编辑器允许的话)。然后您将可以访问同一对象中的所有其他属性。
话虽这么说,如果您的编辑器显示用于编辑的弹出对话框,则应将其实现为组件编辑器而不是(或除此之外)属性 编辑器。 属性 编辑器一次只能 edit 一个 属性,尽管它可能对其他属性具有只读依赖性。例如,Glyph
属性 编辑器也 编辑 Font
属性,反之亦然,这不是一个好的设计。但是编辑两者的组件编辑器是完全可以接受的。