gpt4 book ai didi

delphi - 如何修复具有 TFont 属性的 Delphi 组件在设计时获取 "cannot assign NIL to a TFont"?

转载 作者:行者123 更新时间:2023-12-03 14:56:30 30 4
gpt4 key购买 nike

我已经开始在 Delphi 6 Pro 中构建一个新组件。目前它只有一个 TFont 已发布属性。但是,当我在设计时将组件放在表单上,​​然后单击“textAttr_1”属性(省略号)的编辑按钮时,我收到一个异常,提示“无法将 NIL 分配给 TFont”。我做错了什么导致了这个错误?以下是该组件的代码:

unit JvExtendedTextAttributes;

interface

uses
Windows, Messages, SysUtils, Classes, JvRichEdit, Graphics;

type
TJvExtendedTextAttributes = class(TComponent)
private
{ Private declarations }
protected
{ Protected declarations }
FTextAttr_1: TFont;
public
{ Public declarations }
constructor Create(AOwner: TComponent);
published
{ Published declarations }
property textAttr_1: TFont read FTextAttr_1 write FTextAttr_1;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('FAVORITES', [TJvExtendedTextAttributes]);
end;

// ---------------------------------------------------------------

constructor TJvExtendedTextAttributes.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

FTextAttr_1 := TFont.Create;
end;

// ---------------------------------------------------------------


end.

最佳答案

您的主要问题是您忘记向组件的构造函数添加覆盖。这意味着它没有被调用,因为 VCL 框架利用了 TComponent 的虚拟构造函数。这解释了为什么你的字体实例为零。

您还需要一个 set 方法来调用 Assign 来复制字体的属性,而不是替换实例,这不可避免地会导致内存损坏错误。

VCL 源代码中有无数这种模式的示例。它看起来像这样:

property Font: TFont read FFont write SetFont;
...
procedure TMyComponent.SetFont(Value: TFont);
begin
FFont.Assign(Value);
end;

关于delphi - 如何修复具有 TFont 属性的 Delphi 组件在设计时获取 "cannot assign NIL to a TFont"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340921/

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