Arbeiten mit ini-Dateien

By , 3. März 2014

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

OfficeFolders theme by Themocracy