GRATUIT

Vos offres d'emploi informatique

Développeurs, chefs de projets, ingénieurs, informaticiens
Postez gratuitement vos offres d'emploi ici visibles par 4 000 000 de visiteurs uniques par mois

emploi.developpez.com

Cours VB.NET

Image non disponible


précédentsommairesuivant

X-I. Faire une aide pour l'utilisateur

Image non disponible

Quand un utilisateur utilise votre logiciel, il se pose parfois des questions, comment l'aider?

Avec des aides que le programmeur doit créer et ajouter au programme.

X-I-1. Généralisées sur les 4 sortes d'aide

  1. La Class Help permet d'ouvrir un fichier d'aide.
  2. Le composant HelpProvider offre 2 types d'aide.
    • Le premier consiste à ouvrir un fichier d'aide grâce à F1.
    • Quant au second, il peut afficher une aide brève pour chacun des contrôles en utilisant le bouton d'aide (?). Il s'avère particulièrement utile dans les boîtes de dialogue modale.
  3. Le composant ToolTip offre lui:
    • une aide propre à chaque contrôle des Windows Forms.
  4. Le composant ErrorProvider est un moyen de signaler une erreur dans un contrôle

X-I-2. Les fichiers d'aide

On peut utiliser les formats:

HTML Fichier .htm

HTMLHelp 1.x ou version ultérieure Fichier .chm

HLP Fichier .hlp les plus anciens.

Comment créer ces fichiers:

Pour les fichiers HTM:

Utiliser Word, ou FrontPage, ou Netscape Composeur...

Pour les fichiers HLP:

