Lo snippet di oggi permette di gestire semplicemente e con sicurezza un piccolo file di configurazione. Quando scriviamo un’applicazione, spesso ci serve memorizzare impostazioni o settaggi generali, locali o propri di un utente o di una sezione del programma. Ci sono vari modi per conservare le impostazioni del programma, in modo che vengano rese permanenti anche dopo la chiusura dell’applicazione: uno di questi utilizza un piccolo file di testo, di estensione INI, conosciuto e gestito fin dai tempi delle primissime versioni di Windows. Un file di estensione INI è un file di testo ASCII puro e contiene le informazioni di inizializzazione del programma; segue per convenzione alcune semplici regole: è suddiviso in sezioni, ogni sezione contiene una o più coppie chiave=valore.
Esempio:
[DATA] jpg=Z:\WORKS\JPG bmp=Z:\COMMON\DIR\BMP documents=Z:\WORKS\STORAGE\DATA\BACKUP [USERS] user1=Pippo user2=Topolino
Leggendo questo file di impostazioni, possiamo conservare le informazioni relative alle directory utilizzate dal programma per recuperare o salvare file di dati (immagini e documenti).
Nella routine che presentiamo sono semplificate al massimo le operazioni di scrittura e lettura delle informazioni nel file INI. Ci serviamo di due procedure API classiche, GetPrivateProfileString e WritePrivateProfileString. Entrambe le funzioni sono dedicate alla scrittura e alla lettura di un file INI.
Mediante Google sono disponibili in rete tonnellate di soluzioni sull’argomento. Quella che segue è un adattamento di un’idea semplice ma funzionale di Scott Lyerly che ringraziamo.
Option Explicit
'managing INI files
'from an idea of Scott Lyerly
'read INI
Public 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 Long, _
ByVal lpFileName As String) As Long
'write INI
Public Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Long
' +--------------------------------------------------+
' | INI manager |
' | ini_manager ("r|w", "section", "key", <"value">) |
' +--------------------------------------------------+
Function ini_manager(action As String, section As String, key As String, _
Optional value As String) As String
' in questa costante memorizziamo il percorso e il nome del file ini da leggere/scrivere
Const INI_FILE As String = "path\inifilename.ini"
Dim sRetBuf As String
Dim iLenBuf As Integer
Dim sReturnValue As String
Dim lRetVal As Long
On Error GoTo gest_err
Select Case LCase(Left(action, 1))
Case "r" 'READ INI
' alloca lo spazio necessario
sRetBuf = Space(256)
iLenBuf = Len(sRetBuf)
' recupera la sezione INI e la chiave cercata
sReturnValue = GetPrivateProfileString(section, key, "", sRetBuf, _
iLenBuf, INI_FILE)
' pulisce il valore di ritorno
sReturnValue = Trim(Left(sRetBuf, sReturnValue))
' restituisce il valore cercato oppure "Error"
If Len(sReturnValue) > 0 Then
ini_manager = sReturnValue
Else
ini_manager = "Error"
End If
Case "w" 'WRITE INI
' ritorna errore se non esiste la sezione che si tenta di scrivere
If Len(value) = 0 Then
ini_manager = "Error"
Else
' scrive il valore specificato nella chiave della sezione indicata
If ini_manager("r", section, key) <> "Error" Then
lRetVal = WritePrivateProfileString(section, key, value, _
INI_FILE)
Else
lRetVal = 0
End If
' controlla se la procedura restituisce un valore di errore
If lRetVal = 0 Then ini_manager = "Error" Else ini_manager = "Ok"
End If
Case Else
' solo w e r sono ammesse. Altre codifiche restituiscono errore
ini_manager = "Error"
End Select
Exit Function
gest_err:
MsgBox Err.Number & ": " & Err.Description, vbInformation, "INI Manager"
End Function
In questo adattamento del codice il percorso e il nome del file INI è codificato all’interno della routine. Quindi bisogna prestare attenzione, se si utilizza la procedura presentata, a modificare la costante INI_FILE in modo opportuno, perchè punti a un percorso/file esistente. Consiglio, in produzione, di avere un solo file di configurazione. Il loro numero è arbitrario e dipende dagli scopi e dalla complessità del programma ma occorre stare attenti a non perdersi nei file e nelle impostazioni. Con qualche piccola modifica il codice si può generalizzare perchè accetti un qualsiasi nome di file INI.
L’utilizzo è semplice: la sintassi della Function è ini_manager ("r|w", "section", "key", <"value">)
"r|w" sta per "read" (operazione di lettura) e "write" (operazione di scrittura)
"section" è la sezione del file da leggere o scrivere
"key" è la chiave (il valore a sinistra del segno di uguale)
"value" è il valore assegnato a quella chiave
Nei file INI possono essere inseriti dei commenti (preceduti da punto e virgola) ma le routine API Get- e WriteProfileString cancellano i commenti e lasciano solo le sezioni con le loro coppie chiave/valore.
Un utilizzo (basato sull’esempio fatto in questo articolo):
utente1 = ini_manager("r", "USERS", "user1") 'legge il valore di "user1" dalla sezione USERS : Pippo
ini_manager "w", USERS", "user1", "Paperino" 'scrive un nuovo valore di "user2" della sezione USERS

› Rispolveriamo i file di configurazione (gestione INI files)
-
-
-
Login Registrati