开发者

How to fix Delphi component with TFont property that gets "cannot assign NIL to a TFont" at design time?

I have started building a new component in Delphi 6 Pro. Currently it just has a single TFont published property. However, when I drop the component on a Form at design time, and click on the edit button for the "textAttr_1" property (ellip开发者_如何学Gosis), I get an Exception saying "cannot assign NIL to a TFont". What am I doing wrong that is causing this error? Below is the code for the component:

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.


Your main problem is that you forgot to add an override to your component's constructor. This means it is not being called because the VCL framework takes advantage of the virtual constructor of TComponent. That explains why your font instance is nil.

You also need a set method that calls Assign to copy the properties of the font, rather than replacing the instance which inevitably leads to memory corruption errors.

The VCL source has countless examples of this pattern. It looks like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