Cours VB.NETDate de mise à jour : 05/12/2010
X-I. Faire une aide pour l'utilisateur
X-I-1. Généralisées sur les 4 sortes d'aide
X-I-2. Les fichiers d'aide
X-I-3. Utilisation des fichiers d'aide
X-I-3-a. Appel direct
X-I-3-b. Appel par F1
X-I-3-c. Utilisation du bouton d'aide
X-I-3-d. Utilisation des info bulles: ToolTip
X-I-3-e. Utilisation d'ErrorProvider
X-J. Appeler une API
X-J-1. Appel d'une fonction dans une API
X-J-2. Les API Windows
X-J-3. Autre exemple classique
X-K. Faire du glisser déplacer (Drag & Drop)
X-K-1. Exemple N° 1 (simple)
X-K-2. Exemple N° 2 (plus complexe)
X-L. Utiliser le 'Registre'
X-I. Faire une aide pour l'utilisateur
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
- La Class Help permet d'ouvrir un fichier d'aide.
- 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.
- Le composant ToolTip offre lui:
- une aide propre à chaque contrôle des Windows Forms.
- 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:
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).
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.
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.
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:
ToolTip1. SetToolTip (Button1, " Save changes " )
|
3- Par code créons de toute pièce un ToolTip.
Dim toolTip1 As New ToolTip ()
toolTip1. AutoPopDelay = 6000
toolTip1. InitialDelay = 2000
toolTip1. ReshowDelay = 500
toolTip1. ShowAlways = True
toolTip1. SetToolTip (Me. button1 , " My button1 " )
toolTip1. SetToolTip (Me. checkBox1 , " My checkBox1 " )
toolTip1. IsBalloon = True
|
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.
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)
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:
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:
Exemple:
On va récupérer le nom de l'utilisateur en appelant la fonction GetUserNameA de la dll "advapi32.dll"
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:
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
IDABORT |
Abort button was selected |
IDCANCEL |
Cancel button was selected. |
IDCONTINUE |
Continue button was selected. |
IDIGNORE |
Ignore button was selected. |
IDNO |
No button was selected |
IDOK |
OK button was selected. |
IDRETRY |
Retry button was selected. |
IDTRYAGAIN |
Try Again button was selected |
IDYES |
Yes 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 :
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 :
Const MB_ICONQUESTION = & H20L
Const MB_YESNO = & H4
Const IDYES = 6
Const IDNO = 7
|
Pour appeler la procédure DLL :
Dim RetVal As Integer
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:
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:
SRCCOPY = & HCC0020
SRCAND = & H8800C6
SRCINVERT = & H660046
SRCPAINT = & HEE0086
SRCERASE = & H4400328
WHITENESS = & HFF0062
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.
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)
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 .
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.
TextBox1. AllowDrop = True .
|
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)
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.
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:
Public IndexdInsertion As Integer
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
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.
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
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'
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:
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:
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
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'
on obtient dans le registre:
Lecture de valeur.
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
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:
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
Dim key As RegistryKey = My. Computer . Registry . ClasseRoot . OpenSubKey (" Word.Application " )
If key Is Nothing : Word n
|
Exemple 2:
Lire rapidement une valeur? (sans instanciation)
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:
Dim rc As RegistryKey = My. Computer . ClasseRoot . OpenSubKey (" Noms " ,True )
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é.
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)
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.
|