Création d’un contrôle winform avec Delphi .NET

Introduction
I – Création de l’assemblage
II – Ajout de la propriété AiguilleSec
III – Ajout du code de dessin
IV – Surcharge de la taille par défaut
V – Ajout d’un événement
VI – Utilisation du composant dans un projet Delphi .NET
VII – Utilisation du composant dans un projet C#
Conclusion

Introduction

Cet article va présenter la création d’un composant WinForm personnalisé dérivant du type System. Windows. Forms. UserControl. Ce composant est une horloge analogique avec ou sans l’aiguille des secondes :
La méthode proposée ici est l’adaptation à Delphi 8 de l’article de CGI: Création d’un contrôle WinForm pour .Net

I – Création de l’assemblage

La notion de paquet en tant que tel n’existe plus dans Delphi 8. Ceux-ci ont été remplacés par la définition d’assemblage introduite par .NET. Pour créer un composant WinForm utilisable il faut créer un nouvel assemblage contenant ce composant.
Pour créer un nouvel assemblage pour le composant, utilisez Fichier->Nouveau->Paquet. Enregistrez le projet comme PHorloge.bdsprj.
Ensuite ajouter un contrôle Winform avec Fichier->Nouveau->Contrôle utilisateur. Enregistrer le code comme UHorloge.pas. Dans l’éditeur de propriété qui vient de s’ouvrir renommez ( propriété Name ) le composant en THorloge.
Notez que Delphi fait alors directement dériver le composant de la classe System.Windows.Forms.UserControlet crée dans l’unité tout le code minimum de gestion du composant.

II – Ajout de la propriété AiguilleSec

La propriété AiguilleSec va définir si l’aiguille des secondes est affichée ou non. La définition d’une nouvelle propriété est identique à la méthode utilisée dans la VCL. Il faut ajouter une variable privée contenant la valeur de la propriété et définir les méthodes éventuelles de lecture et écriture de la propriété.
Pour ceci il faut ajoutez dans la définition du composant les ligne suivantes :

private
{ Private Declarations }
FAiguilleSec:Boolean;
ProcedureSetAiguilleSec(Value:Boolean);
public
constructorCreate;
published
[Category('Appearance'),
Description('Affiche l''aiguille des secondes.'),
DefaultValue(true)]
PropertyAiguilleSec:Boolean ReadFAiguilleSec WriteSetAiguilleSec;
end;

Notez ici la définition des attributs de la propriété permettant de définir la catégorie d’affichage ainsi que le texte d’aide associé dans l’inspecteur d’objet.
Dans le constructeur du composant, ajouter la valeur initiale de la propriété :

constructorTHorloge.Create;
begin
inheritedCreate;
//
Required for Windows Form Designer support
//
InitializeComponent;
//
TODO: Add any constructor code after InitializeComponent call
//
FAiguilleSec := True;
end;

Et pour terminer, définir le code de la méthode d’écriture de la propriété, l’appel d’invalidate va demander au contrôle de se redessiner.

procedureTHorloge.SetAiguilleSec(Value: Boolean);
begin
FAiguilleSec:=Value;
Invalidate;
end;

III – Ajout du code de dessin
Le dessin devant être effectué toutes les secondes, nous allons ajouter un Timer au contrôle afin d’obtenir un événement régulier. Le dessin en lui-même sera assuré par la surcharge de la méthode OnPaint du contrôle.
La définition de la classe devient donc :

THorloge = class(System.Windows.Forms.UserControl)
//....
strict protected
/// <summary>
/// Clean up any resources being used.
/// </summary>
procedureDispose(Disposing: Boolean); override;
procedureOnPaint(e:PaintEventArgs); Override;
private
{ Private Declarations }
T:Timer;
FAiguilleSec:Boolean;
ProcedureSetAiguilleSec(Value:Boolean);
ProcedureTempo(myObject:System.Object; myEventArgs:System.EventArgs );
public
constructorCreate;
published
[Category('Appearance'),
Description('Affiche l''aiguille des secondes.'),
DefaultValue(true)]
PropertyAiguilleSec:Boolean ReadFAiguilleSec WriteSetAiguilleSec;
end;
Comme d'habitude le composant enfant sera créé dans le constructeur de l'objet.
constructorTHorloge.Create;
begin
inheritedCreate;
//
Required for Windows Form Designer support
//
InitializeComponent;
//
TODO: Add any constructor code after InitializeComponent call
//
FAiguilleSec := True;
SetStyle(ControlStyles.DoubleBuffer OrControlStyles.UserPaint Or
ControlStyles.AllPaintingInWmPaint, true);
T:=Timer.Create;
Include(T.Tick,Tempo);
T.Interval := 1000;
T.Start;
end;

Notez ici l’ajout d’un gestionnaire d’événement ( Tempo dans notre exemple ) à la liste des gestionnaire associés à T.Tick. Cet ajout est réalisé à l’aide de la procédure Include, ce point est différent de la surcharge habituelle d’un événement d’un contrôle VCL.
Notez aussi la modification du style du contrôle afin de définir un dessin personnalisé et un double-buffer pour éviter le scintillement lors du tracé.
Le code de la procédure Tempo ne fera qu’invalider la zone d’affichage du composant :

procedureTHorloge.Tempo(myObject: TObject;
myEventArgs: System.EventArgs);
begin
Invalidate;

Si le lien ne fonctionne pas correctement, veuillez nous contacter (mentionner le lien dans votre message)
Création d’un contrôle winform avec Delphi .NET (292.65 KO) (Cours PDF)
Contrôle winform avec Delphi

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *