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# Discussion :

Autre question d'accès


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 128
    Par défaut Autre question d'accès
    Bonjour à tous,

    Ceci concerne à problème d'accès à des variables de classe.


    L'application en construction possède :
    - une ClasseA publique (mémorisation des paramètres globaux de l'application).
    - une Form1 (affichage de l'application).
    - une Form2 (définition des paramètres globaux de l'application) appelée depuis le menu de la Form1.

    ++++++++++++++++++
    Etape 1:
    Au démarrage, de l'application, la Form1 crée une instance de la classeA juste après "InitializeComponent()".
    -> La Form1 lit sans problème les valeurs des variables de l'instance de la classeA.


    ++++++++++++++++++
    Etape 2
    Un menu de la Form1 ouvre la Form2.
    Je souhaiterai que les valeurs définies dans la Form2 modifient les valeurs de l'instance active de la ClasseA créée par la Form1.



    Dans le code de la Form2, il est impossible de faire référence à l'instance de la classeA de la Form1.
    Comment puis-je coder cela ?

    J'ai bien essayé avec une variable globale, mais le compilateur m'interdit le set/get à une variable globale.
    Je tourne en rond sans trouver de solution.

    Où est mon incompréhension ?

    Merci par avance pour votre aide.

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    On enchaine dans Form1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyClasseA = new ClasseA() ;
    MyForm2 = new Form2() ;
    MyForm2.Init(MyClasseA) ;
    MyForm2.Show() ;  // ou ShowModal
    et définir dans Form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    internal ClasseA  TheClasseA ;
    ...
    internal void Init(ClasseA vTheClasseA) 
    {
      TheClasseA=vTheClasseA ;
    }
    et dans les proc de Form2, utilise TheClasseA.

  3. #3
    Membre confirmé
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 128
    Par défaut
    Merci Graffito.

    J'étudie cela.
    Je n'ai jamais croisé ce type de code dans aucun de mes livres...
    Meilleures amitiés.

  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
    Avez-vous pensé au Design Pattern Singleton.
    Ou encore plus simple, membre static d'une classe static.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static class globauxToutSales
    {
        public static int premiereGlobaleToutSales;
    }
    Je trouve cela très sale par rapport à un Singleton mais c'est bien mieux que de transférer de proche en proche des "variables"

  5. #5
    Membre confirmé
    Homme Profil pro
    Hobby
    Inscrit en
    Août 2002
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : Août 2002
    Messages : 128
    Par défaut
    Bonjour Bacelar,

    J'ai finalement opté pour variable et classe static avec un contrôle par get/set (comme indiqué au bas de mon premier post) ; une erreur de logique rendait mon code invalide auprès du compilateur...

    Mais je vais étudier le code de Graffito parce que c'est une méthode que je ne connaissais pas et que je comprends pas encore tout à fait, en ce qui concerne la partie libellée "définir dans Form2 :".

    Ma position "d'amateur débutant" y est certainement pour beaucoup...

    Meilleures amitiés et encore merci pour tous.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 257
    Par défaut
    Bonjour,
    Pour ton problème, si l'instance de la classe A se trouve dans le Form1, et que le Form2 est ouvert depuis le Form1, alors il faut que lors de l'ouverture du Form2 à l'aide de la méthode Show ou ShowDialog, tu spécifies le parametre owner en étant le Form1. Ensuite, depuis le Form2 tu peux accéder au Form1 et donc à l'instance de ta classe A. Biensur pour accéder à ton instance de la classe A, il faut qu'elle soit publique ou qu'il existe une propriété pour cette instance.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Je trouve cela très sale par rapport à un Singleton
    Des variables accessibles globalement via un singleton sont aussi des variables globales. C'est tout aussi 'sale' et c'est tout autant à éviter quand on peut faire autrement (ce qui est très souvent le cas).

    Citation Envoyé par bacelar Voir le message
    mais c'est bien mieux que de transférer de proche en proche des "variables"
    Mmh, communiquer aux classes les éléments dont elles ont besoin pour qu'elles puissent fonctionner indépendamment est toujours bien mieux que d'avoir du code qui repose sur des variables globales pour fonctionner.

    Les cas dans lesquels un point d'accès extérieur est préférable sont très limités, et généralement en liaison avec des services. Ici, il n'est pas question de service, juste de transmettre à la création d'un objet un élément dont il a besoin pour fonctionner. C'est de faire du global pour ça qui est sale :)

    Et donc, comme dit Miko95, il y a aussi la propriété Owner qui peut se caster, à condition de la renseigner explicitement.

  8. #8
    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
    "Owner" est un mécanisme utilisé par le système de fenêtrage de Windows, il ne devrait pas être détourné pour des besoins d'implémentation de contexte global.
    Les singletons est une méthode archaïque pour faire de l'inversion de dépendance. Maniak, en lisant le premier poste, vous verrez que l'on est dans un contexte de partages de configuration, donc une logique de container.
    Utilisez une classe avec 15 paramètres dans don constructeur est plus compliqué à tester qu'une classe lié à un container.

Discussions similaires

  1. Désinstaller SQL Server Express + autres questions
    Par wolflinger dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/03/2006, 14h07
  2. [VB6] Une autre question : Ouverture d'un navigateur
    Par Jihnn dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 28/02/2006, 13h34
  3. une autre question niveau communication
    Par gctom dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 15/01/2006, 23h25
  4. taille des 'pages' et autres questions
    Par Equus dans le forum Débuter
    Réponses: 2
    Dernier message: 04/03/2005, 09h50
  5. [LG]Choix du pascal ou autre ? Questions simples...
    Par vlacq dans le forum Langage
    Réponses: 5
    Dernier message: 30/01/2004, 23h42

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