delphi - 属性未写入,仅在 Delphi XE2 中读取

标签 delphi properties call

我创建了自己的组件,其中包含一个 TFont 以及 适当的属性。

该组件在公共(public)声明中具有以下属性

property CaptionFont: TFont read fCaptionFont write SetCaptionFont;

SetCaptionFont 过程如下所示

procedure TMyComponent.SetCaptionFont(value: TFont);
begin
  fCaptionFont := value;
end;

我正在尝试使用以下代码将字体名称和字体大小分配给我的组件:

MyComponent.CaptionFont.Name := fGlobalStandardFontName;
MyComponent.CaptionFont.Size := fGlobalStandardFontSize;

但是,当在该行放置断点时

MyComponent.CaptionFont.Name := fGlobalStandardFontName;

然后点击“Trace Into (F7)”调试按钮,代码跳转到TFont代码并 完全忽略 SetCaptionFont 过程。

我期待调用 SetCaptionFont 过程。

这是怎么回事?

最佳答案

SetCaptionFont() 在为子属性赋值时不会被调用,因为您没有为 CaptionFont 属性本身赋值。

即使调用了它,您的 SetCaptionFont() 也没有正确实现。您正在获取源 TFont 的所有权并泄漏您的原始 TFont。您需要使用 Assign() 来将源 TFont 值复制到您现有的 TFont 中。

要检测子属性值更改(包括来自 Assign()),您需要将 OnChange 事件处理程序分配给您的 fCaptionFont对象,例如:

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited;
  fCaptionFont := TFont.Create;
  fCaptionFont.OnChange := CaptionFontChanged;
end;

procedure TMyComponent.SetCaptionFont(value: TFont);
begin
  fCaptionFont.Assign(value);
end;

procedure TMyComponent.CaptionFontChanged(Sender: TObject);
begin
  Invalidate;
end;

procedure TMyComponent.Paint;
begin
  // use fCaptionFont as needed...
end;

关于delphi - 属性未写入,仅在 Delphi XE2 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26328415/

相关文章:

delphi - 二进制序列化文件 - Delphi

delphi - 使用 Delphi ISAPI 的 SEO 友好 URL

javascript - 可以向类型化数组添加属性吗?

python - 调用类内部的函数来设置列表的元素

python - 如何在 Python 中调用 AutoIt 脚本

c - scilab 调用 C 函数

delphi - TVirtualStringTree,树结构的位置

delphi - 在 Delphi 中修改 Rest 服务器上的 URL

c# - 如何在控制台打印类属性?

ios - 使用不受实例变量支持的属性