Gestione file .ini con Visual Basic

Home | Visual Basic

A volte capita di dover fare dei programmi che necessitano di leggere molte informazioni in input. I metodi per procedere in questo caso sono due:

  • Leggere/scrivere i dati nel registry
  • Leggere/scrivere i dati in un file di configurazione
  • La prima ipotesi verr approfondita in un'altra pagina, la seconda molto pi vasta. Possiamo usare qualsiasi tipo di file, ma uno standard gestito dalle API di Windows quello del file .ini, suddiviso in sezioni.

    Cos' un file .ini

    Un file .ini non altro che un file di testo conforme ad una determinta sintassi. E' suddiviso in blocchi evidenziati dalle parentesi quadre e in questi blocchi contiene per ogni riga il nome della variabile ed il suo valore, quello chesegue ne un esmpio classico.

    [blocco1]
    variabile1 = valore1
    variabile2 = valore2
    
    [blocco2]
    variabile3 = valore3
    			
    			

    Utilizzo delle API di Windows

    La classe il cui codice elencato di seguito sfrutta le funzioni del Kernel di Windows WritePrivateProfileString e GetPrivateProfileString.

    L'unica limitazione di questa classe la lunghezza della stringa che pu essere inserita in un parametro. Attualmente la lunghezza massima 1000 (penso che possa bastare), potete modificarla direttamente nel codice.

    Cosa inserire nel progetto Visual Basic

    Nel progetto VB basta inserire una nuova classe (.cls) e fare il copia ed incolla del sorgente che segue per poi chiamarlo cIni.cls. E' evidente che questo il nome che utilizzo io personalmente ma nulla vienta di scegliere un nome pi simpatico. Nel codice c' anche un esempio di gestione degli errori personalizzati tramite il comando err.raise,

    	Option Explicit
    
    	'Dichiarazioni delle funzioni di sistema delle libreria Kernel32
    
    	'Serve per scrivere un parametro nel file Ini
    	'Prende come parametri la sezione del file .ini, il nome del parametro,
    	'il suo valore ed il nome del file .ini
    	Private Declare Function WritePrivateProfileString _
    		Lib "kernel32" Alias "WritePrivateProfileStringA" _
    		(ByVal lpApplicationKey As String, _
    		ByVal lpKeyName As Any, _
    		ByVal lsString As Any, _
    		ByVal lplFilename As String) As Long
    
    	'Serve per leggere un parametro del file .ini
    	'Prende come parmetri la sezione del file .ini
    	'il nome della chiave, il suo valore di default nel caso in cui non ci sia
    	'la stringa restituita, la sua lunghezza ed il nome del file .ini
    	Private Declare Function GetPrivateProfileString _
    		Lib "kernel32" Alias "GetPrivateProfileStringA" _
    		(ByVal lpApplicationKey As String, _
    		ByVal lpKeyName As String, _
    		ByVal lpDefault As String, _
    		ByVal lpReturnedString As String, _
    		ByVal nSize As Long, _
    		ByVal lpFileName As String) As Long
    
    	'variabile per il nome del file
    	Private m_strFile As String
    
    	'variabile per il nome della sezione
    	Private m_AppKey As String
    
    	'Inizializzazione della classe
    	Private Sub Class_Initialize()
    		m_strFile = ""
    		m_AppKey = ""
    	End Sub
    
    	'Funzioni di get e set del nome del file
    	Public Property Get FileName() As String
    		FileName = m_strFile
    	End Property
    
    	Public Property Let FileName(ByVal strFile As String)
    		m_strFile = Trim(strFile)
    	End Property
    
    	'Funzioni di get e set della sezione
    	Public Property Get ApplicationKey() As String
    		ApplicationKey = m_AppKey
    	End Property
    
    	Public Property Let ApplicationKey(ByVal strAppKey As String)
    		m_AppKey = Trim(strAppKey)
    	End Property
    
    	'Conversione della stringa restituita.
    	'Elimina tutti i caratteri superflui
    	Private Function Asc2String(str As String) As String
    	Dim i As Integer
    	Dim strOP As String
    	Dim intAsc As Integer
    
    		str = Trim(str)
    		strOP = ""
    		For i = 1 To Len(str)
    			intAsc = Asc(Mid(str, i, 1))
    			If intAsc > 31 Then strOP = strOP & Chr(intAsc)
    		Next
    		Asc2String = strOP
    	End Function
    
    	'Restituisce il valore delle chiave
    	'In caso di errore genera un errore che pu essere intercettato
    	'dal modulo chiamante
    	Public Function GetValue(ByVal keyName As String, ByVal strDefault As String) As String
    	Dim strVal As String * 1000
    	Dim ret As Long
    		ret = GetPrivateProfileString(m_AppKey, keyName, strDefault, strVal, Len(strVal), m_strFile)
    		If ret <> 0 Then
    			GetValue = Asc2String(strVal)
    		Else
    			Err.Raise 1025, "Ini Manager Class", "Errore nella lettura della chiave " & keyName
    		End If
    	End Function
    
    	'Imposta il valore di una chiave
    	'Restituisce True se va a buon file
    	Public Function SetValue(ByVal keyName As String, ByVal strValue As String) As Boolean
    	Dim ret As Long
    
    	ret = WritePrivateProfileString(m_AppKey, keyName, strValue, m_strFile)
    	If ret = 0 Then
    		SetValue = False
    		Exit Function
    	End If
    	SetValue = True
    
    	End Function
    
    
    

    Una semplice implementazione

    Per quanto riguarda la gestione invece basta inserire il file .ini nella stessa directory dell'applicazione,

    	Dim iniFile As New Cini
    	dim strVar1 as String
    	iniFile.FileName = App.Path & "/miaApplicazione.ini"
    
    	'Supponiamo di avere una sezione chiamata sezioneq ed una variabile di nome Pippo 
    	'ovvero un file ini del genere
    	'[Sezione1]
    	'Pippo=Ciao
    
    	iniFile.ApplicationKey = "Sezione1"
    
    	strVar1 = iniFile.GetValue("Pippo", "mio valore di default in assenza della variabile")
    
    	'oppure possiamo scrivere nel file .ini tramite il comando
    	iniFile.SetValue "Pippo", "Arrivederci"
    	'Se vogliamo possiamo anche controllare che tutto sia andato bene testando una veriabile booleana
    	if iniFile.SetValue "Pippo", "Arrivederci" then 
    		MsgBox("Ok")
    	else
    		MsgBox("Errore")
    	end if
    

    Home
    Torna alla home page