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

最佳答案

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

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

VCL来源提供了无数这种模式的示例。看起来像这样:

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

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

10-10 18:51