Liste d'objets

Résolu
Signaler
Messages postés
3
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
10 décembre 2004
-
Messages postés
3
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
10 décembre 2004
-
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

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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
Messages postés
3
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
10 décembre 2004

Merci pour ton exemple de code.
Ca marche en plus !

Merci beaucoup.

Free your mind ...