Evénements (Delphi)
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
Sommaire
- 1 A propos des événements
- 2 Propriétés d'événements et gestionnaires d'événements
- 3 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
- Classes et objets (Delphi)
- Champs (Delphi)
- Méthodes (Delphi)
- Propriétés (Delphi)
- Références de classes
- Exceptions (Delphi)
- Assistances de classes et d'enregistrements (Delphi)
- Déclarations de types imbriqués
- Surcharge d'opérateurs (Delphi)
- Types procéduraux (Delphi)
- Création d'événements
Aucun commentaire:
Enregistrer un commentaire