Formation Delphi utilisation de la classe NotifyIcon

Formation utilisation de la classe NotifyIcon dans Delphi, tutoriel & guide de travaux pratiques en pdf.

Utilisation dans une application Winform

Mise en place des composants

Créer une nouvelle application Winform, et placer sur la fenêtre un composant NotifyIcon, un composant ContextMenu et un composant Timer. Tous ces composants sont inclus dans la palette « components ».
Notez que dans le cas d’un fiche Winform les composants visuels ne sont pas dessinés sur la fiche mais placés dans un bandeau en dessous. Il suffit ensuite de cliquer sur le composant voulu pour en modifier les propriétés.
Cliquer sur le composant NotifyIcon1 et ajuster les propriété voulues. Pour que l’icône soit affichée il faut ajouter une icône au composant ( ce qui est fait très simplement par le bouton ‘…’ ) et mettre sa propriété visible à True.
Remplir de même les propriétés Text et ContextMenu en sélectionnant ContextMenu1.
Renseigner ensuite le menu contextuel, ceci est réalisé en cliquant sur le composant dans le bas pour faire appaitre un debut de menu dans la fiche. Il faut alors remplir les éléments de menu comme pour une application VCL classique.
Remarque : renommer les éléments de menu avant d’y associer des événements. Car le nom des événements n’est pas modifié automatiquement ensuite. Il est tout de même possible de les changer manuellement.
Renseigner enfin les propriétés du timer : interval =500 et enabled à False.

Ajout du code en réponse aux événements

En premier lieu renseigner les événements du menu contextuel :
Sélectionnez
procedure TWinForm.MenuReduire_Click(sender: System.Object; e: System.EventArgs); begin
// L’option réduire permet de … réduire la fenêtre ! WindowState:=FormWindowState.Minimized;
end;
procedure TWinForm.MenuRestaurer_Click(sender: System.Object; e: System.EventArgs); begin
// L’option restaurer permet de … restaurer la fenêtre ! If WindowState=FormWindowState.Minimized
Then WindowState:=FormWindowState.Normal; Show;
end;
procedure TWinForm.MenuFermer_Click(sender: System.Object; e: System.EventArgs); begin
// Fermer la fenêtre Close;
end;
Renseigner ensuite l’événement MouseDown du NotifyIcon1 :
Sélectionnez
procedure TWinForm.NotifyIcon1_MouseDown(sender: System.Object; e:
System.Windows.Forms.MouseEventArgs);
begin
// Dans le cas d’un click gauche sur l’icone, on test si c’est le premier
// click puis on lance le timer de retard d’affichage du menu.
// Cette méthode permet de laisser le temps de double cliquer sur l’icone
// avant que le menu n’apparaisse.
If (e.Button=System.Windows.Forms.MouseButtons.Left) And (e.Clicks=1)
Then
Timer1.Enabled:=True;
end;
Notez que la structure des événements dans les objets .NET est toujours sur le même modèle. Deux objets sont passés en paramètres, le premier ( Sender ) est l’objet ayant reçu/provoqué l’événement. Le deuxième ( e ) contient des informations complémentaire. La classe de e dépend du type d’événement. Dans le cas ci-dessus, e est de type MouseEventArgs. Les propriétés de cette classe permettent de différencier le type de bouton et le style d’appui. Il n’y a pas de propriété DoubleClick ou de type de bouton DoubleClick comme dans les événements VCL. Ici, c’est le nombre de click qu’il faut comparer.
Le bouton droit ne sera pas testé, car le menu contextuel est géré automatiquement par le composant lors du click droit.
Ajouter ensuite le code pour le double click :
Sélectionnez
procedure TWinForm.NotifyIcon1_DoubleClick(sender: System.Object; e:
System.EventArgs);
begin
// Dans le cas d’un double-click, on arrête le timer lancé par le premier
// click et on effectue l’action par défaut.
Timer1.Enabled:=False;
MenuRestaurer_Click(Sender,e);
end;
Et enfin celui de l’événement Tick du Timer :
Sélectionnez
procedure TWinForm.Timer1_Tick(sender: System.Object; e: System.EventArgs); begin
// Si le timer s’est écoulé, c’est qu’il n’y a pas eu de double-click.
// Dans ce cas on affiche le menu là ou est la souris. Timer1.Enabled:=False; ContextMenu1.Show(Self,Control.MousePosition);
end;

Exécution