Utiliser Microsoft HelpWorkshop livré avec VB6 (les fichiers .HLP fonctionnent nativement sous Windows 98 et XP mais ne fonctionne plus sous Windows Vista; si on veut quand même les utiliser, il faut télécharger puis installer WinHelp32.exe pour Vista.

Pour les fichiers CHM:

Thierry AIM fournit sur le site developpez.com un excellent cours:

http://thierryaim.developpez.com/tutoriel/chm/

On conseille d'utiliser les fichiers chm.

X-I-3. Utilisation des fichiers d'aide

X-I-3-a. Appel direct

La classe Help permet d'ouvrir directement par code un fichier d'aide.

C'est ce qu'on utilise dans le menu '?' d'un programme (sous menu 'Aide'); dans la procédure correspondante (Sub Aide_Click) on écrit:

 
Sélectionnez

Help.ShowHelp (Me, "MonAide.html")

MonAide.html doit être dans le répertoire de l'application (répertoire Bin)

Cela peut être un URL , l'adresse d'une page sur Internet!!

Il peut y avoir un 3ème paramètre: on verra cela plus bas (C'est le même paramètre que la propriété HelpNagigator de HelpProvider).

 
Sélectionnez

Help.ShowHelp(Me, "file://C:\Windows\Help\calc.chm", HelpNavigator.TableOfContents)

X-I-3-b. Appel par F1

Vous pouvez utiliser le composant HelpProvider pour attacher des rubriques d'aide figurant dans un fichier d'aide (au format HTML, HTMLHelp 1.x ou ultérieur) à des contrôles de l'interface utilisateur.

Quand on met un composant HelpProvider dans un formulaire (avec dans la propriété HelpNamespace, le nom de fichier d'aide), cela ajoute aux contrôles de ce formulaire les propriétés:

  • HelpNavigator qui déterminent le type d'appel (par numéro de rubrique, mot clé..)
  • HelpKeyword qui contient le paramètre de recherche (le numéro de rubrique, le mot clé..)

Quand l'utilisateur est sur le contrôle et qu'il clique sur F1 la rubrique d'aide s'ouvre.

Pour créer cette aide:

Faites glisser un composant HelpProvider de la boîte à outils vers votre formulaire.

Le composant se place dans la barre d'état située au bas de la fenêtre.

Image non disponible

Dans la fenêtre Propriétés du HelpProvider, donner à la propriété HelpNamespace, un nom de fichier d'aide .chm, ou .htm.

Dans la fenêtre propriétés du contrôle qui doit déclencher l'aide, donner à la propriété HelpNavigator une valeur de l'énumération HelpNavigator.

Cette valeur détermine la façon dont la propriété HelpKeyword est passée au système d'aide. HelpNagigator peut prendre la valeur:

AssociateIndex Indique que l'index d'une rubrique spécifiée est exécuté dans l'URL spécifiée.
Find Indique que la page de recherche d'une URL spécifiée est affichée.
Index Indique que l'index d'une URL spécifiée est affiché.
KeywordIndex Spécifie un mot clé à rechercher et l'action à effectuer dans l'URL spécifiée.
TableOfContents Indique que le sommaire du fichier d'aide HTML 1.0 est affiché.
Topic Indique que la rubrique à laquelle l'URL spécifiée fait référence est affichée.

Définisser la propriété HelpKeyword dans la fenêtre Propriétés. (la valeur de cette propriété sera passé au fichier d'aide afin de déterminer la rubrique d'aide à afficher)

Au moment de l'exécution, le fait d'appuyer sur F1 lorsque le contrôle (dont vous avez défini les propriétés HelpKeyword et HelpNavigator) a le focus ouvre le fichier d'aide associé à ce composant HelpProvider.

Remarque Vous pouvez définir, pour la propriété HelpNamespace, une adresse http:// (telle qu'une page Web). Cela permet d'ouvrir le navigateur par défaut sur la page Web avec la chaîne indiquée dans la propriété HelpKeyword utilisée comme ancre (pour accéder à une section spécifique d'une page HTML).

Dans le code il faut utiliser la syntaxe HelpProvider.SetHelpKeyword=".."

Exemple:

Pour afficher la page d'aide sur les formes ovales, sélectionnez la valeur HelpNavigator.KeyWordIndex dans la liste déroulante Help Navigator ; dans la zone de texte HelpKeyword, 'tapez " ovales"» (sans guillements).

X-I-3-c. Utilisation du bouton d'aide

Vous pouvez afficher l'aide pour un contrôle via le bouton Aide (?) situé dans la partie droite de la barre de titre .

Il faut que l'utilisateur clique sur le bouton d'aide (?) puis sur le contrôle qui nécessite une aide, ce qui entraîne l'ouverture d'un carré blanc contenant un message d'aide.

Image non disponible

L'affichage de l'aide de cette façon convient particulièrement aux boîtes de dialogue. En effet, avec un affichage modal des boîtes de dialogue, il n'est pas facile d'ouvrir des systèmes d'aide externe, dans la mesure où les boîtes de dialogue modales doivent être fermées avant que le focus puisse passer à une autre fenêtre. Le bouton Réduire ou Agrandir ne doit pas être affiché dans la barre de titre. Il s'agit d'une convention pour les boîtes de dialogue alors que les formulaires disposent généralement de boutons Réduire et Agrandir.

Pour afficher l'aide contextuelle:

Faites glisser un composant HelpProvider de la boîte à outils vers votre formulaire.

Le contrôle est placé dans la barre d'état des composants située au bas de la fenêtre.

Attribuer aux propriétés Minimize et Maximize de la fenêtre la valeur false.

Puis,

Dans la fenêtre Propriétés de la fenêtre, donner à la propriété HelpButton la valeur true. Cette configuration permet d'afficher dans la partie droite de la barre de titre du formulaire un bouton contenant un point d'interrogation.

Sélectionnez le contrôle pour lequel vous souhaitez afficher l'aide dans votre formulaire et mettre dans la propriété HelpString la chaîne de texte qui sera affichée dans une fenêtre de type ToolTip.

Test:

Appuyez sur F5.

Appuyez sur le bouton Aide (?) de la barre de titre et cliquez sur le contrôle dont vous avez défini la propriété HelpString. Le toolTip apparaît.

X-I-3-d. Utilisation des info bulles: ToolTip

Le composant ToolTip peut servir à afficher des messages d'aide courts et spécialisés relatifs à des contrôles individuels.

Cela ouvre une petite fenêtre indépendante rectangulaire dans laquelle s'affiche une brève description de la raison d'être d'un contrôle lorsque le curseur de la souris pointe sur celui-ci.

Il fournit une propriété qui précise le texte affiché pour chaque contrôle du formulaire.

En outre, il est possible de configurer, pour le composant ToolTip, le délai qui doit s'écouler avant qu'il ne s'affiche.

Comment faire:

1- Ajoutez le contrôle ToolTip au formulaire à partir de la ToolBox. Il se met en bas.

Chaque contrôle à maintenant, dans ses propriétés, une propriété ToolTip ou on peut mettre le texte a afficher dans l'info bulle.

2- Utilisez la méthode SetToolTip du composant ToolTip.

On peut aussi le faire par code:

 
Sélectionnez

ToolTip1.SetToolTip(Button1, "Save changes")

3- Par code créons de toute pièce un ToolTip.

 
Sélectionnez

Dim toolTip1 As New ToolTip()

' modifions les délais du ToolTip.
toolTip1.AutoPopDelay = 6000  'nombre de millisecondes d'affichage
toolTip1.InitialDelay = 2000 'nombre de millisecondes avant l'affichage
toolTip1.ReshowDelay = 500
' Force le ToolTip a être visible que la fenêtre soit active ou non .
toolTip1.ShowAlways = True

' donne le texte de l'info bulle à 2 contrôles.
toolTip1.SetToolTip(Me.button1, "My button1")
toolTip1.SetToolTip(Me.checkBox1, "My checkBox1")
toolTip1.IsBalloon= True 'Donne une forme de ballon comme dans les BD
Image non disponible

On peut aussi modifier les couleurs ajouter un titre, une icone au ToolTip.
(ToolTipIcon, ToolTipTitle, BackColor, ForeColor).

X-I-3-e. Utilisation d'ErrorProvider

Le composant ErrorProvider peut servir à afficher un panneau d'erreur et un message d'aide court.

Exemple: une zone TextBox doit permettre de saisir une valeur numérique. si cela n'est pas le cas et qu'on tente de sortir du textbox ou de fermer la fenêtre, le panneau (!) s'affiche , et on ne peut pas sortir le focus du textbox.

Si on survole le panneau(!) cela affiche le message.

Image non disponible

Pour cela on utilise l'évènement Validating du textBox qui est déclenché quand on tente de sortir, si le texte n'est par numérique, on donne le message au ErrorProvider et on annule la sortie (e.Cancel=True)

 
Sélectionnez

Private Sub MyBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) 
_Handles MyBox.Validating

If Not IsNumeric(Me.MyBox.Text) Then

    Me.ErrorProvider1.SetError(Me.MyBox, "L'entrée doit être numérique")

    e.Cancel = True

Else

    Me.ErrorProvider1.SetError(Me.MyBox, "")

End If

End Sub

X-J. Appeler une API

Les Api (Application Programming Interface) permettent d'utiliser des bibliothèques de liaisons dynamiques (DLL, Dynamic-Link Libraries), qui contiennent des fonctions (généralement écrites en C) et qui sont compilées dans une DLL.

Les Dll contiennent donc des procédures qu'on peut appeler par les API.

Elles font :

- soit partie intégrante du système d'exploitation Windows.(API Windows)

Ce sont ces Api (Kernel32.Dll=coeur du système, User32.Dll= fonctionnement des applications, gdi32..dll=interface graphique) que Windows utilise pour fonctionner.

Les fonctions sont donc écrites pour Windows; parfois on n'a pas d'équivalent VB, aussi, plutôt que de les réécrire quand on en a besoin, on appelle celles de Windows.

Elles permettent d'effectuer des tâches lorsqu'il s'avère difficile d'écrire des procédures équivalentes. Par exemple, Windows propose une fonction nommée FlashWindowEx qui vous permet de varier l'aspect de la barre de titre d'une application entre des tons clairs et foncés.

Il faut avouer que, le Framework fournissant des milliers de classes permettant de faire pratiquement tout ce que font les Api Windows, on a rarement besoin d'utiliser les Api Windows. Chaque fois que cela est possible, vous devez utiliser du code managé à partir du .NET Framework plutôt que les appels API Windows pour effectuer des tâches.

- soit partie de dll spécifiques fournies par des tiers pour permettre d'appeler des fonctions n'existant pas dans VB ni Windows.

Par exemple , il existe des Api MySql qui donnent accès aux divers fonctions permettant d'utiliser une base de données MySql. (Ces Api contiennent 'le moteur' de la base de données.)

Les Api Windows sont en code non managé. De plus elles n'utilisent souvent pas les mêmes types de données que VB . L'appel des Api se faisant avec des passages de paramètres, il y a des précautions à prendre!! Sinon cela plante!!!cela plante vraiment.

Il y a des API .Net en code managé.

X-J-1. Appel d'une fonction dans une API

Il faut déclarer la fonction (contenue dans la Dll) en haut du module:

 
Sélectionnez

Declare  Function  MyFonction Lib "MyLibary.dll" () as Integer

On indique ici qu'on veut utiliser la fonction MyFonction situé dans la dll MyLibrary.dll; cette fonction retourne un Integer.

Ensuite on peut utiliser MyFonction dans le code:

 
Sélectionnez

Dim a = MyFonction()

Exemple:

On va récupérer le nom de l'utilisateur en appelant la fonction GetUserNameA de la dll "advapi32.dll"

 
Sélectionnez

Declare Function getUserName Lib "advapi32.dll" Alias "GetUserNameA"(ByVal lpBuffer As String, ByRef nSize As Integer) 
_As Integer 

Sub Test

Dim buffer As String = New String(Char(" "), 25)

Dim retVal As Integer = getUserName(buffer, 25) 

Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)

End Sub

Le terme Alias permet de donner un nom a la fonction (getusername) dans le module alors que le vrai nom dans la dll est différent (GetUserNameA).

X-J-2. Les API Windows

L'avantage de l'utilisation d'API Windows dans votre code réside dans le gain de temps de développement, car elles contiennent des centaines de fonctions utiles déjà écrites et prêtes à être utilisées. L'inconvénient des API Windows est qu'elles peuvent être complexes à utiliser et implacables lorsqu'une opération se déroule mal.

Pour plus d'informations sur les API Windows, consultez la documentation du kit de développement Win32 SDK dans les API Windows du kit de développement Platform SDK. Pour plus d'informations sur les constantes utilisées par les API Windows, examinez les fichiers d'en-tête, tels que Windows.h, fournis avec le kit de développement Platform SDK. MSDN donne aussi une description des Api

Appels API avec Declare

La façon la plus courante d'appeler les API Windows consiste à utiliser l'instruction Declare.

Exemple (repris de chez Microsoft): appel de la fonction Windows 'MessageBox' qui est dans user32.dll et qui affiche une MessageBox.

  • Rechercher de la documentation de la fonction: MSDN et les Api donne la définition de la fonction MesssageBox:
     
    Sélectionnez
    
    int MessageBox(      
        HWND hWnd,
        LPCTSTR lpText,
        LPCTSTR lpCaption,
        UINT uType
    );

    Parameters

    hWnd
    [in] Handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window.
    lpText
    [in] Pointer to a null-terminated string that contains the message to be displayed.
    lpCaption
    [in] Pointer to a null-terminated string that contains the dialog box title. If this parameter is NULL, the default title Error is used.
    uType
    [in] Specifies the contents and behavior of the dialog box. This parameter can be a combination of flags from the following groups of flags.

    Constantes API Windows : Vous pouvez déterminer la valeur numérique des constantes utilisées dans les Api par l'examen des instructions #define dans le fichier WinUser.h. Les valeurs numériques sont généralement affichées au format hexadécimal. Par conséquent, vous pouvez les convertir au format décimal. Par exemple, si vous voulez combiner les constantes pour le style exclamation MB_ICONEXCLAMATION 0x00000030 et le style Oui/Non MB_YESNO 0x00000004, vous pouvez ajouter les nombres et obtenir un résultat de 0x00000034, ou 52 décimales.

    Return Value

    IDABORTAbort button was selected
    IDCANCELCancel button was selected.
    IDCONTINUEContinue button was selected.
    IDIGNOREIgnore button was selected.
    IDNONo button was selected
    IDOKOK button was selected.
    IDRETRYRetry button was selected.
    IDTRYAGAINTry Again button was selected
    IDYESYes button was selected
  • Il faut déclarer la procédure DLL :

    Ajoutez la fonction Declare suivante à la section de déclaration du formulaire de départ de votre projet ou à celle de la classe ou du module où vous voulez utiliser la DLL :

     
    Sélectionnez
    
    Declare Auto Function MBox Lib "user32.dll" _
    Alias "MessageBox" (ByVal hWnd As Integer, _
       ByVal txt As String, ByVal caption As String, _
       ByVal Typ As Integer) As Integer

    Declare comprend les éléments suivants.

    Le modificateur Auto indique de suivre les règles du Common Language Runtime.

    Le nom qui suit Function est celui que votre programme utilise pour accéder à la fonction importée.

    Le mot clé Alias indique le nom réel de cette fonction.

    Lib suivi du nom et de l'emplacement de la DLL qui contient la fonction que vous appelez. Vous n'avez pas besoin d'indiquer le chemin d'accès des fichiers situés dans les répertoires système Windows.

    Utilisez le mot clé Alias si le nom de la fonction que vous appelez n'est pas un nom de procédure Visual Basic valide ou est en conflit avec le nom d'autres éléments de votre application. Alias indique le nom réel de la fonction appelée.

    Les types de données que Windows utilise ne correspondent pas à ceux de Visual Studio. Visual Basic effectue la plupart des tâches à votre place en convertissant les arguments en types de données compatibles, processus appelé marshaling. Vous pouvez contrôler de manière explicite la façon dont les arguments sont marshalés en utilisant l'attribut MarshalAs défini dans l'espace de noms System.Runtime.InteropServices.

    Remarque Les versions antérieures de Visual Basic vous autorisaient à déclarer des paramètres As Any (tout type). Visual Basic .NET ne le permet pas.

Ajoutez des instructions Const à la section des déclarations de votre classe ou module pour rendre ces constantes disponibles pour l'application. Par exemple :

 
Sélectionnez

Const MB_ICONQUESTION = &H20L
Const MB_YESNO = &H4
Const IDYES = 6
Const IDNO = 7

Pour appeler la procédure DLL :

 
Sélectionnez


   Dim RetVal As Integer ' Valeur de retour.
   
   RetVal = MBox(0, "Test DLL", "Windows API MessageBox", _
                 MB_ICONQUESTION Or MB_YESNO)
   If RetVal = IDYES Then
      MsgBox("Vous avez cliqué sur OUI")
   Else
      MsgBox("Vous avez cliqué sur NON")
   End If

Visual Basic .NET convertit automatiquement les types de données des paramètres et valeurs de retour pour les appels API Windows, mais vous pouvez utiliser l'attribut MarshalAs pour indiquer de façon explicite les types de données non managés attendus par une API.

On peut aussi appeler une API Windows à l'aide de l'attribut DllImport mais c'est compliqué.

X-J-3. Autre exemple classique

Utilisation de la routine BitBlt qui déplace des octets.

La documentation donne les renseignements suivants:

 
Sélectionnez

     Declare Function BitBlt Lib "gdi32" ( _
        ByVal hDestDC As Long, _
        ByVal x As Long, _
        ByVal y As Long, _
        ByVal nWidth As Long, _
        ByVal nHeight As Long, _
        ByVal hSrcDC As Long, _
        ByVal xSrc As Long, _
        ByVal ySrc As Long, _
        ByVal dwRop As RasterOps _
        ) As Long

Parameter Information

· hdcDest
Identifies the destination device context.

· nXDest
Specifies the logical x-coordinate of the upper-left corner of the destination rectangle.

· nYDest
Specifies the logical y-coordinate of the upper-left corner of the destination rectangle.

· nWidth
Specifies the logical width of the source and destination rectangles.

· nHeight
Specifies the logical height of the source and the destination rectangles.

· hdcSrc
Identifies the source device context.

· nXSrc
Specifies the logical x-coordinate of the upper-left corner of the source rectangle.

· nYSrc
Specifies the logical y-coordinate of the upper-left corner of the source rectangle.

· dwRop
Specifies a raster-operation code.

Les Constantes dwRop:

 
Sélectionnez

        ' Copies the source bitmap to destination bitmap
         SRCCOPY = &HCC0020
        '
        ' Combines pixels of the destination with source bitmap using the Boolean AND operator.
         SRCAND = &H8800C6
        '                                
        ' Combines pixels of the destination with source bitmap using the Boolean XOR operator.
         SRCINVERT = &H660046   
        ' 
        ' Combines pixels of the destination with source bitmap using the Boolean OR operator.
         SRCPAINT = &HEE0086    
        '
        ' Inverts the destination bitmap and then combines the results with the source bitmap 
        ' using the Boolean AND operator.
         SRCERASE = &H4400328   
        '
        ' Turns all output white.
         WHITENESS = &HFF0062
        '
        ' Turn output black.
         BLACKNESS = &H42 

Return Values:

If the function succeeds, the return value is nonzero.

Ici on va utiliser cette routine pour copier l'image de l'écran dans un graphics.

 
Sélectionnez

Private Declare Function BitBlt Lib "gdi32.dll" Alias "BitBlt" (ByVal _
   hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As _
   Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal _
   hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
   ByVal dwRop As System.Int32) As Long
Dim memoryImage As Bitmap

Private Sub CaptureScreen()
   Dim mygraphics As Graphics = Me.CreateGraphics()
   Dim s As Size = Me.Size
   memoryImage = New Bitmap(s.Width, s.Height, mygraphics)
   Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
   Dim dc1 As IntPtr = mygraphics.GetHdc
   Dim dc2 As IntPtr = memoryGraphics.GetHdc
   
   BitBlt(dc2, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, dc1, 0, 0, 13369376)
   
   mygraphics.ReleaseHdc(dc1)
   memoryGraphics.ReleaseHdc(dc2)
End Sub

Le dernier paramètre a pour valeur= 13369376= SRCCOPY = &HCC0020 et correspond à 'Copies the source bitmap to destination bitmap'.

Annexe: Conversions de type

Au cours du regroupement, l'une des principales étapes consiste à convertir les types non gérés en types gérés, et inversement. Le service de regroupement du CLR sait comment effectuer nombre de ces conversions, mais vous devez quand même connaître les correspondances entre les différents types lors de la conversion de la signature non gérée vers la fonction gérée. Vous pouvez utiliser le tableau de conversion suivant pour mettre en correspondance les différents types.

Type de données Windows Type de données .NET
BOOL, BOOLEAN Boolean ou Int32
BSTR String
BYTE Byte
CHAR Char
DOUBLE Double
DWORD/LPDWORD Int32 or UInt32
FLOAT Single
HANDLE (et tous les autres types de pointeur,
tels que HFONT et HMENU)
IntPtr, UintPtr ou HandleRef
HRESULT Int32 or UInt32
INT Int32
LANGID Int16 ou UInt16
LCID Int32 or UInt32
LONG Int32
LPARAM IntPtr, UintPtr ou Object
LPCSTR String
LPCTSTR String
LPCWSTR String
LPSTR String ou StringBuilder*
LPTSTR String ou StringBuilder
LPWSTR String ou StringBuilder
LPVOID IntPtr, UintPtr ou Object
LRESULT IntPtr
SAFEARRAY type de tableau .NET
SHORT Int16
TCHAR Char
UCHAR SByte
UINT Int32 or UInt32
ULONG Int32 or UInt32
VARIANT Object
VARIANT_BOOL Boolean
WCHAR Char
WORD Int16 ou UInt16
WPARAM IntPtr, UintPtr ou Object

X-K. Faire du glisser déplacer (Drag & Drop)

Image non disponible

L'exécution d'opérations glisser-déplacer (Drag and Drop) peut être ajoutée dans un programme.

La méthode DoDragDrop du contrôle de départ autorise la collecte des données au début de l'opération.

Les évènements DragEnter, DragLeave et DragDrop. permettent de 'poser' les données dans le contrôle d'arrivée.

X-K-1. Exemple N° 1 (simple)

Exemple: Le contrôle de départ est un contrôle Button, les données à faire glisser sont la chaîne représentant la propriété Text du contrôle Button, et les effets autorisés sont la copie ou le déplacement. Le texte sera déposé dans un textBox:

Le contrôle de départ.

La fonctionnalité qui autorise la collecte des données au début de l'opération glisser dans la méthode DoDragDrop.

L'événement MouseDown du contrôle de départ est généralement utilisé pour démarrer l'opération glisser parce qu'il est le plus intuitif (la plupart des glisser-déplacer commencent par un appuie sur le bouton de la souris). Mais, souvenez-vous que n'importe quel événement peut servir à initialiser une procédure glisser-déplacer.

Remarque Les contrôles ListView et TreeView, , ont un événement ItemDrag qui est spécifique .

 
Sélectionnez

Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
_Handles Button1.MouseDown
   Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub

Le premier argument indique les données à déplacer.

Le second les effets permis = copier ou déplacer.

Le contrôle d'arrivée:

Toute zone d'un Windows Form ou d'un contrôle peut être configurée pour accepter les données déplacées en définissant la propriété AllowDrop et en gérant les événements DragEnter et DragDrop.

Dans notre exemple, c'est un contrôle TextBox1 qui est le contrôle d'arrivée.

 
Sélectionnez

TextBox1.AllowDrop  =True.     'autorise le contrôle TextBox à recevoir

Dans l'événement DragEnter du contrôle qui doit recevoir les données déplacées

Vérifier que le type des données est compatible avec le contrôle d'arrivée (ici, vérifier que c'est bien du texte).

