2010-10-29 8 views
6

Estoy creando mi primer componente personalizado de Delphi. Es básicamente un Tpanel personalizado con texto de encabezado y líneas que se muestran en él.Cómo implementar una propiedad de lista de cadenas en un componente delphi personalizado?

Quiero ser capaz de agregar texto de varias líneas usando una lista de cadenas.

Al probar el componente no puedo obtener las líneas de texto que se mostrará en el panel cuando se añaden líneas: NewLinesText.add ('texto línea 1')

Sin embargo, sí funciona cuando puedo crear y poblar un nuevo StringList en tiempo de ejecución y luego asignarla a mi control: controlPanelitem.NewLinesText = MyNewStringlist

Quiero ser capaz de añadir líneas de la siguiente manera: NewLinesText.add ('texto línea 1')

estoy usando Delphi 7 profesional en WinXP. Vea el código a continuación.

¡Cualquier ayuda sería apreciada!

unit ControlPanelItem; interface uses SysUtils, Classes, Controls, ExtCtrls, Graphics, AdvPanel, StdCtrls, Windows,Forms,Dialogs; type tControlPanelItem = class(TAdvPanel) private fLinesText : TStrings; procedure SetLinesText(const Value: TStrings); procedure SetText; protected public constructor Create(AOwner : TComponent); override; destructor Destroy; override; published property NewLinesText : TStrings read FLinesText write SetLinesText; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [tControlPanelItem]); end; constructor tControlPanelItem.Create(AOwner: TComponent); begin inherited; fLinesText := TStringList.Create; end; destructor tControlPanelItem.Destroy; begin fLinesText.Free; inherited; end; procedure tControlPanelItem.SetLinesText(const Value: TStrings); begin fLinesText.Assign(value); SetText; end; procedure tControlPanelItem.SetText; var count : Integer; begin for count := 0 to fLinesText.Count - 1 do ShowMessage(fLinesText.strings[count]); end; end.

Respuesta

8

Debe hacer

procedure SetLines(Lines: TStrings); 
begin 
    FLinesText.Assign(Lines); 
    // Repaint, update or whatever you need to do. 
end; 

También puede ser necesario para establecer la propiedad OnChange del FLines (hacer esto en el constructor de control personalizado, tan pronto como usted tiene lo creó). Establézcalo en cualquier procedimiento TNofifyEvent -compatible (privado o protegido, supongo) de su componente. En este procedimiento, puede realizar el repintado, la actualización, etc. que necesite.

Es decir, ¿

constructor TControlPanelItem.Create(AOwner: TComponent); 
begin 
    inherited; 
    FLinesText := TStringList.Create; 
    TStringList(FLinesText).OnChange := LinesChanged; 
end; 

procedure TControlPanelItem.LinesChanged(Sender: TObject); 
begin 
    // Repaint, update or whatever you need to do. 
end; 
+0

Ya estoy haciendo eso. Ver el procedimiento tControlPanelItem.SetLinesText que llama a SetText. (El procedimiento SetText no está completo. Solo estoy usando showmessage para ver si está funcionando) –

+0

OK, no vi eso. (Como saben, ¡el código no era bonito hace unos minutos!) ¿Pero no puedo ver ningún 'OnChange'? –

+0

Hola. Gracias por tu pronta respuesta. ¿FLinesText es una lista de cadenas y no tiene una propiedad onchange por lo que sé? –

Cuestiones relacionadas