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 :

variable globale unite


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    874
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 874
    Par défaut variable globale unite
    Bonjour

    J'ai un doute sur la position de la déclaration des variables globale à une unité:

    J'ai toujours fait comme dans l'exemple ci-dessous: je les déclare dans l'implémentation:
    var
    ident_bl:integer;

    Mais certain tuto disent de les mettre dans l'interface (que j'ai nommé ICI dans le code ci dessous)

    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
       .................................
    
        procedure DBCtrlGrid1DblClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
      <ICI>
        { Déclarations privées }
      public
      procedure Edit(PartNo,Nobl:integer);
     < ICI>
        { Déclarations publiques }
      end;
    
    var
      Form71: TForm71;
     < ICI>
    	
    
    implementation
             uses dmunit,unit3;
    {$R *.dfm}
    
    var
    ident_bl:integer;
    
    ------------
    Quel est la meilleure solution ?

    Cordialement

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 610
    Par défaut
    Hello,

    La meilleure pratique dans votre cas n'est ni dans l'implémentation, ni dans l'interface, mais de déclarer votre variable comme un champ privé de votre classe de fiche TForm71.

    À mon sens, implementation mieux que interface, car au moins la variable est cachée aux autres unités.

    Si interface, cela rendrait votre variable globale à toute l'application -> fortement déconseillé
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 032
    Par défaut
    Cela dépend de la portée nécessaire.

    Si votre variable est propre à la classe TForm71 mais doit pouvoir être accessible en dehors.
    Alors il vaut mieux la déclarer dans la section public de la classe.
    Au passage, il serait préférable de renommer cette classe.

    Si votre variable est propre à la classe TForm71 mais n'a pas besoin d'être accessible en dehors.
    Alors il vaut mieux la déclarer dans la section private de la classe.
    Ou potentiellement dans la partie protected si vous faite de l'héritage de fiche.

    Déclarer une variable dans la partie interface revient à la rendre accessible et surtout modifiable de partout.
    C'est rarement nécessaire et souvent dangereux car plus le code est maintenu par beaucoup de monde et grossit, plus il devient difficile de maitriser ce qui est fait avec cette variable globale.
    C'est pourquoi, c'est généralement déconseillé.

    Déclarer une variable dans la partie implémentation revient à la rendre accessible modifiable uniquement dans l'unité où elle se trouve.
    C'est parfois nécessaire (moi je m'en suis servi en Delphi 7 pour implémenter un singleton).
    Mais, ça demande réflexion.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 496
    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 496
    Par défaut
    Salut

    si tu veux une variable global à toute ton application
    tu peux aussi passer par une objet (exemple TGLobalParam) qui se lance automatiquement
    et est accessible de tous

    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 UParams;
    Interface 
      ... 
    TGlobalParams = CLass(...)
      Param1 : Integer
      Param2 : String
    ...
    End;
    Var
       GlobalParams : TGlobalParams; 
    Implementation
     
    TGlobalParams.Create(....
    ...
    End;  
     
    initialization
      GlobalParams := TGlobalParams.Create;
     
    finalization
      GlobalParams.Free;
     
    end.
    dans le corps de tes form tu n'auras plus qu'a faire par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      ...
       GlobalParams.Param1 := GlobalParams.Param1 + 1;
       ...
    Pour que cela fonction il te faudra juste ajouter l'unité dans les uses
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag :resolu:

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 032
    Par défaut
    anapurna, je suis désolé mais je ne suis pas d'accord avec toi sur cette solution, en tout cas pas dans la manière dont tu l'as implémenté.

    Là tu as une variable globale qui est un objet que rien ne protège.
    Quelqu'un pourrait la libérer, créer une autre instance et de fait réinitialiser les valeurs.

    L'idée d'une classe de paramètre ne me choque pas.
    C'est la manière dont elle est implémentée qui me dérange.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 496
    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 496
    Par défaut
    Salut

    au dernière nouvelle c'est nous qui gérons notre programme
    (création et destruction d'objet)
    Donc nous savons normalement ce que nous faisons avec les Objet

    Une variante c'est de mettre en place des getter et des setter pour protéger les variables

    je ne fournis qu'un alternative a la variable global afin d'avoir une méthode rapide pour avoir des variables globale a ton programme
    voici donc une version plus plus élaboré
    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
    TGlobalParams = CLass(...)
      Private 
      fParam1 : Integer
      fParam2 : String
    ...
      Protected 
        Function GetParams1 : Integer; 
        Procedure SetParams1(I1 : Integer);
      Public   
       Procedure IncParam1;
      Published 
       Property Param1 : Integer Read GetParams1 write SetParams1 
       Property fParam2 : String Read GetParams2 write SetParams2 
    End;
      ...
      Function TGlobalParams.GetParams1 : Integer; 
      Begin 
         Result := Fparams1;
      End;
      Procedure TGlobalParams.SetParams1(I1 : Integer);
      Begin 
         Fparams1 := I1;
      End;
    sur le principe cela ne change rien
    c'est juste un accès global a une propriété d'un objet dédié dans ton programme

    Moi ce que je ne comprend pas c'est de qui tu parle quand tu dis "que rien ne protège.
    Quelqu'un pourrait la libérer, créer une autre instance et de fait réinitialiser les valeurs."

    Mis a part les développeurs et ou les hacker à la limite je vois pas bien qui peut réinitialisé l'objet
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag :resolu:

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 032
    Par défaut
    Citation Envoyé par anapurna Voir le message
    Mis a part les développeurs et ou les hacker à la limite je vois pas bien qui peut réinitialisé l'objet
    Un développeur justement.
    Un nouveau, ou un qui serait fatigué et ferait la boulette.
    Le tout dans une livraison où l'erreur est cachée au milieu d'une pléthore d'autres modifications.

    Citation Envoyé par anapurna Voir le message
    Une variante c'est de mettre en place des getter et des setter pour protéger les variables.
    Mettre un setter qui se contente d'affecter la valeur n'apporte pas grand choses à la version précédente.
    Tu as ajouté une complexité inutile.

    Et ce n'est pas l'accès à la propriété le problème.
    Le problème vient du fait que rien n'empêche un développeur mal réveillé de libérer ton objet ou de le remplacer par mégarde.

    La solution la plus simple pour éviter ça, mais il y en a d'autres est d'accéder au données de ton objet via une interface.
    Une simple fonction renvoyant un IGlobalParams.
    La variable GlobalParams est déclarée dans la partie implémentation où il n'est pas accessible.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 129
    Par défaut
    Sinon plus simple, lire le tutoriel Implémentation d'un Singleton avec Delphi 7 où ce débat a déjà eu lieu avec la reprise d'un concept simple : III. Utilisation d'une fonction globale que tout le monde connait dans Delphi avec la function Printer qui est un exemple de Singleton historique de Delphi (mieux encore que Application)

    Et ce tutoriel, cela ne concerne que D7, avec Popo, on avait échangé sur l'utilisation de Générique pour introduire un code réutilisable voire même ThreadSafe dans le sujet lié au Tutoriel : Implémentation du Singleton avec Delphi 7, par Jérémy Laurent



    Sinon, attendez plutôt la réponse de looping pour savoir la portée de sa variable, son cas d'utilisation, à mon avis, il est perdu dans ce sujet plus complexe que prévu pour lui.
    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 Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    Billets dans le blog
    10
    Par défaut mettre de l'ordre
    Tu mets les variables dans l'interface si tu les utilises depuis plusieurs unités. Dans la partie implémentation sinon
    Le positionnement des uses est aussi important. Si deux unités unit1 et unit2 s'utilisent mutuellement alors le "uses unit1"se met dans la partie interface de unit2 ]et le "uses unit2" se met dans la partie implémentation de unit1 ou inversement.

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 129
    Par défaut
    Pour illustrer le propos de ALWEBER, autant reprendre la démo de Paul Toth, c'est idéal pour commencer, une unité dédié à la variable globale, c'est isolé, simple et c'est le uses qui rend l'accès possible.

    Surtout que looping lui ne voulait qu'un simple champ "integer".

    Et le plus important, ce n'est pas le code mais le "pourquoi une variable globale à une unité ?", looping doit estimer la durée de vie de "Ident_BL" et sa portée, une fois cela posé, la réponse sera naturelle et surement plus simple (celle de fred1599)

    un champ private sera l'idéal, Ident_BL genre le numéro en cours d'un "Bon de Livraison"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     private
        { Déclarations privées }
        FIdent_BL: Integer;


    DBCtrlGrid1, unit3, TForm71 ... à renommer !
    L'extrait est très révélateur qu'il faut répondre au plus simple.
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 970
    Par défaut
    La question originale a été répondue : en fonction de la portée.

    Et si on veut regrouper des paramètres globaux sans possibilité de mauvaise manipulation ; on reste dans le statique en passant par un record, pas une classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      TParams = record
      private
        ...
      public
        property Param1 :integer read FParam1;
        property Param2 :integer read FParam2;
      end;
     
    var
      Params :TParams;

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/02/2010, 18h02
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 18h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 20h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 14h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 09h34

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