mardi 16 septembre 2008

Programmation événementielle : Acte I)

Support pédagogique pour le module de perfectionnement programmation événementielle

 

 


·             AUX FORMATEURS :

       

 

Date de rédaction

Rédacteur

27/04/2007

Alain Lompo

 

TABLE DES MATIERES

 

Introduction.. 4

Description des événements. 4

Description des délégués. 4

Un premier exemple. 5

Manipulation des délégués. 6

Délégués de méthode contenant des paramètres. 7

Les Délégués membres de classes. 9

Exemple complet. 10

Application pratique  des événements et délégués. 14

Le  Programme. 14

Conclusion. 18

Seconde application pratique des événements et délégués. 19

Vue d'ensemble des événements. 20

Utilisation des d'événements. 21

Déclaration d'événements. 21

Déclenchement d'événements. 23

Abonnement aux événements. 23

Déclaration d'accesseurs d'événement. 25

Comment : créer un contrôle qui répond à des événements. 27

Exemple. 29

Programmation fiable. 31

Comment : créer des événements conformes aux indications du .NET Framework. 33

Comment : déclarer un événement dans une interface et l'implémenter dans une classe. 35

Comment : implémenter deux interfaces avec un événement portant le même nom.. 38

Comment : créer des gestionnaires d'événements dans l'éditeur de code de Visual C#. 40

Pour créer un gestionnaire d'événements à l'aide de l'éditeur de code de Visual C#. 40

Création d'une application MDI avec Visual C#. 41

Création de l'application : 42

Construction de la fiche enfant MDI : 42

Construction de la fiche parent MDI : 43

Autre illustration de la mise en place des événements et délégués. 47

Les modèles de conception. 58

Pourquoi les modèles de conception ?. 59

Les modèles du Framework .NET. 59

Le modèle Observateur. 59

Model logique. 60

Modèle physique. 61

Modèle observateur dans le Framework .NET. 66

Le Modèle évènement (Event Pattern). 69

Conclusion. 71

 

 

 

 

Introduction

Un événement est un fait survenu pendant l'exécution d'un programme. Les événements, en programmation graphique, sont très utilisés car ils permettent de faire réagir un programme en fonction d'une action.Cette action est en général effectuée par l'utilisateur (clic de souris, sélection, saisie clavier, etc...). Mais de nombreuses autres actions sont générées par le système. Avant de traiter des événements en .NET nous allons détailler la notion de "délégué" qui est intimement liée aux événements à proprement parler.

Description des événements

Les événements permettent d'informer à une ou plusieurs classes qu'une action ou que quelque chose vient de se produire. On peut considérer que l'action est un émetteur et les classes informées de cet émetteur sont les récepteurs. Par convention voici, la syntaxe d'un événement :


public void
nom_evenement(object o, EventArgs e) ;


Le premier paramètre est l'objet qui déclenche l'événement. Le second paramètre est un objet qui contient les caractéristiques de l'événement. Cet objet doit appartenir à une classe qui doit dériver de la classe EventArgs.

  

Pourquoi vous présentez les délégués dans une première partie ? Tout simplement parce qu'un événement en .NET doit appeler une méthode référencée par un délégué.

 

Description des délégués

Quand une personnalité importante de l'état décède, le président des USA ne se déplace pas forcément en général pour honorer ses funérailles. Bien souvent ce délégué est le vice – président, mais parfois quand le vice – président est occupé le secrétaire général se charge de la tâche, ou encore la « première dame », le président préfère être en mesure de déléguer son autorité à plusieurs personnes : toute personne capable d'appliquer les protocoles internationaux.

 

Un délégué est en réalité un simple objet de la classe Delegate

 

Cet objet permet d'appeler une ou plusieurs méthodes. Le programmeur peut donc via cet objet appeler un nombre indéfini de méthodes successivement.

 

Prenons l'exemple d'un automobiliste qui tombe en panne. Les étapes successives de cet exemple sont:

  • L'automobiliste roule
  • Evénement : La voiture tombe en panne
  • L'automobiliste constate la panne
  • L'automobiliste appelle le ou les personnes susceptibles de l'aider

Dans ce cas un délégué peut s'avérer fort utile pour répondre à cette étape : "L'automobiliste appelle le ou les personnes susceptibles de l'aider"

 

