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 :

Intéraction avec ma Form via fonction static et delegate


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 87
    Par défaut Intéraction avec ma Form via fonction static et delegate
    Bonjour,

    Pour communiquer avec un module éthernet, j'utilise une librairie (dll + .cs) fourni par le constructeur.
    Lorsqu'une des entrées du module change d'état je reçois un message via le socket de connexion (la communication est réalisé par la librairie et n'est donc transparente).
    Pour se faire dans mon programme, il faut que je renseigne un delegate présente dans la classe de la librairie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void pfnCALLBACK(InPtr data, UInt16[] wSize)
    Dans mon programme je renseigne donc la librairie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private static MX_CS.pfnCALLBACK g2KTCP = new MX_CS.pfnCALLBACK(M2K_getTcpMessage);
    //===================================================================
    // Fonction de callback TCP
    public static void M2K_getTcpMessage(IntPtr bytData, UInt16 wSize)
    {
    	// Traitement du message ...
    	if (DI[1] == "ON")
    	{
    		PictureBox temp = (PictureBox)(this.Controls.Find("pictureBoxDI" + i.ToString(), true).FirstOrDefault());
    		temp.Image = imageON;
    	}
     
    }
    Evidemment je n'ai pas accès à mon "this" j'ai donc tenté d'utiliser des delegate mais pas de compilation possible :
    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
    public delegate void delegateChangeEtatDI(int i, bool etat);
    public void ChangeEtatDI(int i, bool etat)
    {
    	PictureBox temp = (PictureBox)(this.Controls.Find("pictureBoxDI" + i.ToString(), true).FirstOrDefault());
    	if (temp != null)
    	{
    		if (etat)
    			temp.Image = imageON;
    		else
    			temp.Image = imageOFF;
    	}
    }
     
    //===================================================================
    // Fonction de callback TCP
    public static void M2K_getTcpMessage(IntPtr bytData, UInt16 wSize)
    {
    	// Traitement du message ...
    	Invoke((delegateChangeEtatDI)ChangeEtatDI, i, true);
    }
    Comme c'est la première fois que j'utilise les delegate, je ne suis pas sûr d'avoir bien cerné leur fonctionnement si le problème vient de là.

    C'est principalement pour faire un retour écran de l'état du module comme vous l'aurez compris.

    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Salut, tu es obligé d'être en static ?
    Pourquoi ne pas faire (en supposant que ce code et dans la Winform; soit dit en passant que c'est sale ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private MX_CS.pfnCALLBACK g2KTCP = new MX_CS.pfnCALLBACK(M2K_getTcpMessage);
    //===================================================================
    // Fonction de callback TCP
    public void M2K_getTcpMessage(IntPtr bytData, UInt16 wSize)
    {
    	// Traitement du message ...
    	if (DI[1] == "ON")
    	{
                    this.MaPictureBox.Image = imageON;
    	} 
    }
    Ce qui bloque dans ce que tu essayes d'utiliser c'est le Invoke. Cela sous-entend this.Invoke et tu essayes de faire un appel à this dans ta fonction statique ce qui n'est pas possible.
    Pour info tu utilises déjà un délégué (pointeur sur une fonction). En effet tu passes l'adresse de ta fonction "M2K_getTcpMessage" dans le constructeur en faisant cela : new MX_CS.pfnCALLBACK(M2K_getTcpMessage);
    Rajouter un délégué vers une fonction de ta Winform ne t'apportera rien.

    Si tu veux coder propre mets tout ce code de connexion / déconnexion / réception dans une classe Device. Tu ajoutes un membre de Device dans ta Winforms.
    Dans ta classe Device tu as ta fonction M2K_getTcpMessage qui appelle un événement onTcpMessageReceived (à toi de le créer; c'est simple regarde https://msdn.microsoft.com/fr-fr/library/8627sbea.aspx"]ici [/URL]) qui relais le message aux abonnés.
    Et je te le donne en 1000 tu t'abonnes à cet événement avec ta Winforms; tu serais ainsi capable de gérer proprement au niveau graphique la réception des messages.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 87
    Par défaut
    Merci pour le lien, je vais regarder ça de plus prêt.

    Pour ce qui est d'enlever les "static", c'est la première chose que j'ai fais mais je ne peux pas compiler :
    "Un initialiseur de champ ne peut pas faire référence au champ, à la méthode ou à la propriété non statique ..."

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Sur quelle ligne tu as cette erreur de compilation ? Il faudrait que tu postes un peu plus de code stp. Par exemple dans quelle méthode et quelle classe tu fais ton instanciation.
    Possible d'avoir la dll pour essayer de compiler ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 87
    Par défaut
    Sur le "new MXIO_CS.pfnCALLBACK(M2K_getTcpMessage);"

    Dll en x86 et x64 + le fichier .cs à intégrer à au projet :
    Archive.zip

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 87
    Par défaut
    La première application de tests simple ça pourrai peut-être aider plus rapidement :
    Message.zip

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

Discussions similaires

  1. Intéraction avec un form d'un autre thread
    Par Arnaud F. dans le forum C#
    Réponses: 1
    Dernier message: 01/03/2011, 22h41
  2. plugin Form, intéraction avec Iframe
    Par ilalaina dans le forum jQuery
    Réponses: 1
    Dernier message: 11/12/2009, 20h57
  3. Réponses: 4
    Dernier message: 24/08/2007, 15h56
  4. Réponses: 2
    Dernier message: 07/08/2007, 11h32
  5. Réponses: 4
    Dernier message: 18/01/2007, 05h46

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