Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :


Créer ses propres événements

Date de publication : 03/03/2008

Par Julien Lelong (Accès Site)
 

Voici un petit article mettant en oeuvre la création d'événements personnalisés.

            

I. Qu'est ce qu'un événement personnalisé
II. De la théorie à la pratique
II-A. Déclaration et Implémentation
II-B. Phase de test
III. Conclusion


I. Qu'est ce qu'un événement personnalisé

Un événement personnalisé est un événement dont on va déclarer le comportement. Au niveau de la déclaration, c'est une procédure qui portera le tag "of object". Cela aura pour but d'indiquer à Delphi que la procédure déclarée n'est pas une procédure classique mais un événement personnalisé.


II. De la théorie à la pratique

Dans la partie de ce tutoriel, nous allons créer un composant dérivé d'un TEdit. Nous allons ajouter à ce composant l'événement "OnValide" qui va permettre d'effectuer une action selon le contenu du TEdit lorsque la touche "Entrée" sera enfoncée. Comme pour l'événement OnKeyPress, nous pourrons agir sur le contenu du TEdit pour, par exemple, tester le contenu d'un TEdit et modifier sa valeur en conséquence si besoin est.


II-A. Déclaration et Implémentation

Afin de discuter sur une chose concrète, je mets le code correspond à l'objet ci dessous :
Code du composant TMonEdit

unit UEditPerso;

interface

uses Windows,Classes,StdCtrls;

type
  // Déclaration de notre nouvel événement
  TEventValidate = procedure (Sender:TObject; var aText:string) of object;
  TMonEdit=class(TEdit)
  private
    // Evénement
    FOnValide: TEventValidate;
    // Text sauvegardé : servira pour la réaffectation
    FAText:string;

  public
    // Constructeur
    constructor Create(AOwner: TComponent);override;
    // Evénement KeyPress surchargé
    procedure KeyPress(var Key: Char);override;

  published
    // Evénement publié
    property OnValide:TEventValidate read FOnValide write FOnValide;

end;

procedure Register;

implementation

{ TMonEdit }

procedure Register;
begin
  RegisterComponents('JlnCompo', [TMonEdit]);
end;

// Constructeur
constructor TMonEdit.Create(AOwner: TComponent);
begin
  inherited;
end;

// KeyPress surchargé
procedure TMonEdit.KeyPress(var Key: Char);
begin
  inherited;
  if Key = Chr(VK_RETURN) then
  begin
    // Sauvegarde du contenu du TEdit
    FAText:=Text;
    // Si l'événement est assigné, on l'appel
    if Assigned(FOnValide) then
      FOnValide(Self,FAText);
    // Réaffectation de la valeur FAText à la propriété Text du TEdit (utile si on change la valeur de FAText entre 2)
    Text:=FAText;
  end;
end;

end.


Tout d'abord, il nous faut déclarer la procédure "of object" avant même de créer la classe de l'objet. Il faut donc la déclarer juste après le mot clé type :
Déclaration de l'événement

type
  // Déclaration de notre nouvel événement
  TEventValidate = procedure (Sender:TObject; var aText:string) of object;
  TMonEdit=class(TEdit)
  private 
  {...}
  public
  {...}
  published
  {...}
end;
Ici, on déclare l'événement TEventValide qui recevra en paramètre le Sender (en l'occurrence l'objet), et un paramètre de type string qui sera le contenu du TEdit.

info Notez la présence du mot clé "var" qui nous permettra de modifier le contenu de AText. (Cela équivalant par exemple au paramètre Key de l'événement KeyPress d'un TEdit).
Pour faire le filtrage sur la saisi, donc savoir quand on a appuyé sur la touche "Entrée", il nous faut surcharger la méthode KeyPress du TEdit. En effet, dans notre cas, nous allons déclencher l'événement FOnValide (si celui-ci est assigné) à l'appuie de la touche "Entrée".
Evénement KeyPress de TMonEdit

// KeyPress surchargé
procedure TMonEdit.KeyPress(var Key: Char);
begin
  inherited;
  if Key = Chr(VK_RETURN) then
  begin
    // Sauvegarde du contenu du TEdit
    FAText:=Text;
    // Si l'événement est assigné, on l'appel
    if Assigned(FOnValide) then
      FOnValide(Self,FAText);
    // Réaffectation de la valeur FAText à la propriété Text du TEdit (utile si on change la valeur de FAText entre 2)
    Text:=FAText;
  end;
end;
On surcharge l'événement KeyPress du TEdit pour faire un filtrage sur la touche saisie. Ici, lorsque l'utilisateur appuiera sur la touche "Entrée", on va vérifier si l'événement OnValide est assigné et si c'est le cas, on effectuera le code présent au sein de l'événement.

warning Il ne faut pas oublier de mettre le mot clé inherited pour que le composant puisse traiter l'événement KeyPress de base.

II-B. Phase de test

Dans cette partie, nous allons effectué un petit exemple de test afin de montrer que l'événement OnValidate s'effectue correctement. Pour se faire, on va créer un nouveau projet. Si vous avez réécris tout le code précédent dans un fichier .pas, il vous faudra auparavant installer le composant. Pour ce faire, faire ceci :

Maintenant que le composant est installé, il nous suffit de renseigner l'événement OnValide pour tester le code précedemment écrit :
Code de l'événement OnValide

procedure TForm1.MonEdit1Valide(Sender: TObject; var aText: String);
begin
  // Si aText = "slt" alors on le remplace par "Bonjour" (aText correspond à Text du TEdit)
  if aText = 'slt' then
    aText := 'Bonjour';
end;
Avec le code si dessus, si l'utilisateur saisi le text "slt" et appuie sur la touche "Entrée", alors on modifie le contenu du TMonEdit en affectant la valeur "Bonjour" à aText. Bien entendu, le code présenté est un exemple très simple pour la compréhension.


III. Conclusion

Nous avons vu dans cet article comment créer un événement personnalisé et par conséquent, reproduire un événement ressemblant au KeyPress d'un TEdit de base. Bien entendu, nous aurions pu faire ce test grâce à l'événement KeyPress de base, en évitant les surcharges et la création d'événement, mais la méthode proposé dans cet article permet d'aborder en douceur la création d'événement et de montrer le principe de fonctionnement.



            

Valid XHTML 1.1!Valid CSS!

Copyright © 2008 . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -