TStrings qui fait planter le prog

Signaler
Messages postés
43
Date d'inscription
vendredi 27 décembre 2002
Statut
Membre
Dernière intervention
15 février 2006
-
Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008
-
Je debute en Pascal sur Delphi 7 (je vien du vb ;-))
J'ai un problem de "plantage" a cause d'une TStrings !
C'est surement moi qui ne sais pas m'en servir mais bon je vous met quand même le code :

var
  Aaa: TStrings;

procedure TForm1.FormCreate(Sender: TObject);
begin
Aaa.add('essai');
end;


Il me met EAccessViolation.... at adresse : 00467A68
Voila j'aimerai savoir si cette erreur est normal vu mon code et surtout comment reparer ce bug ??
Merci

PS : J'ai besoin d'une TStrings pour ce que je veu faire malheureusement

4 réponses

Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

procedure TForm1.FormCreate(Sender: TObject);
var
Aaa: TStringList;
begin
Aaa:=TStringList.Create;
Aaa.add('essai');
Aaa.add('essai1');
//Aaa.Strings[0]=essai
//Aaa.Strings[1]=essai1
Aaa.Clear;
Aaa.Free;
end;

évidemment pour voir le résultat faudra l'associer à quelque chose exemple: label1.caption:=Aaa.Strings[0];

en delphi il ne suffit pas d'énumérer certaines variables pour pouvoir s'en servir ,
un Integer est par défaut indéfini
un booléen est par défaut à false
etc...

mais pour les objets il faut en général appeler le constructeur
et tenter de les détruires lorsque l'on a terminé à la limite dans l'événement OnClose de la fiche

mais dans l'exemple que tu envois la variable utilisé n'est visible que pour la procédure FormCreate alors il faut la détruire à la fin de cette procédure (nb.pour les listes il faut en plus vider avant)...

tu peux déplacer la variable Aaa au niveau de l'unité pour qu'elle soit visible par toutes les procédures que tu créeras...

var
Form1: TForm1;
Aaa: TStringList;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//attention !!! ne jamais créer 2 fois le même objet
if(Aaa=nil)then
begin
Aaa:=TStringList.Create;
Aaa.add('essai');
Aaa.add('essai1');
//Aaa.Strings[0]=essai
//Aaa.Strings[1]=essai1
end;
// test d'affichage
{ label1.Caption:=Aaa.Strings[0]; }
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//attention !!! ne jamais libérer 2 fois le même objet
if(Aaa<>nil)then
begin
Aaa.Clear;
Aaa.Free;
end;
end;

yve
Messages postés
43
Date d'inscription
vendredi 27 décembre 2002
Statut
Membre
Dernière intervention
15 février 2006

Ok Merci beaucoup !! :big)
Messages postés
73
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
24 juillet 2005

moi j'ai un autre problème ...



CODE :


...

var

Form1: TForm1;

sub,flist : TStrings;



implementation



...



procedure TForm1.FormCreate(Sender: TObject);

begin

if (subnil ) <gras>then sub:</gras>TStrings.Create;

end;



procedure Tform1.additem(...); //paramètres sans inportance

begin

...

sub.clear; // je vide la liste car je la réutilise plusieur fois.

sub.add('ma 1ere ligne');

sub.add('ma 2eme ligne');

...

end;



...



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

...

if (sub<>nil) then begin sub.Clear; sub.Free; end;

...

end;





et j'ai 'abstract erro' lorsque je fais appel à la procedure "Additem"...

HELP ME PLZ.
Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

ouais tente de vérifier en pas a pas d'ou viens le problème ...

procedure Tform1.additem(...); //paramètres sans inportance
begin
...

try
if sub= nil then
begin
application.messageBox('liste sub objet non créer,'',mb_ok);
sub:=TStrings.Create;
except

application.messageBox('liste impossible de creer la liste','',mb_ok);
end;

try

sub.clear; // je vide la liste car je la réutilise plusieur fois.
except

application.messageBox('erreurclear','',mb_ok);
end;

sub.add('ma 1ere ligne');
sub.add('ma 2eme ligne');
...
end ;

sinon modifie sub: =TStrings.Create;
par sub:=TStringsList.Create;

yve