2010-10-29 2 views
6

Ich erstelle meine erste benutzerdefinierte Delphi-Komponente. Es ist im Grunde eine benutzerdefinierte Tpanel mit Header und Zeilen Text darauf angezeigt.Wie kann eine Stringlisteneigenschaft in eine benutzerdefinierte Delphi-Komponente eingefügt werden?

Ich möchte mehrere Zeilen Text mit einer Stringliste hinzufügen können.

Wenn die Komponente testen kann ich nicht die Textzeilen bekommen auf dem Panel angezeigt wird, wenn Zeilen hinzufügen: NewLinesText.add (‚line1 Text‘)

Es ist jedoch nicht funktioniert, wenn ich schaffen und einen neuen String zur Laufzeit füllen und ordnen sie dann zu meiner Kontrolle: controlPanelitem.NewLinesText = MyNewStringlist

ich möchte in der Lage sein, Zeilen hinzufügen wie folgt aus: NewLinesText.add ('line1 Text')

ich bin mit Delphi 7 Professional auf WinXP. Siehe Code unten.

Jede Hilfe wäre willkommen!

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.

Antwort

8

sollten Sie tun

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

Sie auch die OnChange Eigenschaft des FLines (tun dies im Konstruktor der benutzerdefinierten Kontrolle, müssen so schnell einstellen, wie Sie erstellt es). Stellen Sie es auf eine beliebige TNofifyEvent-kompatible (private oder geschützte, ich denke) Prozedur Ihrer Komponente. In diesem Verfahren können Sie die erforderlichen Neuanstriche, Aktualisierungen usw. durchführen.

Das heißt, tun

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

ich schon, dass tue. Siehe die Prozedur tControlPanelItem.SetLinesText, die SetText aufruft. (Prozedur SetText ist nicht abgeschlossen. Ich verwende nur showmessage, um zu sehen, ob es funktioniert) –

+0

OK, das habe ich nicht gesehen. (Wie Sie wissen, war der Code vor ein paar Minuten nicht schön!) Aber ich kann keinen 'OnChange' sehen? –

+0

Hallo. Vielen Dank für Ihre schnelle Antwort. FLinesText ist eine Zeichenfolgeliste und hat, soweit ich weiß, keine onchange-Eigenschaft? –

Verwandte Themen