如何使用在设计时获取“无法将 NIL 分配给 TFont”的 TFont 属性修复 Delphi 组件?

Posted

技术标签:

【中文标题】如何使用在设计时获取“无法将 NIL 分配给 TFont”的 TFont 属性修复 Delphi 组件?【英文标题】:How to fix Delphi component with TFont property that gets "cannot assign NIL to a TFont" at design time? 【发布时间】:2011-11-12 13:05:05 【问题描述】:

我已经开始在 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.

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

不要忘记添加 OnChange 事件处理程序,以便您的组件也可以对字体子属性的更改做出反应。

以上是关于如何使用在设计时获取“无法将 NIL 分配给 TFont”的 TFont 属性修复 Delphi 组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用在设计时获取“无法将 NIL 分配给 TFont”的 TFont 属性修复 Delphi 组件?

设计android应用程序时如何在我的应用程序中获取谷歌广告ID?

身份验证时如何设计选择SIM卡并在iOS中获取唯一ID?

如何设计API接口,请求接口时需要进行身份验证,防止第三方随意调用接口?

如何在按钮单击时从win32 c ++中的文本框获取文本?

js设计模式之单例模式实例