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

Windows Forms Discussion :

Communication entre objet via "Parent" ?


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 60
    Points : 44
    Points
    44
    Par défaut Communication entre objet via "Parent" ?
    Je m'explique (je suis tres nouveau en c# (habitué au C++) sous visual studio), dans mon projet, j'ai des ihm qui en creent d'autres.
    Basiquement à un moment le processus est le suivant:

    Une fenetre "editeur" cree une nouvelle fenetre "nouveaufait"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NouveauFait FNouveauFait = new NouveauFait();
                    FNouveauFait.MdiParent = this;
                    FNouveauFait.Show();
    Dans ma fenetre "nouveau fait" je saisie un nom et une description puis en cliquant sur un bouton de cette fenetre je voudrais que cela lance une fonction "ajouter fait" presente dans mon objet "editeur" qui affichera dans une liste le nouveau fait.

    Probleme, je peux avoir plusieurs editeurs (j'ai une classe au dessus qui peut en creer plein) et donc comment pourrais-je faire pour appeller la methode "ajouterfait" de l'editeur qui vient de creer mon objet (ihm) nouveaufait ?

    J'imagine que on doit pouvoir utiliser l'attribut "parent" qui permet de connaitre qui est notre "createur" (arretez moi si je me trompe), mais je ne sais comment faire...

    Merci de votre aide.

  2. #2
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Citation Envoyé par starkson
    J'imagine que on doit pouvoir utiliser l'attribut "parent" qui permet de connaitre qui est notre "createur" (arretez moi si je me trompe), mais je ne sais comment faire...
    Je ne pense pas qu'il s'agisse la d'une programmation très propre. La classe enfant n'a pas à connaitre les caractèristique du parent.

    Typiquement tu dois utiliser la gestion des événements. Lors du click sur le bouton tu dois généré un événement du type que tu aura défini. Le parent peut alors s'abonner à l'événement et donc lors du click sur le bouton, le parent réagira en conséquence.

    Si tu ne conais pas la gestion des événements, il me semble qu'il y a un très bon tuto en C# dans les tutoriaux de la rubrique .NET

  3. #3
    Membre régulier Avatar de userB
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 147
    Points : 106
    Points
    106
    Par défaut
    Bonjour tout le monde, je travaille egalement sur le projet de starkson.
    Comme il l'a decrit, nous avons du mal ( bon ok, il vaut mieux dire qu'on y arrive absolument pas) a faire communiquer 2 formes.
    Pour reprendre nous disposons :

    -Une forme Editeur nommé chForm, cette forme dispose d'un objet C_PROJET ( qui lui meme est composé d'une liste de C_FAIT et d'autres joyeusetées )
    -Une forme NouveauFait qui est appellé via un contextmenu declenché lors d'un click droit sur le treeview de la forme Editeur.

    Le deroulement logique serait qq chose de cette forme :
    -L'utilisateur souhaite rajouter un fait depuis la forme Editeur, et il clique sur nouveau
    -Hop on ouvre notre Forme NouveauFait, ici l'utilisateur saisi les champs noms, description blabla, et lors du click sur le bouton valider, on fait remonter ces informations ( ou le C_FAIT creer sur la forme NouveauFait ) vers chForm (instance de la Form Editeur) qui va rajouter ce nouveau fait dans la list de son C_PROJET.

    Bon, jusqu'ici ca nous semblait assez simple. Seulement meme apres la consultation de ceci : http://freddyboy.developpez.com/dotnet/articles/events/ ca reste toujours tres flou.

    La surcharge de eventarg doit bien s'effectuer dans NouveauFait non ?
    Mais si oui, quelle forme doit elle avoir ( je ne vois absolument pas comment m'y prendre )
    Merci d'avance.
    Si tu ne sais pas m'expliquer pourquoi ca ne marche pas, alors tu ne sauras pas m'expliquer pourquoi ca marche.. -Un illustre chef de projet-

  4. #4
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    our faciliter ton problème, tu peux utiliser un événement standard de .NET et proposer les informations à récupérer par l'intermédiaire de propriété public de ta form enfant.

  5. #5
    Membre averti
    Avatar de CORBASE
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 246
    Points : 431
    Points
    431
    Par défaut
    Salut le forum, Bon moi aussi je bosse sur le même projet (projet pour l'école). Bon déjà je pense que on ne vous pas assez expliquer le contexte de notre application.

    Nous devons développer un moteur d'inférence, c'est à dire une application capable d'interpréter du code afin de faire des système experts.L'application se décompose en 2 grosse partie, à savoir l'IHM et le moteur (stocké dans une DLL).

    J'ai déjà codé le moteur, et mes collègues butte sur un problème qui a attirer mon attention. Comment faire communiquer mon IHM avec un objet précis ?

    En effet, pour une exécution d'un moteur, on aimerais pouvoir récupérer dans différentes form des caractéristiques et résultats de fonctions de l'objet moteur en cours d'utilisation.

    J'ai pensé effectivement aux évènements, mais ce qui me gêne c'est comment véhivuler de l'information dans un event. Si je pouvais faire véhiculer des collection ou autre, cela arrangerais totalement le problème, car on ferait un thread de lancement d'ecoute sur la form qui capterais tout les event et les traiterais un par un avec un comportement spécifique. Quoique même le thread est superflu, le framework doit pouvoir permettre l'interception d'un event sur n'importe quelle form si je ne m'abuse ???

    Bref, je sais qu'en ASP .NET j'utilisais pas mal les events, mais je ne me suis jamais confronter au problèmes de passe d'information en mémoire de données dans le cas de winforms. En ASP .NET, on s'en sors toujours avec des variables de sessions ou autres (même si ce n'est pas très propre, j'en conviens )

    Bref, merci pour vos réponses !
    Rien n'est impossible, c'est juste une question de temps
    C'est quoi le PureBasic ?

  6. #6
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par CORBASE
    J'ai pensé effectivement aux évènements, mais ce qui me gêne c'est comment véhivuler de l'information dans un event.
    En te faisant une class qui hérite de EventArgs, et tu passe cette classe comment eventArgs
    Remoting Context Matters
    Everything in this chapter is 100 percent undocumented. Reliance on these techniques is not supported by either Microsoft, the publisher, or the author of this book. Use at you own risk! If your computer won't work afterwards, your toaster blows up or your car doesn't start, I assume no liability whatsoever: You're now about to enter the uncharted territories of .NET and you do so on your own risk. I can only provide some guidance

  7. #7
    Membre régulier Avatar de userB
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 147
    Points : 106
    Points
    106
    Par défaut
    Bon je persiste dans la communication entre 2 form.
    Fort de ce que j'ai lu sur : http://freddyboy.developpez.com/dotnet/articles/events/

    J'en suis arrivé a cette classe :
    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
        class C_Fact_Event : EventArgs
        {
            private C_GUI_FAIT _VarFact;
     
            public delegate void FactGeneratedEventHandler(object sender, C_Fact_Event e);
            public event FactGeneratedEventHandler OnClickButtonValider;
     
            public C_Fact_Event(C_GUI_FAIT theEventFact)
    		{			
    			if (_VarFact == null) throw new NullReferenceException();
    			_VarFact = theEventFact; 
    		}
            public C_Fact_Event()
            {
     
            }
        }
    Comme il m'a ete indiqué plus haut, j'encapsule mon C_GUI_FAIT dans un evenement via cette classe.

    Pour revenir à ce que doit faire ce bout d'application, je dispose d'une fenetre mere qui s'appelle Editeur.cs.
    la form Editeur est composé d'un objet nommé C_GUI_PROJET qui dispose d'une list de C_GUI_FAIT.

    Je dispose egalement d'une fenetre s'appellant NouveauFait.cs.

    Cette derniere est appellé lors de la creation d'un nouveau fait dans la fenetre Editeur, elle me permet de saisir les champs nom et description, et, lors du click sur le bouton Valider dans NouveauFait, je dois pouvoir faire remonter les informations saisi sur NouveauFait vers la form Editeur.

    Voila le code implementé sur l'evenement OnClick du boutton Valider de la form NouveauFait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void button1_Click(object sender, EventArgs e)
            {
                C_GUI_FAIT _NewFact = new C_GUI_FAIT();
                _NewFact.setNom(label1.Text);
                _NewFact.setDescription(richTextBox1.Text);
     
     
                C_Fact_Event e1 = new C_Fact_Event(_NewFact);
                OnClickButtonValider(this, e1);
                this.Close();}
    Donc je pense avoir suivi la logique du dialogue via evenement.

    Et enfin dans la form Editeur, voila le code specifique que j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            private C_Fact_Event _myFactGenerate = new C_Fact_Event();       
     
            static public C_GUI_PROJET _NewProjet;
    Il y a une ligne de code que je ne sais absolument pas ou mettre, c'est celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            _myFactGenerate.OnClickButtonValider += new . . .
    Bon comme vous l'aurez remarqué, j'ai pas tout saisi sur la facon pour faire communiquer 2 forms via les evenements, donc si je pouvais avoir un petit coup de main
    Pour info, quand j'execute j'ai un message d'erreur a ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (_VarFact == null) throw new NullReferenceException();
    La référence d'objet n'est pas définie à une instance d'un objet.
    Un petit coup de main ?
    Si tu ne sais pas m'expliquer pourquoi ca ne marche pas, alors tu ne sauras pas m'expliquer pourquoi ca marche.. -Un illustre chef de projet-

  8. #8
    Membre averti
    Avatar de CORBASE
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 246
    Points : 431
    Points
    431
    Par défaut
    Bon, après plusieurs recherches nous avons enfin trouver la solution. Il suffit de passer par une classe Pattern Singleton qui permet de ne pas essayer de faire des choses crade avec les events
    Rien n'est impossible, c'est juste une question de temps
    C'est quoi le PureBasic ?

  9. #9
    Membre régulier Avatar de userB
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 147
    Points : 106
    Points
    106
    Par défaut
    Moi je voudrais quand meme savoir ou j'aurai du mettre mon listener d'event que j'avais implementer.
    a savoir c'est 2 lignes dans le tuto de freddy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private GenerateText myTextGenerator = new GenerateText();
    myTextGenerator.OnTextChanged+=new TutoEvent.GenerateText.TextGeneratedEventHandler(myTextGenerator_MonEvenement);
    Parce que bon .... j'ai absolument AUCUNE idée de la ou je dois les mettre pour qu'elles soient effective....
    une idée ? un coup de main ?
    Si tu ne sais pas m'expliquer pourquoi ca ne marche pas, alors tu ne sauras pas m'expliquer pourquoi ca marche.. -Un illustre chef de projet-

  10. #10
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Citation Envoyé par CORBASE
    Bon, après plusieurs recherches nous avons enfin trouver la solution. Il suffit de passer par une classe Pattern Singleton qui permet de ne pas essayer de faire des choses crade avec les events
    Passer des info entre une fenêtre parent et une fenêtre enfant par un singleton !!?? Je maintien que les événements sont la bonnes vois à suivre. ,Soit avec des propriétés public dans la classe enfant soit en définissant un eventargs qui encapsule une classe entités pour contenir les données.

  11. #11
    Membre régulier Avatar de userB
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 147
    Points : 106
    Points
    106
    Par défaut
    J'ai l'impression d'etre invisible avec mon probleme ..... penible
    Si tu ne sais pas m'expliquer pourquoi ca ne marche pas, alors tu ne sauras pas m'expliquer pourquoi ca marche.. -Un illustre chef de projet-

  12. #12
    Membre averti
    Avatar de CORBASE
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 246
    Points : 431
    Points
    431
    Par défaut
    Bon, le problème etait de pouvoir dialoguer avec un meme objet sur plusieurs form, donc bon, à mon avis le singleton reste quand meme le moyen le plus simple.

    Les event restent relativement compliqué à mettre en place et surtout il n'y a pas de tutorial valable sur le net, comme le dis userB, personne est capable à ce jour de donner un exemple simple.

    Mais si tu as ça sur le coude, je suis prenneur.
    Rien n'est impossible, c'est juste une question de temps
    C'est quoi le PureBasic ?

Discussions similaires

  1. Pattern de communication entre objets enfant vers parents
    Par Chasseur d'étoiles dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 16/08/2011, 14h23
  2. Communication entre objets via .NET Remoting
    Par JBidouille dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/05/2007, 22h52
  3. Réponses: 8
    Dernier message: 10/05/2006, 23h58

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