2011-09-07 17 views
6

Comencé a crear un nuevo componente en Delphi 6 Pro. Actualmente solo tiene una propiedad publicada de TFont. Sin embargo, cuando dejo caer el componente en un Formulario en el momento del diseño, y hago clic en el botón Editar para la propiedad "textAttr_1" (puntos suspensivos), aparece una Excepción que dice "no puedo asignar NIL a un TFont". ¿Qué estoy haciendo mal que está causando este error? A continuación se muestra el código para el componente:Cómo reparar el componente Delphi con la propiedad TFont que obtiene "no se puede asignar NIL a un TFont" en el momento del diseño?

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. 

Respuesta

16

Su principal problema es que usted se olvidó de agregar un override al constructor de su componente. Esto significa que no se está llamando porque el marco de VCL aprovecha el constructor virtual de TComponent. Eso explica por qué la instancia de su fuente es nula.

También necesita un método set que llame al Assign para copiar las propiedades de la fuente, en lugar de reemplazar la instancia que inevitablemente genera errores de corrupción de memoria.

La fuente VCL tiene innumerables ejemplos de este patrón. Se ve así:

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

Gracias David. –

+5

No olvide agregar un controlador de eventos 'OnChange' para que su componente también pueda reaccionar a los cambios en las subpropiedades de la Fuente. –

+0

@Remy Lebeau - buena idea y gracias, lo haré. –

Cuestiones relacionadas