2011-09-07 14 views
6

Tôi đã bắt đầu xây dựng một thành phần mới trong Delphi 6 Pro. Hiện tại nó chỉ có một tài sản được xuất bản TFont. Tuy nhiên, khi tôi thả thành phần trên Biểu mẫu vào thời gian thiết kế và nhấp vào nút chỉnh sửa cho thuộc tính "textAttr_1" (dấu ba chấm), tôi nhận được Ngoại lệ nói "không thể gán NIL cho TFont". Tôi đang làm sai điều gì gây ra lỗi này? Bên dưới là mã cho thành phần:Làm thế nào để sửa chữa thành phần Delphi với thuộc tính TFont được "không thể gán NIL cho một TFont" tại thời điểm thiết kế?

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. 

Trả lời

16

Vấn đề chính của bạn là bạn quên thêm override vào hàm tạo thành phần của bạn. Điều này có nghĩa là nó không được gọi vì khung VCL tận dụng lợi thế của hàm tạo ảo của TComponent. Điều đó giải thích lý do tại sao phông chữ của bạn là nil.

Bạn cũng cần một phương thức set gọi Assign để sao chép các thuộc tính của phông chữ, thay vì thay thế trường hợp không tránh khỏi dẫn đến lỗi tham nhũng bộ nhớ.

Nguồn VCL có vô số ví dụ về mẫu này. Có vẻ như sau:

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

Cảm ơn bạn David. –

+5

Đừng quên thêm một trình xử lý sự kiện 'OnChange' để thành phần của bạn có thể phản ứng với những thay đổi trong các phần con của Font. –

+0

@Remy Lebeau - ý tưởng hay và cảm ơn, sẽ làm. –

Các vấn đề liên quan