Cours VB.NETDate de mise à jour : 05/12/2010
X-Q. Choisir une icône, utiliser la barre de tâches - Créer un raccourci, lancer au démarrage
X-Q-1. Icône de l'application
X-Q-2. Bouton dans la barre des tâches
X-Q-3. Icône dans la barre de processus : NotifyIcon
X-Q-4. Créer un raccourci sur le bureau
X-Q-5. Lancer le programme au démarrage de Windows
X-Q-6. Interdire de démarrer le programme dans une plage horaire.
X-R. Multithreads
X-R-1. Un Thread, c'est quoi ?
X-R-2. Comment ajouter un Thread d'arrière plan ?
X-R-3. État d'avancement
X-R-4. Arrêter le thread en cours
X-R-5. Résultat retourné par le thread d'arrière plan
X-Q. Choisir une icône, utiliser la barre de tâches - Créer un raccourci, lancer au démarrage
En VB 2005.
X-Q-1. Icône de l'application
Pour avoir une icône liée à notre application, nous pouvons le faire au travers de l'onglet « Application » (dans les propriétés du projet) au niveau « Icône ». Remarquez que nous retrouvons les icônes importées dans les ressources projets
X-Q-2. Bouton dans la barre des tâches
Comment mettre un bouton correspondant à la form dans la barre de tache?
Mettre la propriété ShowInTaskBar de la form à True.
Il est préférable de le faire pour une seule form de l'application.
X-Q-3. Icône dans la barre de processus : NotifyIcon
Comment mettre une petite icône dans la barre de processus? Exemple : Mettre une icône bleu dans la barre de tache avec une info bulle indiquant le nom du programme (Ici: LDF).
Le Framework .Net 2.0 dispose de composants vous permettant d'ajouter très rapidement cette fonctionnalité. Ce sont le NotifyIcon et le ContextMenuStrip.
Dans la fenêtre « ToolBox », glissez un composant « NotifyIcon » sur notre formulaire. Il apparaît un composant NotifyIcon1 sous le formulaire:
Dans la fenêtre de propriétés de NotifyIcon1, donner à sa propriété « Text » la valeur «LDF» ; ceci correspond à l'info bulle qui s'affiche lorsque le pointeur de la souris vient se positionner au dessus de l'icône, dans la barre de processus.
Pour indiquer l'icône à utiliser dans la barre de tache:
Click droit sur le composant NotifyIcon1 en bas du formulaire, puis choisir une icône.(Fichier avec extension .ico)
Par code dans FormLoad par exemple: NotifyIcon1.Icon = MyIcone.ico
Noter que dans la fenêtre de propriétés on ne peut pas changer l'icône.
Création du menu associé à l'icône de la barre de tache.
L'idée à présent est de créer un menu contextuel sur l'action « click droit » de notre icône de notification.
Déposez un composant " ContextMenuStrip " sur notre formulaire dans la partie Design. Pour associer les 2 composants, dans les propriétés de « NotifyIcon1 », il suffit d' affecter à la propriété « ContextMenuStrip » le composant « ContextMenuStrip1 ».
Pour définir les menus du " ContextMenuStrip ", il suffit de cliquer sur le composant « ContextMenuStrip » pour faire apparaître un menu (en mode design uniquement). Celui qui sera visible dans la barre de tache en cours d'exécution.
Il suffit de remplir le menu comme d'habitude. On ajoute par exemple 'Ouvrir' et 'Fermer'.
En double-cliquant sur le menu, vous générez automatiquement la procédure évènement dans la partie Code.
Exemple de code pour 'Ouvrir' et 'Fermer'.
Private Sub OuvrirToolStripMenuItem_Click (ByVal sender As System. Object , ByVal e As System. EventArgs )
_Handles OuvrirToolStripMenuItem. Click
If Me. WindowState = FormWindowState. Minimized Then
Me. WindowState = FormWindowState. Normal
End If
End Sub
Private Sub FermerToolStripMenuItem_Click (ByVal sender As System. Object , ByVal e As System. EventArgs )
_Handles FermerToolStripMenuItem. Click
Application. Exit ()
End Sub
|
Au niveau du menu « Ouvrir », nous testons si l'application est réduite dans la barre des tâches. Si c'est le cas nous l'affichons normalement. Sur l'évènement « Fermer », nous allons tout simplement quitter l' application.
X-Q-4. Créer un raccourci sur le bureau
(menu Projet=>Propriétés de.. Références , bouton Ajouter, Onglet Parcourir, aller dans C:\Windows\System32, cliquer sur wshom.ocx puis Ok)
Exemple: créer un raccourci sur le bureau avec l'icône ''euro.ico', comme texte LDF et qui lance c:\Program Files\LDF\ldf.exe
Dim Bureau As IWshRuntimeLibrary. WshShell
Dim Raccourci As IWshRuntimeLibrary. WshShortcut
Dim Nom As String
Bureau = New IWshRuntimeLibrary. WshShell
Nom = My. Computer . FileSystem . SpecialDirectories . Desktop & " \LDF.lnk "
Raccourci = CType (Bureau. CreateShortcut (Nom), IWshRuntimeLibrary. WshShortcut )
Raccourci. TargetPath = " c:\Program Files\ldf\ldf.exe "
Raccourci. IconLocation = " C:\WINLDF\Icone\euro.ico "
Raccourci. Save ()
|
X-Q-5. Lancer le programme au démarrage de Windows
Pour cela, il faut dans le registre (Software\Microsoft\Windows\CurrentVersion\Run) ajouter le nom du programme.
Imports Microsoft. Win32
Dim obj_RegistryKey As RegistryKey
obj_RegistryKey = Registry. CurrentUser . OpenSubKey (" Software\Microsoft\Windows\CurrentVersion\Run " , True )
obj_RegistryKey. SetValue (" LDF " , " C:\Program Files\LDF.exe " )
|
Voir aussi le chapitre sur le registre.
X-Q-6. Interdire de démarrer le programme dans une plage horaire.
C'est pas gentil!! d'empêcher le programme de démarrer entre 0H et 8H.
il faut mettre le code dans Application_StartUp (propriété du projet, onglet application, bouton 'Afficher les évènements de l'application", Liste déroulante à gauche 'MyApplication', liste déroulante à droite 'StartUp').
Private Sub MyApplication_StartUp (. . )
If Now . TimeOfDay > New TimeSpan (0,0,0) OrElse Now . TimeOfDay < New TimeSpan (8,0,0)Then
e. Cancel = True
End If
End Sub
|
Dans la Sub MyApplication_ShutDown, on peut par exemple enregistrer les données avant que l'application se ferme.
X-R. Multithreads
X-R-1. Un Thread, c'est quoi ?
Le thread représente l'exécution d'un processus en mémoire. Un système multithread tel que Windows offre la capacité d'exécuter en parallèle plusieurs threads et donc plusieurs traitements en simultané.
On peut utiliser la Classe Thread, créer autant de thread que l'on veut, mais il faut gérer un tas de chose et c'est l'horreur.
On peut aussi (Framework 2) utiliser un Thread d'arrière plan (et un seul) qui est très simple d'utilisation. Son intérêt est que lorsqu'on a une tache très longue (très long calcul par exemple), il est possible d'effectuer le calcul long en arrière plan, pendant ce temps, on peut continuer à travailler dans le formulaire (thread principal); quand le thread d'arrière plan est terminé, on affiche les résultats.
X-R-2. Comment ajouter un Thread d'arrière plan ?
Il faut aller chercher un composant BackgroundWorker dans la boite à outils et le déposer sur le formulaire, il apparaît en dessous et se nomme par défaut BackgroundWorker1.
La propriété WorkerReportsProgress donne à notre BackgroundWorker la possibilité de nous informer ou non de son état d'avancement.
La propriété WorkerSupportsCancellation nous permet d'autoriser l'annulation de la tâche en cours du BackgroundWorker.
Dans le code:
BackGroundWorker1. RunWorkerAsync (Objet) permet de déclencher le thread d
BackGroundWorker1. DoWork : est l
C
ProgressChanged : Cet évènement, si la propriété WorkerReportsProgress est activée,
se déclenche lorsque nous voulons indiquer que l
RunWorkerCompleted : Une fois le traitement du BackgroundWorker terminé cet événement est déclenché.
|
Exemple:
Si on clique sur un bouton cela crée un thread d'arrière plan qui effectue un calcul long.
Private Sub Button1_Click (ByVal sender As System. Object , ByVal e As System. EventArgs ) _
Handles Button1. Click
BackgroundWorker1. RunWorkerAsync ()
End Sub
Private Sub BackgroundWorker1_DoWork (ByVal sender As System. Object , _
ByVal e As System. ComponentModel . DoWorkEventArgs ) Handles BackgroundWorker1. DoWork
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted (ByVal sender As Object, _
ByVal e As System. ComponentModel . RunWorkerCompletedEventArgs ) _
Handles BackgroundWorker1. RunWorkerCompleted
Label1. Text = " terminé "
End Sub
|
La méthode RunWorkerAsync peut avoir un paramètre qui sera transmis au thread d'arrière plan.
Mais un seul; ce paramètre étant de type objet, vous pouvez passer un tableau d'objets (string, int, etc...) ou même une structure
Ici dans l'exemple, on a un paramètre numérique, utilisé dans le thread d'arrière plan pour faire un calcul.
Private Sub Button1_Click (ByVal sender As System. Object , ByVal e As System. EventArgs ) _
Handles Button1. Click
BackgroundWorker1. RunWorkerAsync (180)
End Sub
|
Le paramètre , dans DoWork, se retrouve dans e.Argument , comme c'est un Objet, il faut le convertir en Integer pour l'utiliser:
Private Sub BackgroundWorker1_DoWork (ByVal sender As System. Object , _
ByVal e As System. ComponentModel . DoWorkEventArgs ) Handles BackgroundWorker1. DoWork
a= a + CType (e. Argument , Integer)
End Sub
|
Le thread d'arrière plan peut appeler une Sub.
Private Sub BackgroundWorker1_DoWork (ByVal sender As System. Object , _
ByVal e As System. ComponentModel . DoWorkEventArgs ) Handles BackgroundWorker1. DoWork
Calcul ()
End Sub
Sub Calcul ()
End Sub
|
(Le thread principal peut lui aussi appeler la routine Calcul.)
Les variables sont accessibles dans le thread d'arrière plan:
Public MyVar As Integer = 1
Private Sub BackgroundWorker1_DoWork (ByVal sender As System. Object , _
ByVal e As System. ComponentModel . DoWorkEventArgs ) Handles BackgroundWorker1. DoWork
MyVar= Myvar + 1
End Sub
|
Par contre les objets de l'interface (du thread principal) ne sont pas accessibles dans le thread d'arrière plan:
Cela déclenche une exception si on tente d'y accéder.
X-R-3. État d'avancement
Si la tâche d'arrière plan est très longue, il peut être intéressant de montrer dans l'interface utilisateur, l'état d'avancement de cette tâche.
Mais on rappelle que la tâche de fond ne peut pas intervenir sur l'interface.
Il faut donc:
Mettre la propriété WorkerReportsProgress de notre BackgroundWorker à True.
Dans le thread d'arrière plan, il faut, à chaque fois que l'on veut indiquer la progression, appeler la méthode ReportProgress en indiquant l'état d'avancement avec un paramètre.
Private Sub BackgroundWorker1_DoWork ()
Dim MyThread As BackgroundWorker = CType (sender, BackgroundWorker)
MyThread. ReportProgress (pourcent)
End Sub
|
Noter que c'est au programmeur de créer la logique calculant d'état d'avancement (et donc la valeur de la variable pourcent)
Enfin dans le thread principal, la Sub BackgroundWorker1_ProgressChanged() s'exécute à chaque fois que le thread d'arrière plan le demande et met à jour un index visuel sur l'interface.
Private Sub BackgroundWorker1_ProgressChanged ( _
ByVal sender As Object, _
ByVal e As ProgressChangedEventArgs) _
Handles BackgroundWorker1. ProgressChanged
MyProgressBarr. Value = e. ProgressPercentage
End Sub
|
X-R-4. Arrêter le thread en cours
Il suffit de faire dans le thread principal:
BackgroundWorker1. CancelAsync ()
|
Dans le thread d'arrière plan, il faut vérifier si l'arrêt à été demandé:
Dans DoWork on récupère le thread d'arrière plan qui est le sender, on regarde si sa propriété CancellationPending est à True, si oui on met e.cancel à True ce qui arrête le thread d'arrière plan.
Dim MyThread As BackgroundWorker = CType (sender, BackgroundWorker)
If MyThread. CancellationPending Then e. Cancel = True
|
Si on veut tester la demande d'arrêt dans une Sub, il faut envoyer en paramètre à cette sub MyThread et e.
X-R-5. Résultat retourné par le thread d'arrière plan
Il peut y avoir plusieurs types de résultat à la fin, on peut le voir dans l'argument e de type RunWorkerCompletedEventArgs retourné par la procédure BackgroundWorker1.RunWorkerCompleted.
:
* Il y a eu une erreur pendant le traitement. Dans ce cas la propriété e.Error est différente de null.
* Le traitement a été annulé. Dans ce cas la propriété e.Canceled est à true.
* Le traitement s'est déroulé normalement. Le résultat se trouve dans la propriété e.Result .(Bien sur ,dans DoWork il faut avoir mis le résultat des calculs dans e.Result)
Exemple de traitement:
Private Sub BackgroundWorker1_RunWorkerCompleted ( _
ByVal sender As Object, _
ByVal e As RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1. RunWorkerCompleted
If Not (e. Error Is Nothing ) Then
lblResult. Text = " Il y a eu une erreur : " + e. Error . Message
ElseIf e. Cancelled Then
lblResult. Text = " Opération annulée "
Else
lblResult. Text = " Opération Ok Résultat : " + e. Result . ToString
End If
End Sub
|
Les sources présentés sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © .
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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la SACD.
|