gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:03:10 24 4
gpt4 key购买 nike

我创建了自己的组件,其中包含一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com