TStrings qui fait planter le prog

Sylvainlefou Messages postés 43 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 15 février 2006 - 16 janv. 2004 à 21:34
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008 - 16 mai 2005 à 23:24
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

yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
16 janv. 2004 à 22:27
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
0
Sylvainlefou Messages postés 43 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 15 février 2006
17 janv. 2004 à 10:31
Ok Merci beaucoup !! :big)
0
alexis2015 Messages postés 73 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 24 juillet 2005
16 mai 2005 à 20:24
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.
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
16 mai 2005 à 23:24
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
0
Rejoignez-nous