不要在组件框架中保存我发布的属性

时间:2016-05-30 13:15:00

标签: delphi properties components tframe

我有一个继承了TFrame的组件...但是我发布的属性不保存.dfm中的值...关闭Delphi并重新打开,重新加载项目时出现错误。

此错误为:“读取MyComponent1.Obs时出错:属性Obs不存在......

TMyComponent = class(TFrame)
   FObs: string;
   procedure SetObs(const Value: string);
published
   property Obs: string read FObs write SetObs;
end;

procedure register;

implementation

procedure register;
begin
   RegisterComponents('My Components', [TMyComponent]);
end;

procedure TMyComponent .SetObs(const Value: string);
begin
  if FObs <> Value then
    FObs := Value; 
end;

1 个答案:

答案 0 :(得分:1)

我设法重现错误然后修复它,但无法理解为什么会发生错误,这与视觉继承有关,它以相当复杂的方式工作(希望David或Remy可以解释这里发生的事情)

首先,此错误表示该属性实际上已保存到dfm文件中。点是,这是完全正常的情况,当dfm中缺少某些属性时,它只是意味着属性必须具有默认值(或祖先所具有的值),因此IDE从不引发错误,因为它没有在文件中找到某些属性。

这里恰恰相反:在dfm中发现属性'obs',但在课堂本身中找不到。当我创建新项目然后将框架单元添加到项目本身时,也发生了同样的情况。看来,在这种情况下,视觉继承发生而不是正常继承,即:IDE发现,类TMyComponent在属于项目的“可视”单元中描述,发现该行:

TMyComponent = class (TFrame)

并使TMyComponent仅为TFrame的别名。这就是错误发生的原因:TFrame确实没有'obs'属性。

这是解决方法:不要将此框架添加到项目本身。而是从组件面板添加框架。这种方式可以按预期工作。如果IDE无法找到此组件的文件,请将包含它们的文件夹添加到搜索路径中。