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 :

Communication entre 2 classes


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut Communication entre 2 classes
    Bonjour,
    J'essaie de faire un add-in sur PowerPoint et j'ai un problème de communication entre 2 classes


    Ma classe ThisAddIn une autre classe myUserControl1 qui va ajouter un panneau à ppt et un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public partial class ThisAddIn
    {
            private MyUserControl myUserControl1;
     
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
            ...
            }
            private void AddSlide()
            {
             Slide slide = this.Application.ActivePresentation.Slides.Add(this.Application.ActivePresentation.Slides.Count + 1, PpSlideLayout.ppLayoutChart)
             ...
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public partial class MyUserControl : UserControl
    {
             private void buttonAddSlide_Click(object sender, EventArgs e)
            {
             ...
    Quand je clique sur le bouton, j'active la fonction AddSlide_Click de la classe MyUserControl1 et je voudrais que cela soit passé à la classe MyTestAddin pour lancer la fonction AddSlide().
    Comment faire pour faire communiquer ces 2 classes ?
    Merci

  2. #2
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Salut,

    Il faut que tu ai une référence de ThisAddIn dans ton MyUserControl et que tu change la portée de la méthode AddSlide.
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Tu veux dire en utilisant des namespace et en mettant la methode AddSlide en public ?

    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
    using name2
    namespace name1
    {
       public partial class ThisAddIn
       {
            private MyUserControl myUserControl1;
     
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
            ...
            }
            public void AddSlide()
            {
             Slide slide = this.Application.ActivePresentation.Slides.Add(this.Application.ActivePresentation.Slides.Count + 1, PpSlideLayout.ppLayoutChart)
             ...
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    using name1
    namespace name2
    {
       public partial class MyUserControl : UserControl
       {
             private void buttonAddSlide_Click(object sender, EventArgs e)
            {
             ...

  4. #4
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Citation Envoyé par droledenm Voir le message
    Tu veux dire en utilisant des namespace
    Nop, plutôt un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       public partial class MyUserControl : UserControl
       {
             private ThisAddIn thisAddIn;
       }
    Cela te permettra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void buttonAddSlide_Click(object sender, EventArgs e)
    {
          thisAddIn.AddSlide();
    }
    Citation Envoyé par droledenm Voir le message
    en mettant la methode AddSlide en public ?
    Oui. Si tu laisse ta méthode en private, seul les méthodes de ta classe pourront l’appeler. Si tu n'es pas encore trop à l'aise avec les notions de public, private tout ca, le mieux, c'est que tu mettes toutes tes méthodes en public et toutes tes propriétés en private avec des accesseurs pour y'a accéder. Le temps que la notion rentre
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Merci, je comprends

    J'ai essayé ce que tu m'as proposé et j'ai l'erreur:
    System.NullReferenceException: 'La référence d'objet n'est pas définie à une instance d'un objet.'
    thisAddIn was null.
    Là avec le code j'appelle une instance de la classe ThisAddIn, mais je ne l'ai pas liée cette instance à l'objet que je manipule - c'est bien ça ?
    Si oui, comment faire pour les associer ?

  6. #6
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Effectivement, il te faut une instance derrière thisAddIn. Et pas n'importe laquelle vu le contexte. Tu peux opérer de plusieurs façons. Soit créer des accesseurs pour ta propriété thisAddIn, soit passer une instance dans le constructeur de ton user control.

    Petite question quand même au passage : Pourquoi des classes partielles ?

    Edit :
    Là avec le code j'appelle une instance de la classe ThisAddIn, mais je ne l'ai pas liée cette instance à l'objet que je manipule - c'est bien ça ?
    J'ai lu de travers ce que tu avais marqué. Avec ce code, tu veux utiliser l'instance qui se cache derrière thisAddIn. Sauf qu'il y'en a pas. Mais effectivement, il faut que tu "lies" thisAddIn à l'instance de l'objet que tu manipule.
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Il me semble que le template que tu as utilisé pour faire la classe "ThisAddIn" ajoute une reference global, et donc tu dois avoir un accés en global. Cliques droit sur ta classe puis rechercher les réferences.

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Normalement accessible sous la forme d'une propriété statique par Globals.ThisAddIn ou équivalent selon le nom exact de la classe du AddIn (dans un fichier auto généré par Visual Studio).

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Momoth:
    Effectivement, il te faut une instance derrière thisAddIn. Et pas n'importe laquelle vu le contexte. Tu peux opérer de plusieurs façons. Soit créer des accesseurs pour ta propriété thisAddIn, soit passer une instance dans le constructeur de ton user control.
    Partons sur le constructeur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public partial class MyUserControl : UserControl
        {
            public MyUserControl()
            {
                // ThisAddIn thisAddin = ??
    Je n'arrive pas à voir comment tu vas définir l'instance de thisAddin. Si j'utilise "this" par exemple, ca va me renvoyer vers l'objet MyUserControl. Mais je ne vois pas comment le lier au "contexte" ?



    Momoth: Petite question quand même au passage : Pourquoi des classes partielles ?
    J'ai récupéré des bouts de code, où il y avait ca. Effectivement, je ne sais pas trop pourquoi après avoir regardé la définition de ce qu'est un classe partielle.

    micka132:
    Il me semble que le template que tu as utilisé pour faire la classe "ThisAddIn" ajoute une reference global, et donc tu dois avoir un accès en global. Cliques droit sur ta classe puis rechercher les réferences.
    Je ne sais pas dire. Sur cet extrait (dans ThisAddIn.Designer.cs) j'ai plusieurs référence à global
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public ThisAddIn(global::Microsoft.Office.Tools.Factory factory, global::System.IServiceProvider serviceProvider) : 
                    base(factory, serviceProvider, "AddIn", "ThisAddIn") {
                Globals.Factory = factory;
            }
    Noxen, par contre je n'ai pas compris ta remarque. Je suppose que ca répond au commentaire de Micka132, mais je ne comprends pas la réponse.
    Effectivement, je mélange peut être des partials et des global. Mais où est ce qu'il faut mettre Globals.ThisAddIn? Si je mets ca quand je déclara la fonction, j'ai un message disant que ThisAddIn n'appartient pas a Globals.

  10. #10
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Le mot clé partial permet simplement d'informer le compilateur qu'une classe est définie sur plusieurs fichiers au lieu d'un seul. C'est très utilisé par Microsoft pour gérer le code auto-généré : le code utilisateur est dans un fichier tandis que le code auto-généré est dans un autre, qui peut être régénéré sans remettre en cause le travail du développeur.

    Normalement le modèle de projet AddIn Office auto-génère une classe Globals qui contient une référence vers l'objet ThisAddIn instancié par l'application utilisant le module ; tu peux récupérer cette référence comme propriété statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            ThisAddIn thisAddin = Globals.ThisAddIn;
    Tu dois pouvoir trouver cette propriété en faisant un clic droit sur le nom de la classe ThisAddIn et en choisissant "Rechercher toutes les références". Je ne sais pas si tu peux utiliser un UserControl avec un constructeur paramétré dans le contexte d'un AddIn, mais si ce n'est pas le cas voici ma suggestion pour bénéficier d'un constructeur sans paramètre pour le module et d'un constructeur paramétré que tu pourras utiliser à ta guise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public partial class MyUserControl : UserControl
    {
        public MyUserControl():this(Globals.ThisAddIn) {}
        public MyUserControl(ThisAddIn addIn)
        {
            this._addIn = addIn;

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Si je tape ThisAddIn thisAddin = Globals.ThisAddIn; effectivement je n'ai pas de message d'erreur mais je fais un clic droit sur ThisAddIn ca me renvoit à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            internal static ThisAddIn ThisAddIn {
                get {
                    return _ThisAddIn;
                }
                set {
                    if ((_ThisAddIn == null)) {
                        _ThisAddIn = value;
                    }
                    else {
                        throw new System.NotSupportedException();
                    }
                }
            }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static ThisAddIn _ThisAddIn;
    Je ne vois pas ce qui lui permet d'être accessible via un Globals ?


    J'ai essayé ce que tu proposes Noxen
    public MyUserControl(ThisAddIn addIn)
    {
    this._addIn = addIn;
    Et ca renvoit 'MyUserControl' does not contain a definition for '_addIn' and no extension method '_addIn' accepting a first argument of type 'MyUserControl' could be found (are you missing a using directive or an assembly reference?)
    -Qu'est ce que signifie le _addIn ?
    -Et quel était le but du code que tu proposais : c'était d'avoir 2 types de constructeur,s l'un avec paramètre et l'autre sans ? Qu'est ce que ca devrait résoudre comme problème dans mon cas ?

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Citation Envoyé par droledenm Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            internal static ThisAddIn ThisAddIn
    Je ne vois pas ce qui lui permet d'être accessible via un Globals ?
    C'est une propriété static donc accessible via la classe qui la défini! Ca serait pas la classe Globals par hasard?

  13. #13
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par droledenm Voir le message
    -Qu'est ce que signifie le _addIn ??
    Il faut que crées un champ privé _addIn de type ThisAddIn dans ta classe MyUserControl.

    Citation Envoyé par droledenm Voir le message
    -Et quel était le but du code que tu proposais : c'était d'avoir 2 types de constructeur,s l'un avec paramètre et l'autre sans ? Qu'est ce que ca devrait résoudre comme problème dans mon cas ?
    Si ton objet MyUserControl est instancié par du code auto-généré celui-ci n'utilisera pas un constructeur spécifique, il lui faudra un constructeur sans paramètre (mais je peux me tromper sur ce point). En faisant cela il sera possible de disposer d'un constructeur par défaut tout en ne se contraignant pas à utiliser l'objet ThisAddIn contenu dans Globals.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    micka132
    C'est une propriété static donc accessible via la classe qui la défini! Ca serait pas la classe Globals par hasard?
    OK

    Noxen
    public MyUserControl() : this(Globals.ThisAddIn) { }
    Qu'est ce que veut dire cette ligne ? Les deux points en particulier ?(c'est bête, mais sur un moteur de recherche c'est dur de trouver la signification de ":")


    J'ai essayé:
    public MyUserControl(ThisAddIn addIn)
    {
    this._addIn = addIn;
    Et ca renvoit 'MyUserControl' does not contain a definition for '_addIn' and no extension method '_addIn' accepting a first argument of type 'MyUserControl' could be found (are you missing a using directive or an assembly reference?)

    -> Qu'est ce que signifie cette erreur ? Dans le constructeur, avec this._addIn = addIn, on créé un champ _addIn. Pourquoi j'ai une erreur qui dit que _addIn n'existe pas alors que justement c'est pour créér le champ ?

    PS : désolé si je pose des questions qui peuvent paraître triviales à un développeur, mais je commence

  15. #15
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par droledenm Voir le message
    OK

    Et ca renvoit 'MyUserControl' does not contain a definition for '_addIn' and no extension method '_addIn' accepting a first argument of type 'MyUserControl' could be found (are you missing a using directive or an assembly reference?)

    -> Qu'est ce que signifie cette erreur ? Dans le constructeur, avec this._addIn = addIn, on créé un champ _addIn. Pourquoi j'ai une erreur qui dit que _addIn n'existe pas alors que justement c'est pour créér le champ ?
    La réponse a déjà été proposée par Noxen :

    https://www.developpez.net/forums/d1...s/#post9671126

    Tu as déjà procédés à son affectation dans le constructeur :

    public MyUserControl(ThisAddIn addIn)
    {
    this._addIn = addIn;
    Il ne manque donc plus que la déclaration du champs dans la classe !

    ++

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 38
    Points : 24
    Points
    24
    Par défaut
    Wallace1
    Il ne manque donc plus que la déclaration du champs dans la classe !
    Ah oui
    Effectivement en déclarant le champs je supprime l'erreur et ca marche j'arrive à créer ma slide.



    Merci à tous de m'avoir aidé!

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

Discussions similaires

  1. problème de communication entre mes classes
    Par emiliekun dans le forum ActionScript 3
    Réponses: 13
    Dernier message: 19/08/2009, 14h10
  2. communication entre les classes
    Par sara_qt dans le forum Qt
    Réponses: 0
    Dernier message: 11/04/2009, 20h11
  3. Communication entre une classe et un thread
    Par cs_ntd dans le forum C#
    Réponses: 2
    Dernier message: 24/10/2008, 10h49
  4. Communication entre les classes
    Par jagboys dans le forum MFC
    Réponses: 6
    Dernier message: 20/06/2006, 06h32
  5. Réponses: 3
    Dernier message: 22/11/2005, 11h12

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