如何在运行时设计器中隐藏继承的已发布属性?

时间:2013-01-24 11:46:56

标签: delphi properties rtti delphi-xe3

我正在使用属性检查器(for example the nice JvInspector in the JVCL library),它很好地让我查看和编辑我的类'TMyClass'的已发布属性。 TMyClass来自TFrame并且有一些已发布的属性,这些属性是我查看和编辑所需的唯一属性。当然TFrame有很多VCL属性,都是已发布的,我也看到了。

如何抑制祖先属性RTTI并保留我自己发布的属性?我正在使用XE3所以世界是我的牡蛎...也许。

3 个答案:

答案 0 :(得分:8)

TCustomFrame导出您的课程,并从您的课程中仅发布您需要的属性。虽然你基本上不能隐藏已经发布的属性,但是有很多它们受到保护,并且通过使用TCustomFrame类作为你自己类的祖先来保持隐藏。

这就是VCL中几乎每个控件都是在类层次结构中组成的。例如,TLabelTCustomLabel后代,其在类链中的唯一作用是发布您可以在对象检查器中看到的属性。

答案 1 :(得分:4)

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;

答案 2 :(得分:3)

在运行时创建TMyClass组件/框架。


但是为了保持在设计时编辑属性的能力,请不要从TMyClass下降TFrame。相反,来自:

  • TCustomPanel如果你想要一个边框,
  • TCustomControl如果你能自己画边框,
  • TWinControl如果你可以没有边框。

当然,您的TMyClass组件不会再出现在插入框架对话框中,但只会像其他组件一样出现。