我正在使用一个属性检查器(例如 JVCL 库中不错的 JvInspector),它可以很好地让我查看和编辑我的类“TMyClass”的已发布属性。TMyClass
来自TFrame
并具有一些已发布的属性,这是我唯一需要查看和编辑的属性。当然TFrame
有很多 VCL 属性,都已发布,我也看到了。
如何抑制祖先属性 RTTI 并保留我自己的已发布属性?我正在使用 XE3,所以世界就是我的牡蛎……也许吧。
我正在使用一个属性检查器(例如 JVCL 库中不错的 JvInspector),它可以很好地让我查看和编辑我的类“TMyClass”的已发布属性。TMyClass
来自TFrame
并具有一些已发布的属性,这是我唯一需要查看和编辑的属性。当然TFrame
有很多 VCL 属性,都已发布,我也看到了。
如何抑制祖先属性 RTTI 并保留我自己的已发布属性?我正在使用 XE3,所以世界就是我的牡蛎……也许吧。
从 派生您的类TCustomFrame
,并从您的类中仅发布您需要的那些属性。尽管您基本上不能隐藏已发布的属性,但其中有很多是受保护的,并且通过使用TCustomFrame
类作为您自己类的祖先来保持隐藏。
这就是 VCL 中几乎每个控件在类层次结构中的组成方式。例如,TLabel
是一个TCustomLabel
后代,它在类链中的唯一作用是发布您可以在 Object Inspector 中看到的属性。
FWIW,我找到了一个 RTTI 解决方案 - 即只允许不属于一个或多个祖先类的属性,换句话说,您自己在当前类中添加、发布的属性。JvInspector 有一个BeforeItemCreate
包含将出现在检查器中的属性名称的事件。此解决方案测试属性名称是否是祖先类的成员,只有不是,它才会在检查器中显示它。好处是任何检查器代码都没有更改。
uses
TypInfo;
procedure TForm1.JvInspectorBeforeItemCreate(Sender: TObject;
Data: TJvCustomInspectorData; var ItemClass: TJvInspectorItemClass);
begin
if IsPublishedProp(TFrame, Data.Name) then
ItemClass := nil;
end;
在运行时创建您的TMyClass
组件/框架。
但是为了保持在设计时编辑属性的能力,不要TMyClass
从TFrame
. 相反,来自:
TCustomPanel
如果你想要一个边框,TCustomControl
如果你能自己画边界,TWinControl
如果你能做到无国界。当然,您的TMyClass
组件将不再出现在“插入框架”对话框中,而只是像其他任何组件一样。