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 :

Probleme de forward


Sujet :

Delphi

Vue hybride

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

    Informations forums :
    Inscription : Février 2003
    Messages : 31
    Par défaut Probleme de forward
    Bonjour,

    Je debute en Delphi, et je suis confronte a un pb, je dois faire un forward de class et je n'y arrive pas, soit j'ai le message Class1 is not yet completely defined, soit circular qqch...

    Voici ce que j'ai fait:
    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
     
    fichier class1.pas
    -----------------------------------
    unit class1;
     
    interface
     
    type
      Tclass2 = class;
     
      Tclass1 = class
      private
        MyName: string;
     
    .
    .
    .
    .
    implementation
     
    uses
      class2;
     
     
    fichier class2.pas
    ------------------------------------
    unit class2;
     
    interface
     
    uses
      class1, SysUtils;
     
    type
      Tclass2 = class(Tclass1)
      private
        MyName: string;
    Je suis alle voir la doc ou il parle de predeclaration, mais je n'arrive pas a trouver mon erreur...

    Merci d'avance pour l'aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Bonjour

    Théoriquement vous devez avoir 2 Unit

    Unit1 contient classe1
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TClasse1 = class(Tobject)
    end;
    Unit2 contient classe2

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TClasse2 = class(TClasse1)
    end;
    Dans votre code vous avez 2 unit
    Unit2 contient une définition de la classe2

    Unit 1 Contient une declaration incorecte de la classe1 et une predeclaration de la classe2

    quand vous ecrivez , cela siginfie que TClasse2 est une classe qui vas être définie plus tard dans l'unit.

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

    Informations forums :
    Inscription : Février 2003
    Messages : 31
    Par défaut
    Bonjour,

    Merci pour votre reponse, j'ai oublie un petit detail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
      TClass2 = class;
      TClass1 = class(Tobject)
      public
        procedure proc1(cl2: TClass2);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type
     TClass2 = class(TClass1)
    end;
    Dans le code de ma class1, j'ai une fonction qui prend en parametre un objet class2, d'ou le forward.
    Est-il possible d'avoir un fichier .pas pour la class1 et un autre pour la class2 ou les deux class doivent etre definie dans le meme fichier .pas?

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Bonjour,


    Les classes peuvent être définies dans des unités distinctes.

    Procédes comme cela :

    Unit2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    unit Unit2;
     
    interface
     
    type
     
    TCl2 = class(tobject)
    private
    public
    end;
     
    implementation
     
    end.
    unit3 :
    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
    unit Unit3;
     
    interface
    uses Unit2, Dialogs;
     
    type
     
     
    TCl1 = class(tobject)
    private
    public
      procedure JustDoIt(obj: TCl2);
    end;
     
    implementation
     
    { TCl1 }
     
    procedure TCl1.JustDoIt(obj: TCl2);
    begin
      ShowMessage('Appel JustDoIt()');
    end;
     
    end.
    Voila.
    @+

    N'oublies pas le tag ou :delestage:

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Par défaut
    Cela est possible
    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
     
    Unit Unit1;
     
    Uses ..............................;
     
    type
      TClass2 = class;  // Indique que TClass2 existe, qu'il sera créer plustard et que je veut l'utiliser avantde le créer (dans TClass1 dans le cas actuelle)
     
      TClass1 = class(Tobject)
      public
        procedure proc1(cl2: TClass2);
      end;
     
      TClass2 = class(TClass1)
      end;

    Par contre mettre "TClass2 = class(TClass1)" dans un autre unit ne devrait pas fonctionner.

    Ne serait'il pas possible de créer une class contenant juste les paramètres à transmettre et de les utiliser dans la classe 2.


    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
     
    Unit Unit1;
     
    Uses ..............................;
     
    type
      TParamsClass2 = class;  // Indique que TParamsClass2 existe, qu'il sera créer plustard et que je veut l'utiliser avantde le créer (dans TClass1 dans le cas actuelle)
     
      TClass1 = class(Tobject)
      public
        procedure proc1(cl2: TParamsClass2);
      end;
     
      TParamsClass2 = class(TObject)
      end;
    Eventuellement les parametres peuvent être un record.

    Une autre solution peur être:
    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
     
    Function TClasse1.proc1(Classe2: Tobject;var Erreure: string): boolean;
    begin
      Result := false;
     
      if Object = nil then begin
        Erreure := 'Classe2 est vide';
        Exit;
      End;
     
      if not(Object is TClasse2) then begin
        Erreure := 'Classe2 n'est pas un TCLass2';
        Exit;
      End;
     
    // Fair içi le traitemement
     
      Erreure := '';
      Result := True;
    end;
    Cela fonction si vous mettez L'unit2 dans le uses apres implementation.
    Surtout ne le mettez pas dans le 1° Uses (boucle).

    Pour resumer vous pouvez
    1° utiliser une unit pour les 2 classes
    2° passer les parametres dans un format ou une classe commune au 2 classes (dans unit1 ou dans une unit speciale)
    3° transtyper la classe2 (attention a ne metree Unit2 que dans le uses apres implementation)

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

    Informations forums :
    Inscription : Février 2003
    Messages : 31
    Par défaut
    Merci pour vos reponses,

    J'ai pris l'option et ca marche parfaitement!

    Merci beaucoup

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

Discussions similaires

  1. Probleme de forward declaration
    Par vandamme dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 05/10/2007, 18h16
  2. Probleme de forward declaration
    Par porco dans le forum C++
    Réponses: 2
    Dernier message: 15/10/2006, 17h15
  3. [getRequestDispatcher] : Probleme de forward
    Par tiamat dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/08/2006, 16h40
  4. [Framework] [PHP.MVC] Probleme de forward sur .tpl
    Par the_edge dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/03/2006, 15h23
  5. [struts]probleme de forward
    Par VincentP dans le forum Struts 1
    Réponses: 4
    Dernier message: 15/09/2005, 14h42

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