1

我有一个继承 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;
4

1 回答 1

1

我已经设法重现错误然后修复它,但无法确切理解为什么会发生这种情况,这与以相当复杂的方式工作的视觉继承有关(希望大卫或雷米能解释这里发生的事情)。

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

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

TMyComponent = class (TFrame)

TMyComponent仅为TFrame. 这就是发生错误的原因:TFrame确实没有“obs”属性。

这是解决方法:不要将此框架添加到项目本身。相反,从组件调色板添加框架。这样它就可以按预期工作。如果 IDE 找不到该组件的文件,请将包含它们的文件夹添加到搜索路径。

于 2016-05-31T03:49:24.830 回答