TStudent c'est une classe pas une méthode
Idem TDictionary c'est une classe
Envoyé par
beletot
Il attends un objet ? Mais pourquoi ?
Parce que le Delphi est un langage très fortement typé contrairement au PHP
Sauf qu'avec les génériques, le fort typage devient plus difficile à appréhender mais il est toujours là lors de la spécialisation de la générique
En PHP, tu peux avoir un contrôle de type, par exemple sur une fonction tu peux spécifier la classe d'un paramètre, je t'invite a consulter la page Manuel PHP ›Référence du langage ›Les classes et les objets ›Typage Objet
En Delphi, c'est tout le temps typé !
Il te faut bien appréhender ce principe !
Du coup, il faut savoir lire la documentation
Et comme tu ne sembles pas maitriser le fait qu'un objet est une référence (un pointeur),
il semble normal que tu dois dérouter par le IndexOf de la TObjectList et encore plus avec la couche générique
Attention il existe deux TObjectList
- System.Generics.TObjectList
function IndexOf(const Value: T): Integer;
Le T c'est forcément un TObject
Normalement, tu aurais du déclarer System.Generics.TObjectList<TStudent>;
et le compilateur va générer une méthode
function IndexOf(const Value: TStudent): Integer;
Et c'est pour cela que le compilateur à réclamer un TStudent pour ton IndexOf et refusé le type string car TStudent joue le role de T
Générique mais fortement typé !
- System.Contnrs.TObjectList
function System.Contnrs.TObjectList.IndexOf(AObject: TObject): Integer;
Avec cette syntaxe, tu aurais tu de suite vu que cela réclame un TObject, en gros cela cherche juste le pointeur dans la liste
Le gros avantage de la System.Generics.TObjectList
c'est que l'on peut écrire
StudentList.Items[I].Year := 72;
alors qu'avec System.Contnrs.TObjectList
il faut écrire
1 2
|
(StudentList.Items[I] as TStudent).Year := 72; |
La TStringList, depuis Delphi 2009, je crois, gère le OwnsObjects
la TStringList pour simuler un tableau associatif PHP, ca fonctionne
Effectivement pour stocker des objets, la TObjectList est souvent un meilleur sauf si as besoin d'un index texte
Dans ton cas l'index texte c'est le nom, ce n'est pas un très bon index mais c'est ton choix
la TStringList suffit pour un projet scolaire.
Le nom de famille n'est pas forcément une clé unique, tu pourrais avoir plusieurs DUPONT
la TStringList accepte les doublons selon la valeur de Duplicates
tu peux aussi utiliser le System.Generics.Collections.TObjectDictionary<string, Tstudent>
le TObjectDictionary c'est comme le TDictionary mais gère un doOwnsValues pour une libération automatique
C'est un peu plus moderne, mais cela ne change pas grand chose.
Le gros avantage est le même qu'avec la TObjectList, c'est le transtypage implicite de l'objet grâce au générique.
TObjectDictionary n'accepte pas les doublons
Pour un projet professionnel, on va plutôt créer un type de liste dediée (soit par héritage soit par encapsulation) avec ses propres méthodes IndexOfNom, IndexOfPrénom ...
Très vite cela peut devenir pénible pour les recherches multi-champs
et dans ce cas un DataSet et sa méthode Locate ou la propriété Filter c'est plus pratique
Pour ma part, la seule fois où j'utilise Objects d'un TStrings c'est parce que c'est lié à un TComboBox, TListBox ...
Le TObjectDictionary, TObjectList ... c'est plutôt lié à du code technique
Tout le reste c'est à base de DataSet, et j'ai des classes ORM qui encapsule les DataSet pour les utiliser comme des classes Entité un peu comme ton TStudent
Partager