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 :

[Langage] Déclaration de classes internes


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Par défaut [Langage] Déclaration de classes internes
    Bonjour,

    Je suis très habitué au C++, et démarrant un nouveau projet en Delphi, je suis confronté à quelques soucis avec le language.

    Je déclare une unité contenant une classe TConvert dans la section interface. Cette classe doit utiliser d'autres objets de type TInterne en interne. Je souhaites donc déclarer TInterne dans la section implémentation de cette unité car je ne veux pas qu'elle soit visible de l'extérieur. Mon problème, c'est que je ne sais pas comment déclarer des membres privés de ma classe TConvert de type TInterne. Le compilateur refuse de compiler. Est-ce tout simplement possible ?

    Par ailleurs, est-ce que quelqu'un peut me dire s'il est possible de déclarer des classes à l'intérieur d'une autre classe ?

    Merci d'avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Par défaut
    Bonjour

    il y a une astuce de syntaxe pour faire ça

    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
     
    type
      TGEN=class;    //declaration forward
     
      //section header
      THeader=class(TObject)
        public
          Owner:TGen;
          constructor create(Owner:TGen);
          destructor destroy;override;
        end;
     
    ......
    ......
     
      //Objet principal (contient tous les autres objects)
      TGEN=class(tobject)      //declaration de la classe
      public
        Header:THeader;               //header
        constructor create;                            //constructor create
        destructor destroy;override;                   //destructor destroy
    end;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Par défaut
    Merci de vos réponses.
    Mon problème vient du fait que ma classe TConvert doit se trouver dans la section interface (pour que les utilisateurs de mon unité puisse s'en servir) et que ma classe TInterne doit se trouver dans la section implementation (elle ne doit pas être visible pour l'utilisateur de l'unité).

    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
     
    interface
     
    type
     
      TInterne = class;   <== Le type 'TInterne' n est pas encore complétement défini.
     
      TConvert = class
      private
        a: TInterne;
        ...
      end;
     
    implementation
     
    type
      TInterne = class
        ...
      end;
     
    [Code de la classe TInterne]
     
    [Code de la classe TConvert]
    Si j'essaye ça, le compilateur ne permet pas de terminer la déclaration de ma classe dans la section implementation.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 479
    Par défaut
    salut

    il te sufit de declarer un type ancetre "visible" de ta class TInterne
    par exemple TObject
    et ensuite le transtyper dans la partie implementation


    @+ Phil

  5. #5
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Selon ta version de Delphi, essaye quelque chose du type :
    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
    interface
    type
     
    TExterne = class
    private
     type 
       TInterne = class
       public 
         procedure proc;
       {...}
       end;
    var
       A,B : TInterne;
    {...} 
    end;
     
    implementation
     
    procedure  TExterne.TInterne.proc;
    begin
     
    end;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Par défaut
    gb_68: Merci de ta réponse.

    J'aurais été très content si j'avais pu déclarer des classes à l'intérieur d'une autre classe ! Malheureusement, le compilateur ne veut absolument pas entendre parler d'une clause type à l'intérieur d'une classe !

    Si je comprends bien, c'est possible de faire ce que tu dis à partir de quelle version de Delphi ?

    Pour info, je travaille avec la version 7.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Par défaut
    Si je me souviens bien,

    Tu dois rajouter au dessus de la classe qui utilises l'autres classe la signature de la classe utilisée.

    Une autre solution qui devrait marché serait de d'abord déclarer la classe qui sera utilisée dans l'autres classe et ensuite l'autre classe.


    Quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    TClasseA = Class;
    TClasseB = Class
      protected
      private
      ffChampB : TClasseA;
      public
    end;
     
    TClasseA = Class
       private
       ffChampA : integer;
    end;

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/03/2007, 21h20
  2. Réponses: 5
    Dernier message: 10/11/2004, 19h44
  3. [heritage] etendre une classe interne en dehors du package
    Par ChristopheH dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2004, 14h15
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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