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 :

Initialisation d'une des variable lors de la création d'un composant


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Initialisation d'une des variable lors de la création d'un composant
    Bonjour à tous

    Je souhaite un composant avec certaines variables initialisées lors de la création:

    Voici le code du composant:

    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
     
    unit Fob;
     
    interface
     
    uses
      Classes,  SysUtils, math, StdCtrls, Dateutils, Controls;
     
    type TF1=class(Tobject)
        private
            VCommunication:string;
         protected
            constructor create;
        public
           Property Communication: string read VCommunication write VCommunication;
        end;
     
    implementation
     
    constructor TF1.create;
    begin
        vCommunication:='Bonjour le monde !'
    end;
     
    end.

    Le programme qui appelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    var F1:TF1;
    begin
        F1:=TF1.create;
        showmessage(F1.Communication);
        f1.free;
    end;

    Le résultat du showmessage est simplement un message vide

    Est-ce qu'il y a moyen d'initialiser une variable lors du create ou lors de la déclaration de l'objet, si oui comment? Sinon pourquoi?


    P.S. : Excusez le dédoublement de message

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    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 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Mettre le constructeur en public.

    Dans ton cas, le constructeur appelé est celui par défaut pour tout objet, par celui que tu as écrit.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Pour la deuxième question, faut que tu passes un paramètre dans ton create (à modifier en conséquence).

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je ne comprends pas trop la question et encore moins les réponses.
    Ton code est correct et le create sert exactement à initialiser les valeurs.
    Normalement avec ton code (il faut peut être faire ctrl-Alt-C) tu dois avoir une procédure 'create' générée, tu initialises ta variable dedans et voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    constructor TF1.create;
    begin
      VCommunication := 'toto';
    end;

  5. #5
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par philnext Voir le message
    Je ne comprends pas trop la question et encore moins les réponses.
    Ton code est correct et le create sert exactement à initialiser les valeurs.
    Normalement avec ton code (il faut peut être faire ctrl-Alt-C) tu dois avoir une procédure 'create' générée, tu initialises ta variable dedans et voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    constructor TF1.create;
    begin
      VCommunication := 'toto';
    end;
    comme dit plus haut, l'erreur est dans la déclaration du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ype TF1=class(Tobject)
        private
            VCommunication:string;
    {     protected
            constructor create; }
        public        
           constructor create; // constructor public
           Property Communication: string read VCommunication write VCommunication;
        end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci à tous

    Vous avez raison, il faut mettre le constructor create public.

    Donc si j'ai bien compris

    En étant protected, seul les descendants peuvent l'appeler.

    Et l'appel create par un programme ne réserve que les ressources nécessaires pour le fonctionnement sans faire l'initialisation.

    Merci encore

  7. #7
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut C'est quoi ce Bordel ??
    Je comprends de moins en moins.
    En quoi le fait de mettre le create en privé ou publique change l'initialisation ??
    Pour moi le code suivant fonctionne :
    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
    42
    43
    44
     
    unit Unit1;
     
    interface
     
    uses
      System.Classes,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      end;
     
      TF1=class(Tobject)
        private
            VCommunication:string;
         protected
            constructor create;
        public
           Property Communication: string read VCommunication write VCommunication;
        end;
    var
      Form1: TForm1;
      F1 : TF1;
     
    implementation
     
    {$R *.dfm}
     
    constructor TF1.create;
    begin
      VCommunication := 'TOTO';
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        F1:=TF1.create;
        showmessage(F1.Communication);
        f1.free;
    end;
     
    end.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    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 449
    Points : 24 856
    Points
    24 856
    Par défaut
    ton exemple avec TF1 et TForm1 fonctionne grâce à la "portée de module" que l'on peut limiter via un Spécificateurs de visibilité stricte

    Deplace TF1 dans une unité dédiée
    le protected ne sera plus accessible, en Delphi, toutes classes d'un même fichier (module<->unité) est considérée comme "amie"

    Je pense que cela qui bloque dans le code de sgmsg qui a isolé les deux classes
    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

  9. #9
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Voila un exemple de "pourquoi on aurait un constructeur protégé" :

    au passage, les variables privées devraient toujours commencer par un " f "

    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
     
    type
      TF1 = class(TObject)
      private
        fCommunication: string;
      protected
        constructor create(const aCommunication: string); overload;
      public
        property Communication: string read fCommunication write fCommunication;
      public
        constructor create; overload;
      end;
     
    implementation
     
    constructor TF1.create;
    begin
      create('Bonjour le monde !');
    end;
     
    constructor TF1.create(const aCommunication: string);
    begin
      inherited create;
      fCommunication := aCommunication;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  10. #10
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    Voila un exemple de "pourquoi on aurait un constructeur protégé" :

    au passage, les variables privées devraient toujours commencer par un " f "

    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
     
    type
      TF1 = class(TObject)
      private
        fCommunication: string;
      protected
        constructor create(const aCommunication: string); overload;
      public
        property Communication: string read fCommunication write fCommunication;
      public
        constructor create; overload;
      end;
     
    implementation
     
    constructor TF1.create;
    begin
      create('Bonjour le monde !');
    end;
     
    constructor TF1.create(const aCommunication: string);
    begin
      inherited create;
      fCommunication := aCommunication;
    end;
    je ne vois pas trop l'intérêt d'en faire un constructor, cela pourrait être une simple fonction...à moins de propose le code suivant:

    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
     
    type
      TF1 = class(TObject)
      private
        fCommunication: string;
      protected
        constructor create(const aCommunication: string); overload;
      public
        property Communication: string read fCommunication write fCommunication;
      public
        class function CreateF1: TF1;
      end;
     
    implementation
     
    class function CreateF1: TF1;
    begin
      Result := TF1.create('Bonjour le monde !');
    end;
     
    constructor TF1.create(const aCommunication: string);
    begin
      inherited create;
      fCommunication := aCommunication;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Ce qui n'est pas très logique est de le mettre en protected

    Sinon, CreateF1 n'est identique au constructeur que dans la classe TF1. Dans une classe dérivée (TF2 = class(TF1)), les constructeurs renverront bien une classe TF2 contrairement à CreateF1.
    La surcharge du constructeur est bien mieux

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/03/2013, 22h55
  2. Réponses: 2
    Dernier message: 29/08/2012, 11h05
  3. Suivre l'état des variables lors d'un débugage
    Par dz_robotix dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/10/2008, 12h09
  4. Créer une/des variable(s) dynamique(s)
    Par jojo86 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/04/2008, 14h55
  5. Spécialisation des variables lors de l'héritage
    Par ::oliv:: dans le forum C++
    Réponses: 6
    Dernier message: 22/03/2007, 11h11

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