L’application est maintenant prête à être essayée.
Le source complet de cet exemple en disponible ici : Source0078

Utilisation dans une application VCL.NET

Dans le une applicaton VCL.NET le composant NotifyIcon ne peut pas être utilisé visuellement. L’instance sera donc créée et gérée dynamiquement.

Création d’une instance de le classe NotifyIcon

Pour pouvoir utiliser le composant NotifyIcon le projet à besoin de référencer l’assemblage qui le contient : System.Windows.Forms.dll . Il faudra aussi référencer System.Drawing.dll afin de pouvoir créer une instance de la classe System.Drawing.Icon.
Pour ajouter une référence aller dans le menu Project puis sélectionner Add référence…
Ajouter les références pour System.Windows.Forms.dll,System.Drawing.dll.
Il faut ensuite ajouter dans le uses les assembly référencées :
Sélectionnez
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, System.Windows.Forms,System.Drawing;
Ajouter ensuite la déclaration dans Form1 manuellement comme habituellement pour la création dynamique d’une composant. Il faut aussi ajouter les méthodes qui seront ajoutés aux événements.
Sélectionnez
TForm1 = class(TForm)

private
{ Private declarations }
// Il faut déclarer manuellement le composant WinForm NotifyIcon1: NotifyIcon;
// Ainsi que les événement associés
procedure NotifyIcon1_DoubleClick(sender: System.Object; e: System.EventArgs);
procedure NotifyIcon1_MouseDown(sender: System.Object; e:
System.Windows.Forms.MouseEventArgs);
public
{ Public declarations } end;
La création du composant sera effectuée dans l’événement OnCreate de la fiche. Pour créer un composant Winform il faut procéder comme les composants VCL, en appelant son constructeur.
Sélectionnez
// Redéclaration de la fonction ExtractIco, celle de Windows.pas n’étant pas correcte. [DllImport(‘Shell32.dll’, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = ‘ExtractIconEx’)]
function ExtractIco(lpszFile: string; nIconIndex: Integer;
out phiconLarge:IntPtr;out phiconSmall: IntPtr; nIcons: UINT): UINT; external;
procedure TForm1.FormCreate(Sender: TObject); begin
// L’instance de la classe NotifyIcon doit être créée dynamiquement
// car les composants WinForm ne peuvent être déposés sur des fiches
// VCLForm.
NotifyIcon1:=System.Windows.Forms.NotifyIcon.Create; NotifyIcon1.Text:=’Nono40 – Source 79′;
// Si l’icone est celle de l’exécutable ExtractIco(Forms.Application.ExeName,0,Large,Small,1); NotifyIcon1.Icon:=System.Drawing.Icon.FromHandle(Large);
// Association des méthodes aux événements correspondants. Notez ici
// la différence importante avec Delphi 7. Les événements sont ajoutés
// dans la liste des événements. Ce n’est plus une simple affectation
// d’adresse de méthode. Include(NotifyIcon1.DoubleClick,NotifyIcon1_DoubleClick); Include(NotifyIcon1.MouseDown ,NotifyIcon1_MouseDown);
// L’icône est affichée dans la barre de stâches NotifyIcon1.Visible:=True;
end;
Notez dans le code ci-dessus la différence importante pour la création du lien entre les méthodes de la fiche et les événements du composant. Il ne faut plus mettre à jour l’adresse de l’événement en associant la méthode à l’événement mais il faut utiliser la fonction Include qui ajoute un gestionnaire d’événement dans la liste des gestionnaires.
Notez aussi que nous n’utiliserons pas NotifyIcon.ContextMenu, car il faudrait aussi créer un menu contextuel WinForm, alors qu’il est plus simple ici d’utiliser un menu contextuel VCL. La seule chose qu’il faudra effectuer en plus est l’affichage lors du click droit.
L’icône affichée ici est celle du fichier exécutable récupérée par la procédure ExtractIcon. Il est possible aussi d’utiliser un fichier séparé ou un TImage pour stocker l’icône. Dans ces deux cas le code de création de NotifyIcon1.Icon est le suivant :
Sélectionnez
// Si l’icône est lue dans un fichier placé à coté de l’exécutable NotifyIcon1.Icon:=System.Drawing.Icon.Create(‘Nono.ico’);
// Si l’icone est stockée dans un TImage sur la fiche Ico:=IntPtr.Create(Image1.Picture.Icon.Handle); NotifyIcon1.Icon:=System.Drawing.Icon.FromHandle(Ico);

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

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