3

信息

我似乎完全不知道应该如何管理我的组件包和安装自定义属性编辑器。过去一周左右我一直在查看示例和教程,显然我做错了什么,因为我的属性编辑器从未出现在对象检查器中,我需要逐步说明来尝试解决这种挫败感。

组件包

我目前有一个包,它designtime and runtime在选项中设置为。添加到这个包中的是我的组件的单元(即,MyButton、MyListBox 等) - 此外,我还有一个包含该RegisterComponents过程的单元。我现在可以构建和安装它,将我的组件添加到一个新项目并运行它们而不会出现任何问题。

添加自定义 PropertyEditor

现在我想从上面的包中为我的组件引入一个属性编辑器,这让我变得棘手和困惑。

例如 TMyButton 是一个带有我自己的绘制方法的自定义按钮,它已经发布了允许更改按钮外观的属性 - 此外还有一个发布列表允许选择预设外观设置,例如:

TMyButtonStyle = (bsStyle1, bsStyle2, bsStyle3)

我想删除预设样式列表,而是向对象检查器添加一个名为“PresetStyles”的属性。此属性将属于 paDialog,我想显示一个表单,我可以在其中直观地看到不同的按钮样式 - 一种比从简单列表中选择预设样式的更加图形化的方式。

我需要哪些包

如果我理解,您需要拆分designtime包和runtime包吗?

这是否意味着我需要两个寄存器单元,一个用于组件,一个用于属性编辑器?

我不完全确定如何管理这个,正如我所说的,我当前的包是designtime and runtime,我不确定我应该将它分成什么包类型。如果我为属性编辑器制作了一个新的设计时包,而runtime只制作了另一个包,我会丢失安装按钮。即使现在写这篇文章也让我感到困惑。

安装属性编辑器

我尝试过的其中一篇文章来自此页面: http: //www.delphisources.ru/pages/faq/master-delphi-7/content/LiB0097.html

我唯一改变的是添加我自己的对话框表单,并从以下位置更改注册代码:

RegisterPropertyEditor(TypeInfo(string), TMdSoundButton, 'SoundUp', TSoundProperty);

RegisterPropertyEditor(TypeInfo(string), TMyButton, 'PresetStyles', TSoundProperty);

我知道它仍然说 TSoundProperty,我只是让它保持这样,直到我可以让它工作然后我会更改类名。

结论

在实际组件和设计端(即 PropertyEditors)之间拆分/管理包的正确方法是什么?

PropertyEditor 从未出现在对象检查器中的 TMyButton 上,我觉得这一定与未正确配置包有关。

我真的很感谢这里的某种帮助,甚至是指向一个非常好的教程指南的链接或我所做的任何事情似乎都不起作用,即使使用很多示例也不适合我。

4

3 回答 3

7

我目前有一个包,它在选项中设置为设计时和运行时。

要实现自定义属性/组件编辑器,您必须将代码分成两个包 - 一个runtime only包仅包含组件本身的实现代码,另一个designtime only包仅包含组件注册和自定义编辑器的实现代码。设计时包需要designide在其Requires列表中指定运行时包和包。运行时包被编译成可执行文件。designtime 包是 IDE 用来让您的组件出现在 Component Palette 和 Form Designer 中并与它们交互的东西。

这是否意味着我需要两个寄存器单元,一个用于组件,一个用于属性编辑器?

不,运行时包应该根本没有注册。这属于设计时包。您可以在设计时包中拥有一个Register()注册所有内容的函数。

如果我为属性编辑器创建一个新的设计时包,并且只创建另一个包运行时,我会丢失安装按钮。

您不能将运行时包安装到 IDE 中,只能安装设计时包。

我尝试过的其中一篇文章来自此页面: http: //www.delphisources.ru/pages/faq/master-delphi-7/content/LiB0097.html

我唯一改变的是添加我自己的对话框表单,并从以下位置更改注册代码:

RegisterPropertyEditor(TypeInfo(string), TMdSoundButton, 'SoundUp', TSoundProperty);

RegisterPropertyEditor(TypeInfo(string), TMyButton, 'PresetStyles', TSoundProperty);

你的TMyButton组件是否真的定义了PresetStyles一个类型的属性String?您不能为不存在的属性定义属性编辑器。

在不确切知道您的PresetStyles属性是如何在组件本身中实现的以及它代表什么的情况下,为属性调用弹出对话框可能没有多大意义String(可能除了文件名之类的东西)。根据您的描述,实现组件编辑器而不是属性编辑器可能更有意义,并保留您现有的TMyButtonStyle单独使用 IDE 的枚举属性的默认编辑器。要调用您的弹出对话框,组件编辑器将允许用户右键单击组件本身并从弹出菜单中选择“编辑”(或您决定命名的任何其他字符串值),或者只需双击组件,在表单设计器中。然后,您可以根据需要显示和编辑组件,并在对话框关闭时将任何更改分配给组件。

PropertyEditor 从未出现在对象检查器中的 TMyButton 上,我觉得这一定与未正确配置包有关。

很难确定,因为您还没有显示任何实际代码。

于 2013-02-05T17:18:22.807 回答
5

如果我理解,您需要拆分设计时包和运行时包吗?

这是否意味着我需要两个寄存器单元,一个用于组件,一个用于属性编辑器?

不会。一个注册单元同时注册组件和属性编辑器就足够了,只要在运行时不使用该注册单元(通常不使用)。这也适用于包含属性编辑器的单元。防止DesignEditors.pas在运行时使用,然后就可以了。

于 2013-02-05T15:01:26.823 回答
2

组件包

今天可以为两者准备一个包裹。过去,如果应用程序与运行时包一起分发以减小总大小,则将它们拆分是有意义的。到目前为止,我喜欢将它们分开以分离实现和设计接口。

我需要哪些包

如果您有两个包,则必须在设计时包的“要求”中引用运行时包。因此,您只需注册设计时包。运行时包是隐式加载到 IDE 中的。在您使用一个包裹的情况下,您必须注册它。

安装属性编辑器

第一个参数有问题。它必须是属性的类型信息。

RegisterPropertyEditor(TypeInfo(TMyButtonStyle), TMdSoundButton, 'PresetStyles', TSoundProperty);

TSoundProperty 应该是 TEnumProperty 的 descand。

结论

继续一个包裹。该属性应与更改的代码一起出现。如果不是,请检查该属性是否不是只读的。

于 2013-02-05T15:02:04.703 回答