Liste d'objets

Résolu
okemobi Messages postés 3 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 10 décembre 2004 - 8 déc. 2004 à 23:52
okemobi Messages postés 3 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 10 décembre 2004 - 10 déc. 2004 à 23:10
Bonjour,

J'essaie de créer une liste d'objets avec une TList.
Hypothèses :
- J'ai une classe d'objet TMyClass avec ses propriétés et méthodes,
- j'ai une autre classe TMySuperClass qui outre ses propriétés et méthodes possède une propriété qui est en fait une liste de la première classe.

Voici comment se présente mon code :

TMySuperClass = class
...
MyList : TList;
...
end;

procedure TMySuperClass.LoadData();
var
MyClass : ^TMyClass;
begin
// Une requête quelconque hébergée dans une TQuery
MyQuery.Open;

// Je boucle sur tous mes enregistrements
// 1 enregistrement = 1 instance de MyClass
For nCount := 0 To MyQuery.RecorCount - 1 do
begin
New(MyClass);
MyClass.Prop1 := MyQuery.FieldValues[...];
MyClass.Prop2 := MyQuery.FieldValues[...];
...
MyClass.Propn := MyQuery.FieldValues[...];
MyList.Add(MyClass);
MyQuery.Next;
end;
end;

La bizarrerie que j'ai est que la première boucle s'effectue correctement mais dès que j'essaie de passer à l'enregistrement suivant, j'ai un message du type "Memory Access Violation". Cela se produit au moment du "Next".
Plus bizarre encore, si je veux faire l'affectation de ma dernière propriété avant celle d'une propriété précédente, alors j'ai le même message d'erreur.

Si quelqu'un a une idée, ce serait super sympa.

Merci par avance.

Free your mind ...

2 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 déc. 2004 à 00:36
Okemobi, tu n peux pas cacher que tu as fait du C avant de passer à Delphi, il en reste des séquelles :)

Evite d'utiliser New pour créer des objets et appelle le constructeur de la classe pour créer une instance. De même, n'utilises pas Dispose pour libérer les éléments de la liste mais appelle la méthode Free de chaque objet pointé par la liste.

procedure TMySuperClass.LoadData();
var
  //une variable de la classe TMyClass
  MyClass : TMyClass;
begin
// Une requête quelconque hébergée dans une TQuery
MyQuery.Open;

// Je boucle sur tous mes enregistrements
// 1 enregistrement = 1 instance de MyClass
For nCount := 0 To MyQuery.RecorCount - 1 do
begin
  //PAS DE NEW !
  MyClass := TMyClass.Create;
  MyClass.Prop1 := MyQuery.FieldValues[...];
  MyClass.Prop2 := MyQuery.FieldValues[...];
...
  MyClass.Propn := MyQuery.FieldValues[...];
  MyList.Add(MyClass);
  MyQuery.Next;
end;
end;


En plus, ton code sera compatible avec .Net !

Alors, faut pas hésiter.
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
3
Rejoignez-nous