Définir ensuite l'effet produit lorsque le déplacement a lieu en lui attribuant une valeur de l'énumération DragDropEffects.(ici il faut copier)

 
Sélectionnez

Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) 
_Handles TextBox1.DragEnter
   If (e.Data.GetDataPresent(DataFormats.Text)) Then
     e.Effect = DragDropEffects.Copy
   Else
     e.Effect = DragDropEffects.None
   End If
End Sub

Dans l'événement DragDrop du contrôle d'arrivée, utilisez la méthode GetData pour extraire les données que vous faites glisser.

 
Sélectionnez

Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) 
_Handles TextBox1.DragDrop
   TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString
End Sub

X-K-2. Exemple N° 2 (plus complexe)

Glisser déplacer une ligne d'une listBox 'ListBox1' vers une listBox 'ListBox2'.

Créer une ListBox1

Créer une listBox2 avec sa propriété AllowDrop=True 'listBox2 accepte le 'lâcher'

Dans l'en-tête du module ajouter:

 
Sélectionnez

Public IndexdInsertion As Integer    ' Variable contenant l'index ou sera inséré la ligne

'Eventuellement pour l'exemple charger les 2 ListBox avec des chiffres pour pouvoir tester.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase

Dim i As Integer

For i = 1 To 100

ListBox1.Items.Add(i.ToString)

