delphi - 自定义属性编辑器 - 它们似乎从未出现

标签 delphi custom-controls delphi-xe custom-component

信息

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

组件包

我目前有一个包,它在选项中设置为设计时和运行时。添加到此包的是我的组件的单元(即 MyButton、MyListBox 等) - 此外,我还有一个包含 RegisterComponents 过程的单元。我现在可以构建并安装它,将我的组件添加到新项目中并毫无问题地运行它们。

添加自定义 PropertyEditor

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

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

TMyButtonStyle = (bsStyle1, bsStyle2, bsStyle3)

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

我需要哪些软件包

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

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

我不太确定如何管理它,正如我所说,我当前的包是设计时和运行时,我不确定应该将其拆分成什么包类型。如果我为属性编辑器创建一个新的设计时包,并仅创建另一个包运行时,我就会丢失安装按钮。即使现在写这篇文章也让我感到困惑。

安装 PropertyEditor

我尝试遵循的其中一篇文章来自此页面: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 上,我有一种感觉,它一定与未正确配置包或其他原因有关。

我真的很感谢这里的某种帮助,甚至是一个非常好的教程指南的链接或其他东西,因为我所做的一切似乎都不起作用,即使使用很多示例对我来说也不起作用。

最佳答案

I currently have one package, and it is set to designtime and runtime in the options.

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

Does this mean I need two register units, one for the components and one for the Property Editors?

没有。运行时包根本不应该有任何注册。它属于设计时包。您可以在设计时包中使用一个 Register() 函数来注册所有内容。

If I make a new designtime package for the Property Editors, and make the other package runtime only I lose the install button.

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

One of the articles I tried following was one from this page: http://www.delphisources.ru/pages/faq/master-delphi-7/content/LiB0097.html

The only thing I changed was add my own dialog form, and change the register code from:

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

to

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

您的 TMyButton 组件是否确实定义了 String 类型的 PresetStyles 属性?您无法为不存在的属性定义属性编辑器。

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

The PropertyEditor never appears on TMyButton in the Object Inspector and I have a feeling it must be something to do with not configuring the packages correctly or something.

很难确定,因为您尚未显示任何实际代码。

关于delphi - 自定义属性编辑器 - 它们似乎从未出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14709590/

相关文章:

delphi - 为什么编译器会跳过分配变量

delphi - 为动态按钮创建一个新的 btnClick 过程

wpf - 如何为dll中的自定义控件分配资源字典

delphi - 未加载自定义控件的已发布 TStrings 属性

Delphi XE [DCC fatal error ] F2084 内部错误 : DBG2886

delphi - DLL 形式为 MDI 子项

delphi - 跨进程单例对象

xml - 来自 XSD 的 Delphi 读取器 XML 可选值 0..n

wpf - 创建自定义 FrameworkContentElement 以在 WPF 中的文本上添加对角线

delphi - 具有内置编码的类。为什么现场转换器不工作?