6

我正在使用一个属性检查器(例如 JVCL 库中不错的 JvInspector),它可以很好地让我查看和编辑我的类“TMyClass”的已发布属性。TMyClass来自TFrame并具有一些已发布的属性,这是我唯一需要查看和编辑的属性。当然TFrame有很多 VCL 属性,都已发布,我也看到了。

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

4

3 回答 3

8

从 派生您的类TCustomFrame,并从您的类中仅发布您需要的那些属性。尽管您基本上不能隐藏已发布的属性,但其中有很多是受保护的,并且通过使用TCustomFrame类作为您自己类的祖先来保持隐藏。

这就是 VCL 中几乎每个控件在类层次结构中的组成方式。例如,TLabel是一个TCustomLabel后代,它在类链中的唯一作用是发布您可以在 Object Inspector 中看到的属性。

于 2013-01-24T14:20:17.187 回答
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;
于 2013-01-26T16:38:39.557 回答
3

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


但是为了保持在设计时编辑属性的能力,不要TMyClassTFrame. 相反,来自:

  • TCustomPanel如果你想要一个边框,
  • TCustomControl如果你能自己画边界,
  • TWinControl如果你能做到无国界。

当然,您的TMyClass组件将不再出现在“插入框架”对话框中,而只是像其他任何组件一样。

于 2013-01-27T09:22:07.893 回答