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

Langage Delphi Discussion :

Accès aux enfants d'un objet


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut Accès aux enfants d'un objet
    Bonjour, pour faire suite à ma dernière requête et mon souhait de passer vers la POO:
    J'ai 2 classes, TGroupe et Tpoint
    J'ai 10 points et 2 groupes (en fait,100 000 et 1000)
    le groupe 1 à 3 points, le 2 les autres

    comment chainer les points d'un groupe et récupérer les points d'un groupe?

    En mettant en var Groupe:TGroupe dans le TPoint, puis faire un test sur la var?
    Pour les chainer, en mettant une var contenant l'adresse de l'objet suivant?

    Finallement,c'est comme les listes chainées des records et des pointers?
    Explication SVP ou lien vers bon tuto
    Merci d'avance.
    A+

  2. #2
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut Oups...

  3. #3
    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 448
    Points
    28 448
    Par défaut
    il y a plusieurs façon de gérer cela, l'approche dépendra de tes traitement.

    par exemple si TPoint possède des méthodes qui font référence à son groupe, il aura besoin d'une référence à celui-ci...

    si le nombre de point d'un groupe est fixe ou variable, si tu dois pouvoir insérer un point, à ces différents cas de figure les différentes solutions ne sont pas équivalentes.

    par exemple TGroupe peut contenir :
    - un TList (ou dérivé) de TPoint
    - un Array of TPoint
    - une référence au premier point du groupe (liste chaînée)

    TPoint contiendra :
    - rien de particulier,
    - une référence à TGroupe si nécessaire
    - une référence au point suivant dans le groupe (liste chaînée)
    - une référence au point précédent dans le groupe (liste chaînée bidirectionnelle)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Merci de répondre

    Je vais opter pour la TList

    Autre question, comment éviter le problème des références circulaire si je défini une unitée(fichier) par classe

    merci

  5. #5
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Et une autre SVP

    si je met un Liste:TList dans le TGroupe, dois je dans le constructeur de TGroupe faire
    Liste:=TList.create;

    puis dans le destructeur,
    vider la liste puis Liste.free

    Merci

  6. #6
    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 448
    Points
    28 448
    Par défaut
    tout à fait, à la différence des composants que l'on pose sur la fiche est qui sont référencés dans le fichier DFM, toutes les classes déclarées manuellement doivent être créées et détruites manuellement.

    pour ce qui est de la référence circulaire, voir ici
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Bonjour
    C'est incompréhensible.
    Un exemple SVP avec 2 classes et la solution "élégante des interfaces"
    merci d'avance

  8. #8
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par lio908 Voir le message
    Bonjour
    C'est incompréhensible.
    Un exemple SVP avec 2 classes et la solution "élégante des interfaces"
    merci d'avance
    incompréhensible ?! alors là je suis blessé, moi qui m'efforce de vulgariser la programmation en Pascal depuis ... un certain temps

    il doit bien y avoir un tuto sur les Interface sur ce site non ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73

  10. #10
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut Dur dur
    Dans l'unit5
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      unit unit5;
     
      interface
      uses Classes,unit4;
     
      type
       ICDComponent = Interface
     
        public
         function GetInstance:TPersistent;
         procedure ListeModifiee(Item:TMP3Item); 
        end;
     
      implementation
     
      end.
    le public est il bien à ça place ?

    Sinon, j'ai crée une Interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    unit BaseObjetVRML2;
     
    interface
     
    uses
       Classes,
       Fichier,
       Groupe,
       Face,
       Couleur,
       POint;
     
    type
     
       I_VRML2 = Interface
          Procedure AddGroupe(_Groupe: pGroupe);
          Function GetGroupe: pGroupe;
       end;
     
    implementation
     
    end.
    Puis ma classe TFichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    unit Fichier;
     
    interface
     
    uses
       Classes,
       Contnrs,
       opengl,
       StdCtrls,
       FonctionsChaine,
       BaseObjetVRML2;
     
    type
       pFichier = ^TFichier;
     
       TFichier = class(TObject, I_VRML2)
       private
          List: GLuint;
          ListeGroupe: TObjectList;
       public
          constructor Init;
          Procedure AddGroupe(_Groupe: pGroupe);
          Function GetGroupe: pGroupe;
     
          procedure SetNom(Terme: string);
          procedure SetList(GlNum: GLuint);
          function GetNom: string;
          function GetList: GLuint;
          destructor Destroy; virtual;
       end;
     
       pListeFichier = ^ListeFichier;
     
       ListeGroupe = record
          Groupe: pFichier;
          suivant: pListeFichier;
       end;
     
    implementation
    et ma classe TGroupe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    unit Groupe;
     
    interface
     
    uses
       Classes,
       Contnrs,
       opengl,
       StdCtrls,
       BaseObjetVRML2;
     
    type
     
       pGroupe = ^TGroupe;
     
       TGroupe = class(TObject, I_VRML2)
       private
          ListeCouleur: TObjectList;
          ListePoint: TObjectList;
          ListeFace: TObjectList;
       public
          constructor Init;
          procedure SetNom(_Terme: string); virtual;
          procedure SetFichier(_Fichier: pFichier); virtual;
     
          procedure AddCouleur(_Couleur: pCouleur);
          procedure AddPoint(_Point: pPoint);
          procedure AddFace(_Face: pFace);
          function GetNom: string; virtual;
          function GetFichier: pFichier; virtual;
          destructor Destroy; virtual;
       end;
     
       pListeGroupe = ^ListeGroupe;
     
       ListeGroupe = record
          Groupe: pGroupe;
          suivant: pListeGroupe;
       end;
     
    implementation
    Mais y a beaucoupe de rouge par delphi!!!

    Notament au niveau de l'appel dans TFichier du Addgroupe ou le pointer n'est pas reconnu.
    de meme dans le Uses de TFichier et Tgroupe, le
    est en rouge
    et l'appel a I_VRML2 dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TFichier = class(TObject, I_VRML2)
    est en roupe!!

    Je pense que je m'y prend mal
    Help

  11. #11
    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 448
    Points
    28 448
    Par défaut
    en effet

    déjà, pFichier = ^TFichier et autres déclarations de ce genre sont rarement justifiées.

    sous Delphi les classes sont implicitement des pointeurs !

    ensuite ne pas oublier qu'en déclarant TFichier et TGroupe dans la même unité, il n'y a plus de problème

    si tu désires absolument les déclarer dans deux unités il y a en effet problème.

    pour utiliser la méthode que je préconiser avec les Interfaces deux solutions:

    déclarer une interface IGroupe et l'utiliser dans TFichier.AddGroup(Groupe: IGroupe);

    ou déclarer une interface IFichier et l'utiliser dans TGroupe.Get/SetFichier(Fichier: IFichier);

    le principe général étant que l'interface permet de récupérer l'instance de l'objet voulu sans avoir à déclarer son type.

    car il faut casser la référence circulaire dans une des deux unités (au moins); l'interface est là justement pour cela.

    Ceci dit, si tes classes dérivent de TObject, la méthodes de la classe virtuelle abstraite est plus indiquée, si TFichier fait référence à des TCustomGroupe alors que seul le dérivé TGroupe fait référence à TFichier, la référence circulaire est contournée.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    OK

    Au fait,
    déjà, pFichier = ^TFichier et autres déclarations de ce genre sont rarement justifiées.

    sous Delphi les classes sont implicitement des pointeurs !
    Pourquoi dans tous les tuto du site on utilise cette façon de faire

    Si TGroupe doit mémoriser son fichier parent, je dois bien mettre une var fichier:pGroupe dans la classe TGroupe pour le retrouver?

  13. #13
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par lio908 Voir le message
    OK

    Au fait,


    Pourquoi dans tous les tuto du site on utilise cette façon de faire
    ça m'étonnerais...tu as un exemple ?

    Citation Envoyé par lio908 Voir le message
    Si TGroupe doit mémoriser son fichier parent, je dois bien mettre une var fichier:pGroupe dans la classe TGroupe pour le retrouver?
    non un TGroupe car TGroupe est déjà un pointeur, pas la peine de créer un pointeur sur un pointeur.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    ici

    http://hdd34.developpez.com/cours/artpoo/#L2.2

    4.5.2. Instanciation dynamique


    L'instanciation dynamique est certainement la plus utilisée et celle permettant de stocker en mémoire le plus d'objets et d'information. Elle suppose bien entendu une connaissance des pointeurs.

    Afin de pouvoir utiliser le dynamique, il faut commencer par déclarer un pointeur vers le type objet que l'on projette d'utiliser. L'usage veut que cette déclaration se fasse conjointement avec celle de l'objet en lui-même. De même, on choisit généralement de faire figurer la déclaration du pointeur juste avant celle de l'objet.
    Le nom du pointeur pourra reprendre celui de l'objet, en remplaçant le T initial par un P. Par exemple, si l'on considère l'objet TObjet, alors le pointeur vers l'objet sera nommé communément PObjet.

    type PObjet = ^TObjet;
    TObjet = object
    ... end;
    Mais peut être que c'est du pascal Objet, différent de Delphi?

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Oui c'est différent
    note déjà la déclaration

    PascalDelphiIl y a d'ailleurs dans ce cours, cette remarque
    Sous Delphi, l'intanciation étant automatiquement dynamique,
    C'est vrai que mélanger le Pascal Objet d'il y a 20 ans avec le Pascal Delphi, c'est un peu maladroit !
    Surtout avec le mélange de pointeur sur object à ne pas utiliser avec class en Delphi
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  16. #16
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    D'autant plus que les exemples de code dont je m'inspire tournent sous Delphi en mélangeant la syntaxe du pascal objet et ces pointers

  17. #17
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Donc si je veux lister les objets Groupes de l'Objet Fichier, je peux créer une listeDesGroupes:=TObjectList

    et ajouter le Groupe:=TGroupe crée dedans sans faire de pointeur par
    listeDesGroupes.add(Groupe) ?

  18. #18
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par lio908 Voir le message
    Donc si je veux lister les objets Groupes de l'Objet Fichier, je peux créer une listeDesGroupes:=TObjectList

    et ajouter le Groupe:=TGroupe crée dedans sans faire de pointeur par
    listeDesGroupes.add(Groupe) ?
    oui TObjectList est fait pour
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  19. #19
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Donc j'ai crée ma listePoint dans un objet Groupe
    Pour accéder au point num n (n existe) j'ai fait une function suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TGroupe.GetPoint(index: integer): TPoint;
    begin
       GetPoint := ListePoint.Items[index];
    end;
    mais quand je lance j'ai delphi qui me dit type incompatible TPoint et TObject

  20. #20
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    Je viens de remplacer TObjectList par TList et ça passe

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Accès aux propriétés d'un objet
    Par irnbru dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/08/2009, 15h10
  2. Accès aux attributs d'un objet
    Par JeanMi66 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/07/2008, 14h17
  3. [MySQL] Accés aux membres d'un objet PHP
    Par cyrilskof dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/06/2008, 11h58
  4. Pb d'accès aux données d'un objet
    Par richard dans le forum Général Python
    Réponses: 29
    Dernier message: 17/06/2007, 11h17
  5. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01

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