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