Next

For i = 1 To 100

ListBox2.Items.Add(i.ToString)

Next

End Sub

'Dans le listBox de départ, l'évènement MouseDown  déclenche le glisser déplacer par DoDragDrop.

Private Sub ListBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
_Handles ListBox1.MouseDown

ListBox1.DoDragDrop(ListBox1.Items(ListBox1.IndexFromPoint(e.X, e.Y)), _ 
 DragDropEffects.Copy Or DragDropEffects.Move)

End Sub

'ListBox1.IndexFromPoint(e.X, e.Y) retourne l'Index de l'item ou se trouve la souris

'à partir des coordonnées e.x et e.y du pointeur)

'DoDragDrop a 2 arguments: l'élément à draguer et le mode

'DragOver qui survient quand la souris se balade sur le contrôle d'arrivé, vérifie

'si le Drop reçoit bien du texte et met dans IndexdInsertion le listItem qui est sous la souris.

'Noter que e.x et e.y sont les coordonnées écran , il faut les transformer en coordonnées client (du contrôle) par PointToClient afin d'obtenir l'index de l'item ou se trouve la souris (en utilisant IndexFromPoint.

 
Sélectionnez

Private Sub ListBox2_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) 
_Handles ListBox2.DragOver

If Not (e.Data.GetDataPresent(GetType(System.String))) Then

