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 505
    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 505
    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 505
    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 505
    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 505
    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 505
    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