
Envoyé par
Kanter
Bonjour à tous,
je cherche la manière de définir un Tstrings comme variable ou constante.
J'ai beau me creuser la tête mais rien n'y fait... Voici mon code...
1 2
| Var
Flags : TStrings = ['A','B','C','D','E','F','G','H','I']; |
mais ca ne fonctionne pas... ca doit etre simple mais je dois avouer que je sèche...
Google, le forum, rien n'y fait...
Merci
Déjà, 1ère chose, Tstrings est une classe abstraite :
on ne déclare pas un objet à partir d'une classe abstraite (parce que les méthodes déclarées ne sont pas forcément toutes implémentées), on déclare plutot l'un de ses décendants. Par contre, lorsqu'on ne sait pas à priori quel classe dérivée va être passé à une procédure, le paramètre est,lui, défini avec la classe abstraite.
Exemples :
Classe abstraite :
TStrings
Objets que l'on déclare :
TStringList,
THashStringList
Exemple de déclaration de procédure :
function StringListToString(UneListe:TString):string;
Utilisation de la procédure :
s:=StringListToString(MaListe);
Classe abstraite :
TStream
Objets que l'on déclare :
TMemoryStream,
TFileStream,...
1 2
| var MonFichierDisqueDur:TFileStream;
MonFichierenMemoire:TMemoryStream; |
Exemple de déclaration de procédure :
procedure SaveStringToStream(s:string;UnFLux:TStream);
Utilisation de la procédure :
1 2
| SaveStringToStream('Coucou',MonFichierDisqueDur);
SaveStringToStream('Salut',MonFichierenMemoire); |
Classe abstraite :
TWinControl
Objets que l'on déclare :
TForm,
TPanel,
TLabel,...
1 2 3
| var Form1:TForm;
Panel1:TPanel;
Label1:TLabel; |
Exemple de déclaration de procédure :
function ObtenirCaption(UnControleFenetre:TWinControl):string;
Utilisation de la procédure :
1 2 3
| s:=ObtenirCaption(Form1);
s:=ObtenirCaption(Panel1);
s:=ObtenirCaption(Label1); |
2ème remarque : on ne peut pas déclarer un objet comme constante (mais il y a d'autres moyens).
si tu déclares ceci :
en fait, MaListe est un pointeur sur une zone mémoire qui comprendra les variables de la classe et une variable particulière, l'instance, qui pointe sur les différentes méthodes de la classe.
L'instance d'une classe est toujours accessible via le type de la classe, heureusement et celà nous permet toujours de pouvoir accéder à certaines méthodes, lorsqu'aucun objet n'existe pas encore :
Ici, le créate, crée la zone de mémoire pour un nouvel objet, et l'adresse de cette zone de mémoire est transmise à notre pointeur :
MaListe:=TStringList.Create;
Si le Create échoue, on aura MaListe=nil, sinon, MaListe contiendra une adresse, et on pourra accéder aux différentes zones mémoires de l'objet nouvellement créé :
1 2
| if MaListe<>nil then
MaListe.Text:='Coucou tout le monde'; |
Ceci pour expliquer que l'on ne peut pas à la fois déclarer un pointeur (ça on peut) et allouer une zone mémoire (dans la partie const, on ne peut pas le faire) en même temps afin d'obtenir une constante sur un objet.
Mais il y a d'autres moyens... 
- TStringList possède une propriété Text, qui accepte une chaîne de caractère (string). Donc on peu affecter à un TStringList une constante chaîne :
1 2
| const
FFlagsString='A'#13#10'B'#13#10'C'#13#10'D'#13#10'E'#13#10'F'; |
- Tu peux très bien déclarer une variable globale de type TStringList, et créer et détruire l'objet dans les blocs Initialization et finalization de ton unité. Ainsi tu aura créé une espèce de TStringList constante
Démonstration :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
const
FFlagsString='A'#13#10'B'#13#10'C'#13#10'D'#13#10'E'#13#10'F';
type
TForm1 = class(TForm)
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
FFLags :TstringList;
implementation
{$R *.dfm}
initialization
FFLags:=TStringList.Create;
FFLags.Text:=FFlagsString;
finalization
FFLags.Free;
end. |
Bon dev
Partager