e.Effect = DragDropEffects.None

Else

IndexdInsertion = ListBox2.IndexFromPoint(ListBox2.PointToClient(New Point(e.X, e.Y)))

e.Effect = DragDropEffects.Copy

End If

End Sub

 

'Enfin dans DragDrop, on récupère le texte dans Item et on ajoute un item après l'item pointé.

Private Sub ListBox2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) 
_Handles ListBox2.DragDrop

Dim item As Object = CType(e.Data.GetData(GetType(System.String)), System.Object)

ListBox2.Items.Insert(IndexdInsertion + 1, item)

End Sub

X-L. Utiliser le 'Registre'

Le Registre est un fichier de stockage des informations relatives aux applications, aux utilisateurs et aux paramètres système. Les applications peuvent utiliser le Registre pour stocker les informations à conserver après leur fermeture et accéder à ces mêmes informations après leur rechargement. On peut stocker les paramètres de taille, couleur, les positions d'affichage ou la taille de la fenêtre. Vous pouvez contrôler ces paramètres pour chaque utilisateur en stockant les informations qui lui correspondent à un emplacement différent du Registre.

Le dictionnaire de l'informatique Microsoft (Microsoft Computer Dictionary, cinquième édition), définit le Registre :

Base de données hiérarchique centrale, utilisée dans Microsoft Windows 9x, Windows CE, Windows NT et Windows 2000, permettant de stocker les informations nécessaires pour configurer le système pour un ou plusieurs utilisateurs, programmes et périphériques matériels, les profils des utilisateurs, les applications installées sur l'ordinateur et les types de documents qu'elles peuvent créer, les paramètres de la feuille de propriétés pour les dossiers et les icônes des applications, le matériel du système et les ports utilisés.

