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

C++/CLI Discussion :

[Winforms]Variables globales entre forms


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut [Winforms]Variables globales entre forms
    Bonjour !
    Alors voilà je cherche je cherche mais je ne trouve de solution nulle part...
    J'utilise la méthode décrite ici, cela fonctionne bien. J'ai includé le fichier Globals.h contenant la méthode dans stdafx.h, juste avant #pragma once.
    En-tête Globals :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public ref class SharedVariables
    {
    private:
        //STATIC VARIABLES
        static System::String ^Function;
        static System::String ^Project;
        static System::String ^ProjectTrigList;
        static System::String ^ProjectEvntList;
    public:
       static property String ^CurrentFunction
       {
            String^ get()
            {
                return Function;
            }
     
            void set(String^ value)
            {
                CurrentFunction = value;
            }
     
       }
       static property String ^CurrentProject
       {
            String^ get()
            {
                return Project;
            }
     
            void set(String^ value)
            {
                CurrentProject = value;
            }
     
       }
       static property String ^CurrentProjectTrigList
       {
            String^ get()
            {
                return ProjectTrigList;
            }
     
            void set(String^ value)
            {
                CurrentProjectTrigList = value;
            }
     
       }
       static property String ^CurrentProjectEvntList
       {
            String^ get()
            {
                return ProjectEvntList;
            }
     
            void set(String^ value)
            {
                CurrentProjectEvntList = value;
            }
     
       }
    };
    Dès que je touche à CurrentProjectTrigList avec 'set', le programme rencontre une erreur : Une exception non gérée du type 'System.StackOverflowException' s'est produite dans Heroes V GUI Trigger Editor.exe
    Par contre, CurrentProject est utilisé avec 'set' sans problèmes juste avant. Et dans la pile des appels, il n'y a qu'une suite interminable de
    > Heroes V GUI Trigger Editor.exe!SharedVariables::set_CurrentFunction(System::String^ value = <valeur non définie>) Ligne 19 + 0xffffffef octets C++

    Utilisation des variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    System::String ^CurrentProjectName;
     
                 System::IO::StreamReader ^sr = gcnew System::IO::StreamReader("TMP.txt"); 
                 System::IO::Directory::CreateDirectory("Projects\\");
                 CurrentProjectName = sr->ReadToEnd()->ToString();
                 SharedVariables::CurrentProject = ("Projects\\" + CurrentProjectName + ".h5t");
                 SharedVariables::CurrentProjectTrigList = ("Projects\\" + CurrentProjectName + ".triglist");
                 SharedVariables::CurrentProjectEvntList = ("Projects\\" + CurrentProjectName + ".evntlist");
                 sr->Close();
    Je ne comprends pas...

    Aussi dans les avertissement du déboggage, il y a :

    Avertissement 1 warning C4717: 'SharedVariables::CurrentFunction::set' : récurrent sur tous les chemins d'accès de contrôle, la fonction entraînera un dépassement de capacité de la pile d'exécution c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\globals.h 20

    Mais coment faire alors pour mes variables globales à toutes les forms ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    Ne mélangez pas les champs et les propriétés.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public ref class SharedVariables
    {
    private:
        //STATIC VARIABLES
        static System::String ^Function;
        static System::String ^Project;
        static System::String ^ProjectTrigList;
        static System::String ^ProjectEvntList;
    public:
       static property String ^CurrentFunction
       {
            String^ get()
            {
                return Function;
            }
     
            void set(String^ value)
            {
                Function = value;
            }
     
       }
       static property String ^CurrentProject
       {
            String^ get()
            {
                return Project;
            }
     
            void set(String^ value)
            {
                Project = value;
            }
     
       }
       static property String ^CurrentProjectTrigList
       {
            String^ get()
            {
                return ProjectTrigList;
            }
     
            void set(String^ value)
            {
                ProjectTrigList = value;
            }
     
       }
       static property String ^CurrentProjectEvntList
       {
            String^ get()
            {
                return ProjectEvntList;
            }
     
            void set(String^ value)
            {
                ProjectEvntList = value;
            }
     
       }
    };
    De plus, les variables globales sont une très très très, voir encore très, mauvaise pratique. Préférez l'utilisation de singleton, de namespace, de membres statics de vraies classes, selon la sémantique de la variable. Cela sera toujours plus simple a maintenir qu'une zone fourretout sans logique ni sémantique.
    Et bon Heroes V en attendant un Heroes VI. LOL

  3. #3
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut
    Hum merci (Diable, j'ai été découvert ! )
    Mais je ne comprends pas comment utiliser/créer ces singletons et autre namespaces...
    Si vous pouviez m'expliquer

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    C'est du design, c'est plus de la méthode que des connaissances.

    Par exemple dans ton "SharedVariables", tu as Function + Project + ProjectTrigList + ProjectEvntList et dans pas longtemps d'autres trucs qui n'auront rien à voir.

    Je fais l'assertion que Function n'est pas très lié à Project mais que Project, ProjectTrigList et ProjectEvntList sont assez lié.
    Au lieu d'avoir une classe "SharedVariables" regroupant des choses disparates, je fais des classes ne regroupant que des choses liées,
    une classe Function, et une classe Project.
    Si, pour l'instant, je n'ai besoin que d'une chaine de caractère pour couvrir le concept de Function et qu'il n'y aura qu'une chaine dans tout le programme, je rends privé les constructeurs de la classe Function, pour que personne ne puisse créer un objet fonction. Je déclare ensuite comme dans ton exemple une propriété static Name, par exemple, de type string.
    La différence:
    Avant - SharedVariables.Function
    Après - Function.Name

    Le Changement n'est pas flagrant mais si l'on la même chose avec projet sa donne :
    Avant : SharedVariables.Project; SharedVariables.ProjectTrigList ; SharedVariables.ProjectEvntList
    Après : Projet.Name; Projet.Trigers; Projet.Events

    C'est déjà plus lisible, et cela, juste en séparant ta classe SharedVariables en 2. Et quand les concepts de Function ou de Project commenceront à se complexifier, ils auront chacun leur espace de nommage distinctes.

    Un singleton : c'est une classe dont on n'est sur de n'avoir qu'une instance dans tout le programme.
    - Tu gardes PRIVE tous les constructeurs de la classe, tu définis une méthode PUBLIC STATIC qui retour une instance de la classe du singleton, getInstance est un nom consacré pour cette méthode static. Tu déclares un champs PRIVE STATIC, de nom _Instance par exemple, de type pointeur sur un objet de type de la classe du singleton et initialisé à null. L'implémentation de getInstance vérifie que _Instance n'est pas null, si oui, il retourne _Instance, sinon il crée un instance grâce à new, affecte le pointeur à _Instance et retourne _Instance.

    puclic class Single
    {
    private :
    static Single* _Instance = null;
    Single(){}
    Single(const Single&){};
    public :
    static Single* getInstance()
    {
    if(_Instance == null)
    {
    _Instance = new Single();
    }
    }
    string Name;
    }

    Avant : SharedVariables.SingleName
    Avec Membre static : Projet.Name
    Avec Singleton : Single::getInstance().Name

  5. #5
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut
    Merci
    Je viens d'esssayer la méthode du singleton, mais rien ne fonctionne... Voilà le code et les erreurs :

    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
    public class Project
    {
    private :
        static Project* _Instance = null;
        Project();
        Project(const Project&){}
        public :
        static Project* getInstance()
            {
            if(_Instance == null)
                {
                _Instance = new Project();
                }
            }
        System::String ^ProjectName;
        System::String ^ProjectTrigList;
        System::String ^ProjectEvntList;
    }
    Erreur 1 error C2065: 'null' : identificateur non déclaré c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 4
    Erreur 2 error C2864: 'Project::_Instance' : seules les données membres static const intégrales peuvent être initialisées dans une classe c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 4
    Erreur 7 error C2143: erreur de syntaxe : absence de ';' avant 'en-tête de fonction inline' c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 6
    Erreur 8 error C2065: 'null' : identificateur non déclaré c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 10
    Erreur 4 error C3265: impossible de déclarer 'ProjectName' managé dans 'Project' non managé c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 16
    Erreur 5 error C3265: impossible de déclarer 'ProjectTrigList' managé dans 'Project' non managé c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 17
    Erreur 6 error C3265: impossible de déclarer 'ProjectEvntList' managé dans 'Project' non managé c:\users\raftadata\documents\visual studio 2008\projects\heroes v gui trigger editor\heroes v gui trigger editor\Globals.h 18


    Et je me réfère aux variables comme ceci (sinon l'intellisense ne fonctionne pas et ne trouve rien) :
    Project:rojectName

    Mais l'intellisense bloque aussi lorsque je fais :
    Project:rojectName->
    Je ne comprends pas...

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    Ooups; à force de faire du C#, on écrit des conneries.


    dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public ref class Project
    {
    private :
        static Project^ _Instance = nullptr;
        Project();
        Project(Project^);
     
    public :
        static Project* getInstance();
     
        System::String ^Name;
        System::String ^TrigList;
        System::String ^EvntList;
    }
    dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Project::Project(void)
    {
    }
     
    Project^ Project::getInstance()
     {
        if(_Instance == nullptr)
       {
            _Instance = gcnew Project();
       }
     }

Discussions similaires

  1. [XL-2010] Variable globale entre 2 userforms
    Par bastou93 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/07/2011, 07h54
  2. Variable globale entre plusieurs scripts
    Par Dan25 dans le forum VBScript
    Réponses: 2
    Dernier message: 01/03/2011, 17h15
  3. variable "globale" entre plusieurs fichiers
    Par kitue dans le forum Caml
    Réponses: 2
    Dernier message: 18/01/2010, 16h58
  4. variables global dans form.load
    Par jfrag dans le forum VB.NET
    Réponses: 3
    Dernier message: 08/07/2008, 13h53
  5. variable global dans Forms.
    Par rommel83 dans le forum Forms
    Réponses: 2
    Dernier message: 28/11/2007, 11h16

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