自定义PropertyEditors - 它们似乎永远不会出现

时间:2013-02-05 14:16:42

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

信息

对于如何管理组件包和安装自定义属性编辑器,我似乎无能为力。我花了大约一个星期左右查看示例和教程,我必须明确做错了,因为我的属性编辑器从未出现在Object Inspector中,我需要一步一步的指示来尝试解决这种挫败感。

组件包

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

添加自定义PropertyEditor

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

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

TMyButtonStyle = (bsStyle1, bsStyle2, bsStyle3)

我想删除预设样式列表,而是在Object Inspector中添加一个名为'PresetStyles'的属性。这个属性将是paDialog,我想展示一个表格,在那里我可以直观地看到不同的按钮样式 - 从简单列表中选择预设样式的更加图形化的方式。

我需要哪些套餐

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

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

我不完全确定如何管理这个,因为我说我当前的包是designtime and runtime,我不确定我应该将它分成什么包类型。如果我为Property Editors创建一个新的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永远不会出现在Object Inspector中的TMyButton上,我觉得它必须与未正确配置包或其他东西有关。

我真的很感激这里有一些帮助,甚至是一个非常好的教程指南的链接,或者我正在做的事似乎没有用,即使使用了很多例子也不适合我。

3 个答案:

答案 0 :(得分:7)

  

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

要实现自定义属性/组件编辑器,您必须将您的代码分成两个包 - 一个runtime only包只包含组件本身的实现代码,一个designtime only }包只包含组件注册和自定义编辑器的实现代码。 designtime包需要在designide列表中指定运行时包和Requires包。运行时包是编译成可执行文件的内容。 designtime包是IDE用于使组件显示在Component Palette和Form Designer中并与之交互的内容。

  

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

没有。运行时包应该没有注册。这属于designtime包而不是。您可以在designtime包中使用一个Register()函数来注册所有内容。

  

如果我为Property Editors创建一个新的designtime包,并且仅使其他包运行时失去安装按钮。

您无法在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永远不会出现在Object Inspector中的TMyButton上,我觉得它必须与未正确配置包或其他东西有关。

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

答案 1 :(得分:5)

  

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

     

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

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

答案 2 :(得分:2)

组件包

今天可以同时拥有一个包。在过去,如果应用程序是分开它们是有意义的 与运行时包一起分发以减少总大小。我喜欢将它们分开到现在 分离实施和设计界面。

我需要哪些套餐

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

安装PropertyEditor

第一个参数有问题。它必须是属性的typeinfo。

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

TSoundProperty应该是TEnumProperty的一个descand。

<强>结论

继续使用一个包裹。该属性应显示更改的代码。如果没有检查该属性是否为readonly。