Le Registre remplace la plupart des fichiers texte .ini utilisés dans les fichiers de configuration Windows 3.x et MS-DOS, tels que Autoexec.bat et Config.sys. Bien que le Registre soit commun à Windows 9x Xp Vista , il y a certaines différences.

voir Informations Microsoft sur le registre

On peut modifier directement le registre 'à la main' en lançant le logiciel Regedit mais un programme VB peut aller écrire ou lire dans le registre.

Le registre est composé de Clé, sous-clé et valeur. (une valeur a 'un nom de valeur' et une valeur); cela forme une arborescence.

Une clé donnée peut avoir des sous-clés. Chaque clé peut également avoir plusieurs valeurs qui servent à stocker les informations relatives à l'application qui vous intéresse. Chaque valeur contient des informations spécifiques qui peuvent être extraites ou mises à jour (noms de valeur et valeurs).

Vous remarquerez que les informations stockées dans le Registre sont accessibles aux autres applications et utilisateurs, aussi il est fortement déconseillé d'y mettre des codes d'accès.

Microsoft nous donne les Clés de base, (elles sont en lecture seule) Les clés de base sont le premier niveau de l'arborescence des clés:

CurrentUser
Stocke les informations relatives aux préférences de l'utilisateur.
LocalMachine
Stocke les informations de configuration pour l'ordinateur local.
ClassesRoot
Stocke les informations relatives aux types (et classes) et à leurs propriétés.
Users
Stocke les informations relatives à la configuration utilisateur par défaut. PerformanceData
Stocke les informations relatives aux performances pour les composants logiciels.
CurrentConfig
Stocke les informations concernant le matériel qui ne sont pas spécifiques à l'utilisateur.
DynData

