Problème stringlist

Signaler
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007
-
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
-
bonjour ,j'ai cré un type de cette manière :


type

  TDomCI = record

    Nom: string[100];

    Centres: tstrings;

  end;

  TDomFile = file of TDomCI;



//une variable 

domaines : array of TDomCI;



et je n'arrives pas a accéder au centres, quand je lis un fichier.

par exemple j'ai fait ça:




procedure TFrmAddCI.loaddom;

var

  Fichier: TDomFile;

  ChemFich : string;

  i:integer;

begin

 lstdom.items.clear;

 setlength(domaines,0);

  chemfich :=  extractfilepath(application.ExeName)+'dom.dat';

  //showmessage(chemfich);

   AssignFile(Fichier,chemfich);

     if FileExists(chemfich) then

    Reset(Fichier)

  else

    Rewrite(Fichier);

  Seek(Fichier, 0);

   while not Eof(Fichier) do

    begin

    setlength(domaines,length(domaines)+1);

    domaines[length(domaines)-1].Centres := tstringlist.Create;

      Read(Fichier, domaines[length(domaines)-1]);



    end;

  CloseFile(Fichier);



  for i := 0 to length(domaines)-1 do

    lstdom.AddItem(domaines[i].Nom,self);



end;





et si j'éssaie d'accéder aux données 'centres' j'ai une erreur mémoire!



lstci est la liste contenant la propriété centres


lstdom est la liste contenant la propriété nom du type



par exemple, j'ai deux list, je veux que l'une contienne les propriétés
nom du type, et que quand je cliques il chage la stringliste de cet
item dans l'autre liste.

j'ai fait ce code la:


procedure TFrmAddCI.LstDomClick(Sender: TObject);

begin

if (domaines[lstdom.ItemIndex].Centres.Count > 0) then

lstCI.Items := domaines[lstdom.ItemIndex].Centres;

end;





Merci de m'aider :D parce que la je sèche vraiment

1 réponse

Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006

Bon, alors en delphi toutes variables les objets sont des pointeurs,
Or TStrings est une classe, ( donc centres un Objet ) donc tu stock dans ton fichier le pointeur, mais pas l'objet en lui même. Si tu etteind ton programme et que tu le ralume, l'objet en lui même n'est plus créé et le pointeur pointe sur... rien ^^ d'où l'erreur de memoire.
Ca c'est pour la premiere erreur ^^

while not Eof(Fichier) do
begin
setlength(domaines,length(domaines)+1);
domaines[length(domaines)-1].Centres := tstringlist.Create;
Read(Fichier, domaines[length(domaines)-1]);
end ;

domaines[length(domaines)-1].Centres : = tstringlist.Create;

Ici tu créer ton objet Centres

Read(Fichier, domaines[length(domaines)-1]);

Et ici tu écrase completement le Record ( et donc le pointeur Centres ) tu as donc créé un objet TStrings auquel tu ne peux plus acceder.

bouh