En effet, la personne susceptible de l'aider est en général un dépanneur. Mais prenons le cas ou l'automobiliste est en panne sur l'autoroute, dans ce cas la police est plus à même de répondre a ce besoin car la priorité est à la sécurité.

 

Au niveau du choix des méthodes à créer, il est plus judicieux dans ce cas précis de faire :

automobiliste.AppelleSecours();

que

automobiliste.AppelleDepanneur(); ou automobiliste.AppellePolice();

 

La méthode  AppelleSecours() de la classe automobiliste contiendrait un délégué qui pointerait sur une autre méthode désignée dans le programme pour référencer une méthode d'un objet Dépanneur ou Police.

 

Cette méthode permet d'être sûr que la bonne méthode est appelée en fonction de la situation et des paramètres extérieurs.

 

Un premier exemple

Voici un exemple très simple illustrant un délégué :

 

using System;

namespace DelegueTest1
{

    delegate void MDelegue();
 
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            MDelegue delegue = new MDelegue(f1);
            delegue();
   
            Console.Out.WriteLine("\n---\n");
   
            delegue = new MDelegue(f2);
            delegue();
        }

       static void f1()
       {
           Console.Out.WriteLine("Fonction f1");
        }

      static void f2()
      {
         Console.Out.WriteLine("Fonction f2");
       }

    }
}

Sortie de l'application :
Fonction f1
---
Fonction f2

 

 

La première instruction intéressante est : delegate void MDelegue();
Cette instruction permet de déclarer un nouveau type de données, ici le type se nommera MDelegue.

 

L'exemple propose deux méthodes : f1 et f2 qui permettent d'écrire dans la console.

 

Intéressons nous au corps du programme. L'instruction : MDelegue delegue = new MDelegue(f1);  permet d'instancier un nouvel objet de type MDelegue qui pointera sur la fonction statique f1. L'instruction suivante nous montre que pour appeler les méthodes de notre délégué il suffit d'appeler, tout comme on le ferait pour une méthode classique, notre délégué.

 

 

Manipulation des délégués

Il est possible de manipuler les délégués pour référencer une ou plusieurs méthodes.

Cette manipulation s'effectue via les opérateurs += et -=.
(Ces opérateurs sont également disponibles pour des valeurs numériques)

Ces opérateurs permettent de rajouter ou d'enlever des méthodes à notre délégué.

Reprenons l'exemple ci-dessus et remplaçons l'instruction :
delegue = new MDelegue(f2);
par
delegue += new MDelegue(f2);

La sortie de l'application sera alors :

 

Sortie de l'application :
Fonction f1
---
Fonction f1
Fonction f2

 

 

Les méthodes sont exécutées dans l'ordre de leur ajout dans le délégué.

 Attention
Dans le cas ou le délégué pointerait sur null, un appel à la procédure du délégué lèvera une exception

Délégués de méthode contenant des paramètres

Pour l'instant les exemples qui vous étaient proposés étaient des exemples simples avec des fonctions qui ne prenaient pas de paramètres et ne retournaient rien.

Mais il est possible de faire pointer nos délégués sur des méthodes qui prennent des paramètres et retournent des valeurs.

Voici un exemple qui illustre cette possibilité :

 

using System;

namespace DelegueTest1
{

 delegate int MDelegue(int valeura, int valeurb);
 
 class Class1
 {
  [STAThread]
  static void Main(string[] args)
  {
   int a, b,result;
   a = 7;
   b = 3;
   
   MDelegue delegue = new MDelegue(f1);
   result = delegue(a, b);
   Console.Out.WriteLine(result);
  
   Console.Out.WriteLine("\n---\n");
  
   delegue = new MDelegue(f2);
   result = delegue(a, b);
   Console.Out.WriteLine(result);

   Console.ReadLine();
  }

  static int f1(int a, int b)
  {
   return a + b;
  }

  static int f2(int a, int b)
  {
   return a - b;
  }

 }
}


Sortie de l'application :
10
---


--
Alain Lompo
Excelta - Conseils et services informatiques
MCT
MCSD For Microsoft .Net
MVP Windows Systems Server / Biztalk Server
Certifié ITIL et Microsoft Biztalk Server

Aucun commentaire: