Cours VB.NET

Image non disponible


précédentsommairesuivant

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

Image non disponible

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

Image non disponible

X-Q-2. Bouton dans la barre des tâches

Comment mettre un bouton correspondant à la form dans la barre de tache?

Image non disponible

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).

Image non disponible

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:

Image non disponible

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.

Image non disponible

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'.

 
Sélectionnez

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

 
Sélectionnez

'Il faut d'abord ajouter la référence wshom.ocx qui est dans C:\Windows\System32

(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

 
Sélectionnez

Dim Bureau As IWshRuntimeLibrary.WshShell

Dim Raccourci As IWshRuntimeLibrary.WshShortcut

Dim Nom As String

Bureau = New IWshRuntimeLibrary.WshShell

'   Chemin et nom du raccourci

Nom = My.Computer.FileSystem.SpecialDirectories.Desktop & "\LDF.lnk" 'pour 'LDF'

Raccourci = CType(Bureau.CreateShortcut(Nom), IWshRuntimeLibrary.WshShortcut)

'   Cible à exécuter

Raccourci.TargetPath = "c:\Program Files\ldf\ldf.exe"

'   Icône à utiliser

Raccourci.IconLocation = "C:\WINLDF\Icone\euro.ico"

'   Enregistrement du raccourci

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.

 
Sélectionnez

Imports Microsoft.Win32 'en haut du module.

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').

 
Sélectionnez

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.

Image non disponible

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:

 
Sélectionnez

BackGroundWorker1.RunWorkerAsync(Objet) permet de déclencher le thread d'arrière plan.

BackGroundWorker1.DoWork : est l' évènement qui se déclenche lorsque nous faisons appel au BackgroundWorker. 
C'est cette routine qui tourne en arrière plan.

ProgressChanged : Cet évènement, si la propriété WorkerReportsProgress est activée, 
se déclenche lorsque nous voulons indiquer que l'état d'avancement du BackgroundWorker change.

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.

 
Sélectionnez

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles Button1.Click

 'La méthode RunWorkerAsync() du BackgroundWorker déclenche le thread d'arrière plan.

  BackgroundWorker1.RunWorkerAsync()

End Sub

 

'La procédure DoWork contient le code effectué en arrière plan.

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _ 
 ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

   'mes calculs très long

End Sub

'Quand le code d'arrière plan est terminé la procédure RunWorkerCompleted est exécutée.

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _ 
 ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _ 
 Handles BackgroundWorker1.RunWorkerCompleted

' ici, elle affiche un message indiquant de le thread d'arrière plan est terminé.  

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.

 
Sélectionnez


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:

 
Sélectionnez

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.

 
Sélectionnez

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _ 
 ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

   Calcul()

End Sub

Sub Calcul ()

'Mes calculs

End Sub

(Le thread principal peut lui aussi appeler la routine Calcul.)

Les variables sont accessibles dans le thread d'arrière plan:

 
Sélectionnez

'MyVar par exemple qui est Public et déclarée en tête de module.

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.

Image non disponible

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.

 
Sélectionnez

Private Sub BackgroundWorker1_DoWork()

 Dim MyThread As BackgroundWorker = CType(sender, BackgroundWorker)'récupération du thread d'arrière plan

 MyThread.ReportProgress(pourcent)'pourcent est un Integer indiquant l'état d'avancement.

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.

 
Sélectionnez


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:

 
Sélectionnez

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.

 
Sélectionnez

Dim MyThread As BackgroundWorker = CType(sender, BackgroundWorker)

If MyThread.CancellationPending Then e.Cancel = True  'ce qui arrête le thread d'arrière plan.

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:

 
Sélectionnez

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
		

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.