Stocke les données dynamiques

Pour voir les clés de base et l'arborescence des clés exécutons 'Regedit':

Menu 'Démarrer'-> menu 'Exécuter' taper 'Regedit'

Image non disponible

On voit ici les 2 premières clés de base HKEY_CLASSES_ROOT et HKEY_CURRENT_USER, on a développé les sous-clés de HKEY_CURRENT_USER qui sont 'AppEvents', 'AutoSetup'..., "Noms". La sous-clé 'Noms' à un nom de valeur nommé 'Nom' qui contient la valeur 'Philippe'.

Pour des raisons de sécurité, il est préférable d'écrire des données dans le dossier utilisateur (Microsoft.Win32.Registry.CurrentUser) plutôt que sur l'ordinateur local (Microsoft.Win32.Registry.LocalMachine).

Attention, c'est très dangereux de modifier des clés de registre: une erreur sur une clé importante et une application ou Windows plante!!

L'auteur de ce cours décline toute responsabilité.... .... .... ....bla bla bla

Comment ça marche?

L'objet RegistryKey représente un nœud de niveau clé dans le Registre

On instance un noeud:

 
Sélectionnez

Dim key As Microsoft.Win32.RegistryKey

La classe Registry fourni les Clés de base (CurrentUser, LocalMachine, ClassesRoot, Users, CurrentConfig...)

