2010-10-29 3 views
6

Je crée mon premier composant Delphi personnalisé. C'est fondamentalement un Tpanel fait sur commande avec le texte d'en-tête et de lignes affiché dessus.Comment implémenter une propriété stringlist dans un composant delphi personnalisé?

Je souhaite pouvoir ajouter plusieurs lignes de texte à l'aide d'une liste de chaînes.

Lors du test de la composante je ne peux pas obtenir les lignes de texte à afficher sur le panneau lors de l'ajout de lignes: NewLinesText.add (« texte line1 »)

Il ne fonctionne cependant quand je créer et alimenter une nouvelle stringlist lors de l'exécution puis l'assigner à mon contrôle: controlPanelitem.NewLinesText = MyNewStringlist

Je veux être en mesure d'ajouter des lignes comme ceci: NewLinesText.add (« text line1 »)

J'utilise professionnel Delphi 7 sur Windows XP. Voir le code ci-dessous.

Toute aide serait appréciée!

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.

Répondre

8

Vous devriez faire

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

Vous devrez peut-être définir la propriété OnChange du FLines (faire dans le constructeur de votre contrôle personnalisé, dès que vous avez l'a créé). Réglez-le à toute TNofifyEvent -compatible (privé ou protégé, je suppose) procédure de votre composant. Dans cette procédure, vous pouvez faire la repeindre, la mise à jour, etc. dont vous avez besoin.

qui est, ne

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

que je fais déjà. Voir la procédure tControlPanelItem.SetLinesText qui appelle SetText. (procédure SetText n'est pas complète Im juste using showmessage pour voir si cela fonctionne) –

+0

OK, je n'ai pas vu cela. (Comme vous le savez, le code n'était pas joli il y a quelques minutes!) Mais je ne vois pas de 'OnChange'? –

+0

Bonjour. Merci pour votre réponse rapide. FLinesText est une liste de chaînes et n'a pas de propriété onchange autant que je sache? –

Questions connexes