IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Problème avec un TList


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut Problème avec un TList
    Bonjour,
    L'aide de Delphi était perfectible avec delphi6.

    avec l'édition 2005 perso, c'est carrément à vomir.

    Plus aucun exemple de code, le MS_prout document explorer qui ne connait pas la lecture dans un autre onglet, et google est plus que laconique sur les exemples d'utilisation de TList delphi.

    Je veux faire une liste de classes.

    Pas de pb à la création

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          mon_instance := TMaClasse.Create;
          ma_Liste.Add(@mon_instance);
          mon_instance.champ1 := toto1;
          mon_instance.champ2 := toto2;
    Par contre, au debug :

    ma_Liste.Items[0]^ me retourne : (no value)

    Déjà, je pige pas : pourquoi ma_Liste.Items[0]^ ne retourne pas le contenu de mon_instance ?

    Comment puis-je affecter les 2 champs qui sont pointés par ma_Liste.Last ?

    ma_Liste.Last^.champ1 n'est pas accepté par le compilo

    Merci pour votre aide.

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Citation Envoyé par delphidebutant Voir le message
    ma_Liste.Items[0]^ me retourne : (no value)
    Déjà, je pige pas : pourquoi ma_Liste.Items[0]^ ne retourne pas le contenu de mon_instance ?
    ma_Liste.Items[0] te renvoie un Pointeur sur ton instance, mais un pointeur non typé (Pointer). Pour accéder à ton instance, il faut transtyper ce pointeur par un pointeur spécifique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type PMaclasse = ^TmaClasse;
    P : PMaclasse;
    P := ma_Liste.Items[0]);
    Tu te simplifierais un peu la vie en utilisant TObjectList au lieu de TList. Il te suffirait de transtyper en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMaclasse (ma_Liste.Items[0])
    pour avoir ton instance.

    Après, pour Last, c'est le même topo.
    Roland

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    Voilà qui est + clair.

    Ici, j'ai trouvé mon bonheur,
    http://nono40.developpez.com/sources/source0004/

    je sais pas s'il y a une telle aide pour les TList sur ce site.
    Ce serait pas mal, pour ce truc basique, mais je suis audidacto-bidouilleur.
    Là, j'avais rien trouvé dans la FAQ du langage.

    En tout cas, super merci pour ton explication

    PS : c'est là où voit que l'aide delphi est vraiment caca boudin

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ATTENTION ! les classes sont déjà des pointeurs !!!

    @mon_instance c'est un pointeur sur un pointeur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
     ma_liste:TList;
     mon_instance:TMaClasse;
    begin
     ma_liste:=TList.Create;
     mon_instance:=TMaClasse.Create;
     ma_liste.Add(mon_instance);
     
     TMaClasse(ma_liste[0]).Champ1...
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    ATTENTION ! les classes sont déjà des pointeurs !!!
    AAh ben un truc dont je n'avais pas conscience

    ce qui est bizarre, c'est que :

    ma_liste.Add(mon_instance) permet au compilo de savoir quelle est la taille de l'objet pointé, puisque mon_instance est explicite.

    Donc, on ne devrait pas être obligé de mettre TMaClasse( ..), dans la ligne

    TMaClasse(ma_liste[0]).Champ1...
    ou un truc m'échappe

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    soit une liste de pointeurs, chacun peut pointer sur un type de donnée différent, donc à toi de savoir quel pointeur correspond à quel type.

    quand on loge un pointeur dans la liste, on passe une adresse en sachant à quel objet elle correspond, mais quand on la récupère, on ne récupère qu'une adresse, sans savoir ce qui y est stocké.

    c'est donc juste l'adresse de l'objet que l'on stocke dans la liste, ou l'adresse du booléen, ou celle d'une chaîne, d'un entier...

    si tu dois loger un seul type de données, autant dériver un T(Object)List et surcharger ses méthodes pour qu'elles se chargent de transtyper.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Citation Envoyé par delphidebutant Voir le message
    ce qui est bizarre, c'est que :
    ma_liste.Add(mon_instance) permet au compilo de savoir quelle est la taille de l'objet pointé, puisque mon_instance est explicite.
    Donc, on ne devrait pas être obligé de mettre TMaClasse( ..),
    Même si la taille était stockée (ce qui sauf erreur de ma part est le cas pour TobjectList, mais pas TList), ça ne déterminerait pas la structure de l'objet.

    Maintenant, rien n'empêche effectivement d'imaginer que le fait d'affecter un pointeur à une variable (obligatoirement typée dans Delphi) effectue automatiquement le transtypage... Simplement, "c'est pas comme ça !"
    Roland

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec TList et Threads
    Par necralbert dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2007, 14h12
  2. Problème avec Sort() sur un TList
    Par ViNzZz dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2006, 14h45
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo