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 :

[C# 2.0] Delegation d'une procédure passée en paramètre du constructeur de classe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut [C# 2.0] Delegation d'une procédure passée en paramètre du constructeur de classe
    Bonjour à tous,

    voici mon premier message sur le forum,
    je n'ai pu effectuer de recherche le script php plantant au bout de 30 secondes.
    J'espère donc que ce n'est pas une question redondante.

    Tout d'abord je suis totalement nouveau au joyeux monde VS2005 .net je viens de VB4/5/6.

    J'ai décidé d'apprendre .net sur C# pour pas confondre toutes les possibilités (puisque mon job est en environnement VB6).
    Puis le codage me parait plus rigoureux et conforme aux langages objets typés style java, c++...

    Bon après cette petite introduction voici ma question (qui est à la fois une question de syntaxe, d'architecture, ect...)

    J'ai un programme windows qui a pour mission de communiquer via le port série avec un switch VGA pour répartir des inputs outputs vga.

    Je crée donc une application windows C#.

    J'ai choisis de séparer la couche présentation de l'application (user interface) de sa logique pure et dure (communication interprétation avec le périphérique distant via le port série).

    Je veux que ma partie logique puisse notifier la partie graphique de certains changements (par exemple à l'initialisation, renvoyer à la partie application grpahique le nombre de inputs outputs VGA disponibles sur la bécane connectée au PC)

    Si j'ai bien compris en C# il y a la notion de délégation qui permet d'affecter à une méthode déléguée, une adresse de fonction.

    Problèmes :
    - Tous les exemples fournit ne montrent que le cas ou la fonction est déclarée dans la même classe
    - Je veux que mon application windows appelle le constructeur de ma classe SwitchVideo(portCom, Baud, functionAppellée) ou fonction appellée doit être une méthode de la classe principale (application windows) et la je ne sais pas comment faire. Existe t'il un type de donné function pour dire que on passe en paramètre un nom de fonction, dois-je utiliser une sorte de pointeur de function, quelle contrainte ma définition doit-elle respecter?

    Je suis un peu perdu et je ne sais pas trop comment faire.

    Je peux vous donner quelques lignes de code mais j'ai l'impression d'être encore loin de la vérité !

    Voilà excusez le newb que je suis, promis j'apprends vite

    Code fenêtre principale

    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
     
    private void AppForm_Load(object sender, EventArgs e)
            {          
     
                try
                {
                    panel = new Matrice(1, 19200, this.testdefunction);
                }
                catch (System.IO.IOException ex)
                {
                    this.timer1.Enabled = false;
                    MessageBox.Show("Check your configuration and restart the 
    application\n" + ex.ToString(), "IO Error...exiting", MessageBoxButtons.OK, 
    MessageBoxIcon.Error);
                    System.Environment.Exit(0);
                }
            }
     
            private void testdefunction(int a, int b)
            {
                MessageBox.Show("test de delegate");
            }

    Code de la classe Matrice (pour gérer le switch video)

    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
     
        delegate void _UpdateMatriceProperties(int x);
     
        public class Matrice : IDisposable
        {
            private SerialPort port;
            private int nbVideoInputs;
            private int nbVideoOutputs;
            private int nbAudioInputs;
            private int nbAudioOutputs;
            private byte[] answer = new byte[4];
     
            public Matrice(int portNumber, int baud, int function)
            {
                port = new SerialPort("COM" + portNumber, baud);
                port.DataReceived += new SerialDataReceivedEventHandler
    (ManageReceivedData);
                port.Open();
                GetMatriceParameters();
                _UpdateMatriceProperties UpdateMatriceProperties = new
     _UpdateMatriceProperties(function);
            }

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Citation Envoyé par Yannick038
    Je veux que ma partie logique puisse notifier la partie graphique de certains changements (par exemple à l'initialisation, renvoyer à la partie application grpahique le nombre de inputs outputs VGA disponibles sur la bécane connectée au PC)

    Pourquoi ne pas utiliser les événement ?
    lors d'un changement la partie logique émet un événement qui est récupéré par la partie graphique.
    Voici un bout de code d'un des mes anciens projets. Un moteur envoie des ping sur plusieurs machines pour tester leur présence. Si une ne répond pas, le moteur déclanche un événement en passant plusieurs parametres.
    L'interface graphique sur laquelle on a branché l'événement du moteur intercept cet événement et effectue les traitement appropriés (affiche d'une alerte par exemple).

    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
     
     
    namespace Moteur
    {
        public delegate void PingPerdu(String carte, int id, int nb);
       /*Ce délégué, étant déclaré entre le nom de l'espace et le nom de la
       classe,  sera commun à tout le projet.*/
     
        public class Moteur
        {
            // évènement déclanché quand un perd un ping
            //utiliser le même nom que le delegate
            public event PingPerdu pingPerdu;
     
            private void TraiterSurveillanceParPing(Object appareil)
            {
                //on déclanche l'événement si un ping est perdu
                PingPerdu("blabla", 1, 2);
            }
     
        }
    }

    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
     
     
    namespace Interface
    {
        public partial class Interface : Form
        {
            //référence au moteur
            private Moteur moteur = null;
     
            //constructeur
            public Interface()
            {
                 //on instancie le moteur
                 moteur = new Moteur();
     
                 //on associe à l'événement PingPerdu la fonction Moteur_PingPerdu
                 moteur.pingPerdu += new PingPerdu(Moteur_PingPerdu);
            }
     
            //si l'événement pingPerdu est intercepté, on executera cette méthode
            private void Moteur_PingPerdu(String carte,int id, int nb)
            {
                MessageBox.Show("alerte");
                //on peut récupérer ici les parametres passés par le moteur, 
                //à savoir "blabla", 1 et 2
            }
    }
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut
    Merci de ta réponse, cela ressemble fortement au concept des Listeners par evènements de Java.

    Il me manquait donc justela partie "évènement" à créer dans mon code.

    Je te remercie de ta réponse (rapide), je teste et je te tiens au courant. Hey non pas de fête du travail pour moi aujourd'hui, .net m'appelle (ma foi ca me déplait pas je commence à être sous le charme de l'IDE de dev version 2005 ca me change grave de vb6)

    .net rulezzz
    ...


    Merci, je confirme que le code fonctionne. Petite modification pour générer (instancier) l'évènement dans le code :

    on appelle pingPerdu (args) soit l'objet instancié non la classe PingPerdu (avec deux majuscules) directement.

    Encore merci et bonne fin de weekend prolongé à tous

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Citation Envoyé par Yannick038
    Merci, je confirme que le code fonctionne. Petite modification pour générer (instancier) l'évènement dans le code :

    on appelle pingPerdu (args) soit l'objet instancié non la classe PingPerdu (avec deux majuscules) directement.

    Encore merci et bonne fin de weekend prolongé à tous

    mauvais copier coller de ma part
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

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

Discussions similaires

  1. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  2. Réponses: 7
    Dernier message: 10/02/2005, 13h44
  3. Comment completer une variable dans une PROC
    Par Le Basque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2004, 17h18
  4. Réponses: 15
    Dernier message: 26/03/2004, 17h53
  5. Réponses: 2
    Dernier message: 16/10/2003, 17h17

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