【发布时间】:2019-05-09 15:55:58
【问题描述】:
我在 Lazarus 中创建了一个基于 TPaintBox 的新组件。现在在对象检查器中,我拥有属于此基本组件 (TPaintBox) 的所有属性和事件。
我的问题是:我可以隐藏为我的组件选择的属性和事件吗?
例如,我想只保留可见的 Width 和 Height 属性。
你能帮帮我吗?
【问题讨论】:
标签: delphi components lazarus freepascal
我在 Lazarus 中创建了一个基于 TPaintBox 的新组件。现在在对象检查器中,我拥有属于此基本组件 (TPaintBox) 的所有属性和事件。
我的问题是:我可以隐藏为我的组件选择的属性和事件吗?
例如,我想只保留可见的 Width 和 Height 属性。
你能帮帮我吗?
【问题讨论】:
标签: delphi components lazarus freepascal
不,您不能隐藏(取消发布)已发布的属性。
在 Delphi 中,大多数对象都基于具有所有相同属性的父类,但大多是隐藏的。
因此,虽然您不能隐藏公开的属性,但您通常可以通过将您的类基于 TCustomxxx 来实现您想要的。
遗憾的是,TPaintbox 是一个例外。它是 TGraphicControl 的后代,但又是 TControl 的后代,TControl 已经具有许多已发布的属性,包括 AlignWithMargins、CustomHint 和其他几个属性,而它又是 TComponent 的后代,它已发布了 Name 和 Tag。公平地说,你肯定需要名字,我认为标签不是问题。
如果您只需要返回 TGraphicControl,那还不错。只有一个成员和几个要复制的例程。但是要返回到 TComponent,您需要这样做来隐藏许多属性是不可行的。
【讨论】:
TControl 属性都是默认发布的。 Cursor 是public,如果你愿意,你可以把它改成published。
属性/事件一旦发布,就无法取消发布。
但是,它至少可以从对象检查器中隐藏(代码仍然可以访问它)。
在您的设计时代码向 IDE 注册组件后,它可以:
在 Delphi 中,从 DesignIntf 单元调用 UnlistPublishedProperty()。
在 Lazarus 中,从 PropEdits 单元调用 RegisterPropertyEditor() 以注册属性/事件的 THiddenPropertyEditor 类(请参阅 Lazarus 论坛中的 Hide Properties (UnlistPublishedProperty))。
【讨论】:
不确定 Lazarus,但在 Delphi 中 TPaintBox 是 TGraphicControl 的轻量级后代。它的大部分声明只是发布属性。我不知道您的组件在做什么,但直接从TGraphicControl 派生它并在实际需要的地方复制TPaintBox 代码可能更容易。然后您可以只发布您想要的属性。请注意,您仍然拥有在 TControl 和 TComponent 中发布的那些声明的属性。
【讨论】:
TPaintBox 是 TGraphicControl 的轻量级后代" - 在 Lazarus 中也是如此。