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 :

Instanciation d'une classe dans le ".dpr" et utilisation


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut Instanciation d'une classe dans le ".dpr" et utilisation
    Bonjour à tous !

    J'ai une petite question et après moult recherche... Je n'ai pas encore de solution. C'est pourquoi je pose la question à des spécialités !

    Je ne sais pas si mon problème est dû à l'impossibilité de la réalisation ou à mon incompétence... m'enfin, je cherche une solution :

    Je souhaite instanciée une seule fois un objet dans le code source du projet (directement dans le ".dpr", là où l'on décrit les différents fichiers contenant du code ".pas"). Dans mes différentes fenêtres, je souhaite pouvoir utiliser cette objet instanciée dans le code source du projet.

    Est-ce possible ?
    Si oui, avez-vous un "bout de code" pour que je puisse voir comment faire.

    Merci pour votre aide !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Non,
    Tu ne peux mettre le dpr en uses, tu devrais étudier un peu plus cette fameuse section "uses" ...

    mets ton objet dans une unité, regarde par exemple, le principe du Singleton, comme dans ce sujet

  3. #3
    Membre habitué Avatar de neodelphi2007
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 202
    Points : 179
    Points
    179
    Par défaut


    Pourquoi dans le .dpr ? pourquoi pas dans une unitée global.pas par exemple avec un singleton.

    Lorsque l'on appel le constructeur d'un objet, le compilateur fait un appel à NewInstance pour récupérer un pointeur sur l'objet instancié.
    Dans le cas présent au premier appel on fait effectivement cet appel. Dans les cas suivant on retourne toujours la même instance.

    Ainsi tu peut utiliser dans les autres fenêtres une seule instance de ta classe en appellant global.pas. Non ?

    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
     
    unit Global;
    interface
    type 
          TMyClass = class  
          public   class function NewInstance: TObject; override;       
          end;
     
    implementation
     
       var  fMyClass:TMyClass;{ TSingleton }
     
    class function TMyClass.NewInstance: TObject;
    begin  
       if assigned(fMyClass) 
       then result:=fMyClass  
       else  begin    
              result:=inherited NewInstance;    
              fMyClass:=TMyClass(result);  
              end;
    end;
     
    end.
    Source: Olivier THEBAULT

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Merci beaucoup pour vos réponses !
    Je vais me pencher sur le problème et me diriger vers les "singleton".

    @bientôt

  5. #5
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    heu c'est tout a fait possible, c'est d'ailleurs fait automatiquement par les forms !

    il te faut:
    • un var dans l'interface de l'untié de ta class
    • dans le dpr, avant le Application.Run, tu instancie tes objets.

    pour les forms, il y a :
    • var Form1: TForm1; (dans unit1)
    • Application.CreateForm(TForm1, Form1)

    et toi tu peux faire :
    • var MonObjetGlobal: TMonObjet;
    • MonObjetGlobal := TMonObjet.Create;

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    heu c'est tout a fait possible, c'est d'ailleurs fait automatiquement par les forms !

    il te faut:
    • un var dans l'interface de l'untié de ta class
    • dans le dpr, avant le Application.Run, tu instancie tes objets.

    pour les forms, il y a :
    • var Form1: TForm1; (dans unit1)
    • Application.CreateForm(TForm1, Form1)

    et toi tu peux faire :
    • var MonObjetGlobal: TMonObjet;
    • MonObjetGlobal := TMonObjet.Create;
    Ahh ! Good ! parce que j'ai beaucoup de mal à utiliser les singleton... Enfin, j'ai une vielle erreur d'exception... Je ne comprends pas pourquoi.

    J'ai une petite question, il est mieux d'utiliser ta méthode ou bien d'utiliser tout de même les singleton ?

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Le lien donné par ShaiLeTroll est très explicite.

    Les singleton (avec les sections initialization et finalization) sont plus simples. Tu déclares juste ton unité, et il n'y a pas d'autres lignes de code à mettre.

    Après tu utilises ta variable déjà instanciée où tu veux.

    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
     
    uses MonUnite;
     
    interface
     
    uses XXX;
     
    type
      TBidule = Class(TObject)
    // etc.
      end;
     
    var
      _Singleton: TBidule = nil;
     
    implementation
     
    // etc.
     
    initialization
      _Singleton := TBidule.Create();
     
    finalization
      if Assigned(_Singleton) then
      begin
        _Singleton.Free();
        _Singleton := nil;
      end;
     end.

  8. #8
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    ca depend de ton utilisation.
    L'interet du singleton et de pouvoir utiliser une instance d'un objet qui sera unique pour le processus, qui sera instancié a la demande (mais implicitement).
    a implementer c'est assez simple :
    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
     
    interface
    type
      TMaClass = class
        function Test;
        ...
      end;
     
      function MaClasse: TMaClass; // <- la fonction que tu utilise pour manipuler ton singleton
     
    implementation
     
    var  FMaClasse: TMaClass = nil; //la variable contenant ton singleton
     
    function MaClasse: TMaClass; 
    begin
      //demande du singleton : on le créé si necessaire
      if FMaClasse = nil then
      begin
        //initialisation du singleton
        FMaClasse := TMaClass.Create;
        ...
      end;
      Result := FMaClasse;
    end;
     
    initialization
    finalization
      //destruction a la fin du processus
      if FMaClasse <> nil then
        FreeAndNil(FMaClasse);
    end.
    a l'utilisation, c'est tres simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //cette ligne appelle la fonction sur ton singleton (qui sera automatiquement 
    // instanciée si necessaire)
    MaClasse.Test;

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    heu c'est tout a fait possible, c'est d'ailleurs fait automatiquement par les forms !
    Form1 est déclarée dans unit1 et non dans le DPR, ... et finalement, Form1 n'est-il pas une sorte de Singleton de TForm1 ... et si l'on souhaite l'utiliser, suffit de mettre unit1 dans les uses ... tu peux instancier dans le DPR (même si une section initialization ou une instanciation au premier GetInstance, qui serait plus appropriée)... mais tu ne peux pas le déclarer dans le DPR !!! d'où mon "Non", mieux vaut regrouper ensemble les choses logiquement dans une même unité ... tu as d'ailleurs bien évité de dire où mettre MonObjetGlobal et TMonObjet ... alors que c'est justement la réponse à sa question ...



    Personnellment, la première chose que je fais c'est de retirer les instanciations automatique des Forms, je ne laisse que la MainForm évidemment ...


    Sinon, quelle version de Delphi ? Parce que l'on te fournis du code qui doit fonctionner depuis Delphi 3 ... si tu as Delphi 2005 ou plus, il y les instances de classes qui facilent la création d'un singleton, sans passer par une procédure non objet et une variable globale cachée ...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Merci pour toutes vos réponses ! C'est vraiment sympa

    Je suis en Delphi 7 et je me suis inspiré du sujet que tu m'a donnée lors de ta première réponse ! Cela fonctionne nickel chrome !

  11. #11
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    tu as d'ailleurs bien évité de dire où mettre MonObjetGlobal et TMonObjet ... alors que c'est justement la réponse à sa question ...
    heu bah si j'l'ai dit !
    Citation Envoyé par Guillemouze
    un var dans l'interface de l'untié de ta class
    Personnellment, la première chose que je fais c'est de retirer les instanciations automatique des Forms, je ne laisse que la MainForm évidemment ...
    Pareil. Non mais qui est-ce qui code, c'est delphi ou nous ?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/08/2009, 17h41
  2. Réponses: 5
    Dernier message: 04/10/2006, 15h45
  3. Instanciation d'une classe dans un CustomTag
    Par santana2006 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 30/09/2006, 12h08

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