Evénements (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Classes et objets - Index


Cette rubrique traite les sujets suivants :

  • Propriétés d'événements et gestionnaires d'événements
  • Déclenchement de plusieurs gestionnaires d'événements

A propos des événements

Un événement lie une occurrence du système au code répondant à cette occurrence. L'occurrence déclenche l'exécution d'une procédure appelée un gestionnaire d'événement. Le gestionnaire d'événement effectue les tâches nécessaires en réponse à l'occurrence. Les événements permettent la personnalisation du comportement d'un composant lors de la conception ou de l'exécution. Pour modifier le comportement du composant, remplacez le gestionnaire d'événement par un gestionnaire d'événement personnalisé qui aura le comportement désiré.

Propriétés d'événements et gestionnaires d'événements

Les composants écrits en Delphi utilisent des propriétés pour spécifier le gestionnaire d'événement qui sera exécuté si l'événement se produit. Par convention, le nom d'une propriété d'événement commence par "On", et la propriété est implémentée par un champ au lieu des méthodes de lecture/écriture. La valeur stockée par la propriété est un pointeur de méthode pointant sur la procédure du gestionnaire d'événement.

Dans l'exemple suivant, la classe TObservedObject inclut un événement OnPing, de type TPingEvent. Le champ FOnPing est utilisé pour stocker le gestionnaire d'événement. Le gestionnaire d'événement de cet exemple, TListener.Ping, affiche 'TListener has been pinged!'.

program EventDemo;

{$APPTYPE CONSOLE}
type
  { Définit un type procédural }
  TPingEvent = procedure of object;

  { L'objet observé }
  TObservedObject = class
  private
    FPing: TPingEvent;

  public
    property OnPing: TPingEvent read FPing write FPing;

    { Déclenche l'événement si quelque chose est enregistré }
    procedure TriggerEvent();
  end;

  { L'écouteur }
  TListener = class
    procedure Ping;
  end;


procedure TObservedObject.TriggerEvent;
begin
  { Appelle l'événement enregistré seulement en présence d'un écouteur }
  if Assigned(FPing) then
    FPing();
end;

procedure TListener.Ping;
begin
  Writeln('TListener has been pinged.');
end;

var
  ObservedObject: TObservedObject;
  Listener: TListener;

begin
  { Créer des instances d'objets }
  ObservedObject := TObservedObject.Create();
  Listener := TListener.Create();

  { Enregistrer le gestionnaire d'événement }
  ObservedObject.OnPing := Listener.Ping;

  { Déclenche l'événement }
  ObservedObject.TriggerEvent(); // Affichage de 'TListener has been pinged.'
  Readln;                        // Pause de la console avant fermeture
end.


Déclenchement de plusieurs gestionnaires d'événements

En Delphi pour Win32, il n'est possible d'affecter à des événements qu'un seul gestionnaire d'événement. Si plusieurs gestionnaires d'événements doivent être exécutés en réponse à un événement, le gestionnaire d'événement affecté à l'événement devra appeler les autres gestionnaires d'événements. Dans le code suivant, une sous-classe de TListener appelée TListenerSubclass possède son propre gestionnaire d'événement appelé Ping2. Dans cet exemple, le gestionnaire d'événement Ping2 doit explicitement appeler le gestionnaire d'événement TListener.Ping pour le déclencher en réponse à l'événement OnPing.


program EventDemo2;

{$APPTYPE CONSOLE}

type
  { Définit un type procédural }
  TPingEvent = procedure of object;

  { L'objet observé }
  TObservedObject = class
  private
    FPing: TPingEvent;

  public
    property OnPing: TPingEvent read FPing write FPing;

    { Déclenche l'événement si quelque chose est enregistré }
    procedure TriggerEvent();
  end;

  { L'écouteur }
  TListener = class
    procedure Ping;
  end;

  { La sous-classe écouteur }
  TListenerSubclass = class (TListener)
    procedure Ping2;
  end;

procedure TObservedObject.TriggerEvent;
begin
  { Appelle l'événement enregistré seulement en présence d'un écouteur }
  if Assigned(FPing) then
    FPing();
end;

procedure TListener.Ping;
begin
  Writeln('TListener has been pinged.');
end;

procedure TListenerSubclass.Ping2;
begin
  { Appelle le ping de la classe de base }
  Self.Ping();
  Writeln('TListenerSubclass has been pinged.');
end;

var
  ObservedObject: TObservedObject;
  Listener: TListenerSubclass;

begin
  { Créer des instances d'objets }
  ObservedObject := TObservedObject.Create();
  Listener := TListenerSubclass.Create();

  { Enregistrer le gestionnaire d'événement }
  ObservedObject.OnPing := Listener.Ping2;

  { Déclenche l'événement }
  ObservedObject.TriggerEvent(); // Affichage de 'TListener has been pinged.'
                                 // puis de 'TListenerSubclass has been pinged.'
  Readln;                        // Pause de la console avant fermeture
end.


Voir aussi