Arbeiten mit ini-Dateien
ini-Dateien eignen sich hervorragend um z.B. Einstellungen und Optionen der Access-Anwendung zu speichern. Sei es Farben, Schriftarten, Schriftgröße oder auch Pfade. ini-Dateien sind nichts anderes als einfache Text-Dateien, die z.B. mit Notepad erstellt werden können. Das Besondere ist der Aufbau des Inhaltes. Hier mal ein Beispiel:
[Colors] backcolor=255 forecolor = 0 [Fonts] fontname=Arial fontsize = 14
Erstellen Sie mit Notepad eine leere Textdatei und benennen Sie diese z.B. meinTest.ini. Im Explorer sehen sie sofort, dass der Text-Datei ein anderes Datei-Icon als das für Textdateien zugeordnet wurde. An diesem Icon können Sie ini-Dateien erkennen. Kopieren Sie nun obigen Code in die ini-Datei und speichern Sie diese.
Um nun lesend oder schreibend darauf zugreifen zu können, benötigen wir 2 API-Funktionen, die wir in ein Standardmodul hinein kopieren:
Public Declare Function GetPrivateProfileString Lib _
"kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationname As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
Public Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationname As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long
Was wir jetzt noch benötigen sind Prozeduren, mittels denen der jeweilige ini-Wert ausgelesen bzw. geschrieben werden kann. Und da wir wo möglich Techniken der Objektorientieren Entwicklung einsetzen möchten, erstellen wir eine Klasse, und benennen diese z.b. „Settings“. Für das Auslesen bzw Schreiben der ini-Werte benötigen wir jeweils eine Get und eine Let-Property:
Option Explicit
Private m_fontname As String
Private m_fontsize As Long
Private m_backcolor As Long
Private m_forecolor As Long
Public Property Get Fontname() As String
If m_fontname = "" Then
m_fontname = iniRead("Fonts", "fontname", "Arial")
End If
Fontname = m_fontname
End Property
Public Property Let Fontname(ByVal cFontname As String)
m_fontname = cFontname
iniWrite "Fonts", "fontname", cFontname
End Property
Public Property Get Fontsize() As Long
If m_fontsize = 0 Then
m_fontsize = iniRead("Fonts", "fontsize", "10")
End If
Fontsize = m_fontsize
End Property
Public Property Let Fontsize(ByVal lFontsize As Long)
m_fontsize = lFontsize
iniWrite "Fonts", "fontsize", lFontsize
End Property
Public Property Get Forecolor() As Long
If m_forecolor = 0 Then
m_forecolor = iniRead("Colors", "forecolor", "0")
End If
Forecolor = m_forecolor
End Property
Public Property Let Forecolor(ByVal lForecolor As Long)
m_forecolor = lForecolor
iniWrite "Colors", "forecolor", lForecolor
End Property
Public Property Get Backcolor() As Long
If m_backcolor = 0 Then
m_backcolor = iniRead("Colors", "backcolor", "16777215")
End If
Backcolor = m_backcolor
End Property
Public Property Let Backcolor(ByVal lBackcolor As Long)
m_backcolor = lBackcolor
iniWrite "Colors", "backcolor", lBackcolor
End Property
Die Funktionsweise von Properties sollte hinlänglich bekannt sein. Es gibt für jeden ini-Wert eine private Variable. Bei dem erstmaligen Aufruf einer Get-Property wird der iniWert mit der Funktion iniRead() ausgelesen und der privaten Variablen zugewiesen. Die Parameter sind: Section, Key und Default-Value. mittels letzterem Wert kann ein Standard-Wert eingestellt werden, falls in der ini-Datei der Wert nicht gesetzt ist – oder die ini-Datei nicht gefunden wurde.
Der Pfad zur ini-Datei kann natürlich nicht in der ini-Datei selbst gespeichert werden, das wäre vergebends. Ich habe z.B. dazu einfach eine weitere Property geschaffen, man hätte es auch in einer Variablen speichern können.
Private Property Get getIniFile() As String
getIniFile = CurrentProject.Path & "\meinTest.ini"
End Property
Kommen wir zu den Funktionen iniRead und iniWrite. Diese bestehen im wesentlichen aus dem Aufruf der API-Funktionen mit den jeweiligen Parametern. Diese stehen ebenfall in der Klasse „Settings“.
Private Function iniRead(ByVal Section As String, _
ByVal Key As String, _
Optional ByVal Default As String = "", _
Optional ByVal nSize As Integer = 256) As String
Dim lResult As Long
Dim cValue As String
cValue = Space$(nSize)
lResult = GetPrivateProfileString(Section, Key, Default, cValue, nSize, getIniFile)
iniRead = Left$(cValue, lResult)
If iniRead = "" Then iniRead = Default
End Function
Private Sub iniWrite(ByVal Section As String, _
ByVal Key As String, _
ByVal cValue As String)
Dim lResult As Long
lResult = WritePrivateProfileString(Sektion, Key, cValue, getIniFile)
If globCodeAbord Then Exit Sub
End Sub
Anwendung:
Die Verwendung der Klasse findet wohl hauptsächlich im Formularmodul statt, z.B. im „Form_Open“ Ereignis. Nachfolgender Beispielcode zeigt wie alle Textfelder und Bezeichnungsfelder in Schrift und Farbe angepasst werden. Die Anpassung ist nicht modal, nach dem Schließen des Formulars sind die Orginaleinstellungen wieder sichtbar:
Private Sub Form_Load()
Dim ctl As Control
Dim frmSetting As Settings
Set frmSetting = New Settings
With frmSetting
For Each ctl In Me.Controls
If ctl.ControlType = 100 Or ctl.ControlType = 109 Then
ctl.Fontsize = .Fontsize
ctl.Fontname = .Fontname
ctl.Forecolor = .Forecolor
End If
Next
Me.Detailbereich.Backcolor = .Backcolor
End With
Set frmSetting = Nothing
End Sub
Es wird ein neues Objekt der Klasse Settings erstellt, und in einer Schleife über alle Steuerelemente werden die mit der ControlType-Eigenschaft von 100 bzw. 109 (Bezeichnungs- und Textfelder) entsprechend verändert. Der Code sollte eigentlich selbsterklärend sein.
Was in den ganzen Codes noch fehlt ist die Fehlerbehandlung, insbesondere sollte man in iniRead/iniWrite das Vorhandensein der ini-Datei abprüfen.
Bis dahin
© 2014 Andreas Vogt