Site:  Cours VB.net  
4.18 Paramètres des applications.

En plus des données, une application a besoin d'utiliser des paramètres:

Ceux de l'application:

Base de données à ouvrir.

Chemin des bases de données.

Chaînes de connexion

Ceux de chaque utilisateur:

Etat, position et dimension des formulaires.

Couleurs.

Paramètres d'imprimante: dimension du papier, police de caractères.

Préférences de l'utilisateur.

..

Toutes ces informations doivent bien être stockées quelque part!!!

On peut les stocker dans:

De simples fichiers.

Des fichiers .INI

Le registre.

Des fichiers de configuration .Config (VB 2003)

Des fichiers de configuration .Config (VB 2005)

En VB2005 on peut même lier une propriété à un paramètre de configuration.

 

Les Fichiers:

Il y a longtemps on utilisait un fichier séquentiel.

On ouvrait le fichier avec FileOpen(), on écrivait les paramètres avec Writeline.

Lors d'une utilisation ultérieure du logiciel on lisait les paramètres avec LineInput.

(voir chapitre 4-6)

On utilisait aussi parfois  une table dans une base de données pour stocker les paramètres.

Avec Vb.Net certains stockent les paramètres dans un fichier XML (directement ou à l'aide de la serialization)

Mais VB offre d'autres méthodes dédiées à cet usage.

 

Fichiers .INI.

Il y a quelques temps (jusqu'à Windows 95 et même après), on utilisait les fichiers .INI.

Chaque application avait son fichier INI, Windows avait aussi ses propres fichiers INI: System.Ini Boot.Ini..

 

Exemple d'un fichier MonApp.INI , il est situé dans le répertoire de l'application ou dans le répertoire Windows.

Si on le regarde avec NotePad:

 

[Configuration Matérielle]     
RépertoireDonnées=C:\M\Donnees 
RépertoireSauvegardes=C:\M\Sauve
RépertoireLocal=C:\M\Local     
[Configuration Logiciel]       
SoftAgenda=Calendar.Exe        
TypeAgenda=0                   
PathAgenda=                    

 

Dans notre exemple, le fichier donne les répertoires de données et le nom de l'agenda à utiliser.

 

 

Il comporte de grande rubrique,[Configuration Matérielle] entourées de [].

 

Dans chaque rubrique, il y a des clés, RépertoireDonnées par exemple, suivis d'un = puis de la valeur correspondant à la clé C:\M\Donnees ici.

 

 

Comment lire ou écrire dans un fichier Ini 'Privé' (propre à l'application).

 

Il faut pour cela utiliser des fonctions fournis par les API Windows (elles se trouvent dans Kernel32.dll).

GetPrivateProfileString  permet de lire une string correspondant à une clé.

GetPrivateProfileInt  permet de lire un entier correspondant à une clé.

PutPrivateProfileString  permet d'ecrire une string correspondant à une clé.

PutPrivateProfileInt  permet d'écrire un entier correspondant à une clé

 

 

A- Avant, il faut les déclarer.

 

'Fonction lisant un Integer

Declare Function GetPrivateProfileInt Lib "Kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long

 

'Fonction lisant une string

Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Short, ByVal lpFileName As String) As Integer

 

'Fonction écrivant une string

Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lplFileName As String) As Long

 

'Il existe aussi une fonction écrivant un Entier

 

B- Pour utiliser plus simplement ces appels à la dll , écrivons des fonctions qui gèrent les appels.

 

Function Get_Private_Profile_Int(ByVal cAppName As String, ByVal cKeyName As String, ByVal nKeyDefault As Integer, ByVal cProfName As String) As Long

'

' LIRE UN ENTIER

' Parametres:

' cAppName Correspond à [Rubrique]

' cKeyName Nom de l'entrée, de la clé

' nKeyDefault Valeur par défaut de la chaîne cherchée

' cProfName Nom du Fichier "INI" Privé

' Sortie:

' La fonction retourne une valeur numérique entière

 Get_Private_Profile_Int = GetPrivateProfileInt(cAppName, cKeyName, nKeyDefault, cProfName)

End Function

 

Function Get_Private_Profile_String(ByVal cAppName As String, ByVal cKeyName As String, ByVal cKeyDefault As String, ByRef cKeyValue As String, ByVal cProfName As String) As Integer

'

' LIRE UNE STRING

' Parametres:

' cAppName Correspond à [Rubrique]

' cKeyName Nom de l'entrée, de la clé

' cKeyDefault Valeur par défaut de la chaîne cherchée

' cKeyValue Valeur lue en face de l'Entrée ou cKeyDefault si l'Entrée est vide

' cProfName Nom du Fichier "INI" Privé

'

' Sortie:

' Valeur lue dans cKeyValue

' La fonction retourne le nombre de caractères dans cKeyValue

Dim iReaded As Integer

Const sLongueur As Short = 255

If cKeyName = "" Then

cKeyValue = Space$(1025)

iReaded = GetPrivateProfileString(cAppName, "", "", cKeyValue, 1024, cProfName)

Else

cKeyValue = Space$(255)

iReaded = GetPrivateProfileString(cAppName, cKeyName, cKeyDefault, cKeyValue, sLongueur, cProfName)

End If

cKeyValue = Trim$(cKeyValue)

'Enlever le dernier caractère?

'If Len(cKeyValue) <> 0 Then

' cKeyValue = Mid$(cKeyValue, 1, Len(cKeyValue) - 1)

'End If

Get_Private_Profile_String = iReaded

End Function

 

 

Function Put_Private_Profile_String(ByVal cAppName As String, ByVal cKeyName As String, ByVal cKeyValue As String, ByVal cProfName As String) As Boolean

' ECRIRE UNE STRING

' Parametres:

' cAppName Correspond à [Rubrique]

' cKeyName Nom de l'entrée de la clé

' cKeyValue Valeur lue en face de l'Entrée ou cKeyDefault si l'Entrée est vide

' cProfName Nom du Fichier "INI" Privé

' Sortie:

' La fonction retourne True si cela a marché

Dim Status As Long

Status = WritePrivateProfileString(cAppName, cKeyName, cKeyValue, cProfName)

If (Status <> 0) Then

Put_Private_Profile_String = True

Else

Put_Private_Profile_String = False

End If

End Function

End Class

 

 

C- Exemple de lecture et d'écriture:

 

- Lecture du répertoire de données dans MonApp.Ini:

 

Dim cRubrique As String = "Configuration Matérielle"    'Nom de la rubrique

Dim cKey As String = "RépertoireDonnées"                'Nom de la clé

Dim cRepertoire As String = Space(255)                  'Variable récupérant la string 

Dim cIniFile As String = "c:\MonApp\MonApp.ini"         'Nom du fichier Ini

Dim istat As Integer

 

'Appel de la fonction

istat = Get_Private_Profile_String(cRubrique, cKey, "", cRepertoire, cIniFile)

'Affichage du répertoire de données dans une textbox par exemple

TextBox1.Text = Trim(cRepertoire)

 

' Dans notre exemple cela affiche C:\M\Donnees

 

- Ecriture :Dans MonApp.Ini, dans la rubrique "Configuration Matérielle", derrière la clé "cRepOld", écrire "No":

 

Dim cRubrique As String = "Configuration Matérielle"    'Nom de la rubrique 

Dim cIniFile As String = "c:\MonApp\MonApp.ini"         'Nom du fichier Ini

Dim bOk As Boolean

 

bOk = Put_Private_Profile_String(cRubrique, "cRepOld", "No", cIniFile)

 

'on note que la clé "cRepOld" qui n'existait pas a été créée.

Il a bien été ajouté dans le fichier .Ini : cRepOld=No

 

Registre.

A partir de Windows95 et WIndows NT

Attention : l'application doit posséder des droits d'accès au registre suffisants.

Ecriture dans le registre:
Exemple: ajouter la clé "Nom" et la valeur "Philippe" au Registre de l'utilisateur en cours.
Cela sous la clé "Noms" dans HKEY_CURRENT_USER du Registre.

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

voir le chapitre 4-16 pour les détails.

 

Fichier de configuration. App.Config File de VB2003 (Framework 1)

On enregistre dans un fichier au format XML.

Créer le fichier de configuration:

Projet->Ajouter un nouvel élément-> cliquer sur 'Fichier de configuration':'App.config' le fichier de configuration en XML est ajouté au projet;(cela ne parrait pas possible en VB 2005 Express)

On le voit dans une fenêtre:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>                       

</configuration>                      

Il faut ajouter la partie 'AppSettings' qui contient la configuration, cela donne:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>                       

<appSettings>                         

<add key="TaillePage" value="5" />    

</appSettings>                        

</configuration>                      

On remarque que l'on a ajouté les balises <appSettings> et </appSettings>.

Entre ces balises, on peut ajouter des lignes contenant une clé et sa valeur:

<add key="TaillePage" value="5" />

On peut modifier les couples 'clé-valeur' dans l'ide ou bien en ouvrant le fichier App.config avec NotePad.

Pour lire un élément de la configuration:
Dim TaillePage As String = Configuration.ConfigurationSettings.AppSettings("TaillePage")
 (on récupère une string :"5" dans l'exemple)
Pour lire tous les éléments:

Dim mAppSet As Specialized.NameValueCollection

mAppSet = Configuration.ConfigurationSettings.AppSettings

 

'Affiche dans MaList les clés:

If Not mAppSet Is Nothing Then

Me.maliste.Items.Clear()

Dim keys() As String

keys = mAppSet.AllKeys

Dim key As String

For Each key In keys

Me.maliste.Items.Add(key & ": " & mAppSet.Item(key))

Next

End If

 

On met utilise une collection mAppSet de type 'NameValueCollection', on y met AppSettings

On peut voir les clé grâce à mAppSer.GetKey et les valeurs grâce à  mAppSet.Item()

Le problème est que pour modifier une valeur par code, il faut charger le fichier XML, modifier puis enregistrer le fichier XML. C'est complexe!! Il existe des classes qui font cela automatiquement.

 

Configuration par paramètres Settings de VB2005 (Framework 2)

Dans le Framework 2 Configuration.ConfigurationSettings n'existe plus!! 

il faut utiliser Configuration.ConfigurationManager mais il y a beaucoup plus simple avec la classe My .

Les valeurs des paramètres sont enregistrées automatiquement. (Si dans les propriétés du projet, dans l'infrastructure de l'application, "Enregistrer My.setting lors de l'arrêt" est coché. )

Les paramètres de configuration concernent l'application ou l'utilisateur.

Les paramètres d'application sont en lecture seule. Dans la mesure où ces paramètres sont des informations du programme, vous n'avez en principe pas besoin de les modifier. Ce sont par exemple le chemin d'une base de données ou un URL.

En revanche, les paramètres d'utilisateur peuvent être lus et modifiés. Ce sont les positions de formulaires, couleur..

On peut créer les paramètres dans le 'Projet designer':

En vb 2005, pas besoin d'ajouter le fichier comme en vb 2003, le fichier de configuration  est crée et ajouté au projet dès que l'on crée un paramètre.

Les paramètres de configuration sont donc directement accessible dans les propriétés du projet (dans l'explorateur de solution double cliquer sur  My Projet ou passer par le menu Projet-> Propriétés de..:

Exemple:

Onglet 'Paramètres' , créons un paramètre nommé 'Para1' et contenant '1' (c'est une string)

Un paramètre à un nom, un type, une portée (Application ou Utilisateur), une valeur.

Pour créer, se mettre dans la colonne 'Nom' dans la ligne '*' et taper le nom du paramètre, choisir le type en déroulant la liste avec le bouton de la colonne type, choisir la portée puis éventuellement une valeur.

Donc pas besoin de passer par NotePad et de manipuler de l'XML.

Les fichiers de configuration sont automatiquement crées lors du démarrage de l'application (avec les valeurs par défaut indiquées dans l'onglet 'paramètres').

Pour utiliser un paramètre dans le programme:

 on fera:

MonParamètre= My.Parametre.Para1

Les Paramètres sont en  Read-Only si la portée est 'Application', et en  Read-Write  (donc modifiable par code) si la portée est 'Utilisateur'.

Ces 'variables paramètres utilisateur' ont des valeurs qui seront conservées et enregistrées automatiquement dans l' 'environnement' d'un utilisateur (en WindowsForms). Si on en modifie la valeur, on retrouve la valeur modifiée lors d'une utilisation ultérieure ce qui permet de conserver les habitudes des utilisateurs.

Modifions un paramètre utilisateur:

My.Parametre.Para1= "666"

La nouvelle valeur sera automatiquement enregistrée dans le fichier de config.

Bien sur le paramètre  'NomConnexuinS' qui est un paramètre application n'est pas modifiable.

 

En VB2005 vous pouvez créer des paramètres de type Color, Font, Point, Size:

My.Settings.MyFont= New Font (Me.Font, FontStyle.Italics)

 

Profil utilisateur:

On peut créer des 'Profils' avec plusieurs noms de profil qui auront chacun des paramètres ayant leur propre valeur pour chaque utilisateur Windows.

On peut par exemple créer un profil "Philippe" et, dans ce profil, donner à Para1 la valeur '333'. Créer un second profil "Odile" et, dans ce profil, donner à Para1 la valeur '222'. Dans ce cas si l'utilisateur Philippe ouvre une session Windows sous le nom l'utilisateur 'Philippe' et qu'il lance l'application, c'est la valeur '333' qui se trouvera dans My.Parametre.Para1

 

Evènement survenant lors du changement de valeur des paramètres.

En haut à droite, il y a un bouton ou un menu déroulant qui donne accès à 'Afficher le code'.

Cela donne accès à une Classe partielle Setting  qui donne accès aux routines PropertySettings, ChangingSettings, SavingSettings; ainsi quand un paramètre change par exemple, on peut mettre ici le code nécessaire à la mise à jour.

 

Dans quels fichiers et ou est enregistré le 'setting'? :

Dans des fichiers XML.

En mode design:

Les paramètres d'application et utilisateurs (ceux de départ qui ont été écrits à la main dans les propriétés) sont stockés dans la section MonApplication.My.Settings de:

app.Config qui est dans le source, dans "c:\Documents and setting\NomUtilisateur\Mes Document\Visual Studio 2005\MonApplication\MonApplication"

MonApplication.exe.config dans les répertoires bin et release quand on  génère l'application. (c'est ce fichier qui sera déployé)

En cours d'exécution:

Les paramètres d'application sont dans

MonApplication.exe.config dans le répertoire de l'exécutable. (c'est ce fichier qui sera déployé), on rappelle que ces paramètres ne sont pas modifiables.

Les paramètres utilisateurs sont dans

user.config dans le répertoire C:\Documents and Settings\NomUtilisateur\Local Settings\Application Data\NomSociete\MonApplication.exe_Url_43f52d0fihtu0kzyyxxngiyacs5ljtnb\1.0.0.0 . On remarque que VB crée un répertoire dans C:\Documents and Settings\NomUtilisateur\Local Settings\Application Data . Vb utilise ensuite le nom de la société qui distribue le logiciel (le nom qui est dans l'assembly) puis le nom de l'application et enfin la version du programme. Comme le framework s'occupe de tout, à priori, on n'a pas à s'occuper des chemin.

Contenu du fichier WindowsApplication1.exe.config :

Situé dans "c:\Documents and setting\NomUtilisateur\Mes Document\Visual Studio 2005\WindowsApplication1\WindowsApplication1" (et dans bin\release après génération)

L'application se nomme "WindowsApplication1" , on regarde ou est enregistré 'Para1':

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<userSettings>

<WindowsApplication1.My.MySettings>

<setting name="parmetre1" serializeAs="String">

<value>12</value>

</setting>

</Bonjour.My.MySettings>

</userSettings>

</configuration>

On peut le voir plus rapidement  en cliquant dans l'explorateur de solution  sur App.Config

 

 

Liaison propriétés <=> Settings de VB2005 (PropertyBinding)

En VB2005, on peut 'lier'  la propriété d'un contrôle avec un paramètre. C'est à dire enregistrer automatiquement les valeurs d'une propriété dans les paramètres de configuration.

Prenons un exemple:

J'ai crée une Form1, je veux que l'utilisateur, lorsqu'il lance l'application, retrouve Form1 à la position où il l'avait laissée.

Il faut donc enregistrer la valeur de la propriété Location de Form1 dans le Setting, la configuration, pour cela on va faire du PropertyBinding: On va lier cette propriété à un paramètre du setting.

Dans la fenêtre de propriété de Form1, aller en haut de la liste, cliquer sur le '+'de (ApplicationSettings), puis au niveau de la ligne (PropertyBinding), cliquer sur le bouton à droite. Cela ouvre la fenêtre 'Paramètres d'application de Form1'

Cliquer sur la ligne "location", puis sur le bouton à droite.

Dans la liste qui s'ouvre, cliquer sur 'Nouveau": La fenêtre 'Nouveau paramètre d'application' s'ouvre:

Taper un nom pour le nouveau paramètre (mylocation par exemple), une valeur par défaut si necessaire.

Puis Ok, Ok

C'est fait: le paramètre 'mylocation' est lié à la propriété Location de Form1.

Regardons dans les paramètres de l'application (menu Projet=>Propriétés de..)

 

 

On voit bien le nouveau paramètre mylocation de type System.Drawing.Point. Il est lié à Form1.Location (Dans la fenêtre de propriété de form1, sur la ligne location, il y a une toute petite icône qui le signale).

La valeur de Form1.Location sera enregistrée automatiquement et restituée lorsque l'on lancera ultérieurement le programme.

En fait VB génère du code prenant en charge ce BindingProperty: dans l'explorateur de solution cliquer sur MyProjet->Setting.Setting->Setting.Designer.vb on voit le code généré.