On met par exemple dans key le noeud CurrentUser:

 
Sélectionnez

key = Microsoft.Win32.Registry.CurrentUser
Ensuite on peut:
  • Créer une sous-clé avec .CreateSubKey
  • Ouvrir une sous-clé avec .OpenSubKey
  • Ecrire ou lire une valeur avec .GetValue ou .SetValue
  • Effacer une valeur avec .DeleteValue

Création d'une Key, écriture de valeur.

Cet exemple ajoute le nom de valeur "Nom" et la valeur "Philippe" au Registre de l'utilisateur en cours.

Cela sous la clé "Noms" dans HKEY_CURRENT_USER du Registre.

Exemple

 
Sélectionnez

Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Noms")
key.SetValue("Nom", "Philippe")

Pour voir dans le registre le résultat:

Menu 'Démarrer'-> menu 'Exécuter' taper 'Regedit'

Image non disponible

on obtient dans le registre:

Lecture de valeur.

 
Sélectionnez

Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Noms")
Dim name As String = CType(key.GetValue("Nom"), String)

La méthode GetValue retourne un Object. Si votre code comporte Option Strict On, vous devez effectuer un cast de la valeur de retour vers le type de données que vous avez placé précédemment dans la valeur.

GetValue retourne Nothing si la valeur n'existe pas.

Supprimer la Key

 
Sélectionnez

Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Noms", True)
key.DeleteValue("Nom")

Lorsque vous changez le paramètre True par False, la clé est accessible en lecture seule et vous ne pouvez pas la supprimer à l'aide de la variable key.

Bien sur on peut tout faire: ajouter, supprimer une Clé, une valeur, voir la liste des sous-clé, la liste des valeurs...

En VB 2005 la Classe My.Computer.Registry permet un accès à la base de registre:

 
Sélectionnez

Dim key As RegistryKey = My.Computer.Registry.ClasseRoot pointe sur la classe de base ClassRoot.

Pour un noeud on a les propriétés: Name, SubKeyCount;si ce dernier est supérieur à 0 GetSubKeyNames retourne un tableau de chaînes contenant le nom des sous-clés. On peut ensuite ouvrir le sous nœud grâce à OpenSubKey.

Si ValueCount est supérieur à 0, le noeud contient des valeurs GetValueNames retourne un tableau de chaîne contenant le nom des valeurs. On peut ensuite lire la valeur avec GetValue.

N'oublier pas de fermer tous les objets RegistryKey (ouverts ou crées) par Close.

Exemples pratiques:

Exemple 1:

Word est-il installé? il faut voir si le registre contient HKEY_CLASSES_ROOT\Word.Application

 
Sélectionnez

Dim key As RegistryKey = My.Computer.Registry.ClasseRoot.OpenSubKey ("Word.Application")
If key Is Nothing: Word n'est pas installé.

Exemple 2:

Lire rapidement une valeur? (sans instanciation)

 
Sélectionnez

Dim valeur As String = My.Computer.Registry.GetValue ("HKEY_CLASSES_ROOT\Noms","nom","")

3 paramètres: nom de la clé, nom de la valeur (mettre NOTHING pour la valeur par défaut), valeur à retourner si pas de valeur.

Exemple 3:

Modifier rapidement une valeur?

Il existe SetValue.

Avant de l'utiliser il faut ouvrir un registryKey en écriture:

 
Sélectionnez

Dim rc As RegistryKey = My.Computer.ClasseRoot.OpenSubKey ("Noms",True) 'True permet l'écriture

rc.SetValue("Nom valeur", valeur)

Il existe enfin DeleteValue, DeleteSubKey et DeleteSubTreeKey..

Exemple 4:

Ajouter une ligne dans le menu contextuel de Windows: clique droit sur un raccourci ou sur un fichier dans l'explorer. Cela ouvre un menu contextuel avec une ligne 'MonProgram'. Si on clique dessus, on lance l'exécutable 'MonProg.exe' et on charge le fichier pointé.

 
Sélectionnez

Dim regKey As RegistryKey

regKey = My.Computer.Registry.ClassesRoot.CreateSubKey("*\Shell\MonProgram\command")

My.Computer.Registry.SetValue("HKEY_CURRENT_USER\*\Shell\MonProgram\command", "", 
	_My.Application.Info.DirectoryPath & "\" & "MonProg.exe -o" & Chr(34) & "%L" & Chr(34))

Si MonProg.exe est en VB, il faut récupérer au démarrage le nom du fichier (voir 4-1)


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.