VBA verwijzingen

INI

Een INI-bestand is een tekstbestand. Met behulp van de klassenmodule clsTekstINI kunnen de waarden uit dit tekstbestand worden geladen, gewijzigd en verwijderd.

Voor deze bron hoeft geen verwijzing gemaakt te worden, echter is het wel noodzakelijk om de module modTekstINI ook op te nemen in de toepassing.

In de plaats van een verwijzing naar een ingebouwde bibliotheek wordt er nu gebruik gemaakt van een externe bibliotheek in de vorm van een module.

De hiërarchie van zo’n tekstbestand bestaat uit secties, sleutels en waarden. Een voorbeeld van een sectie is [1], een voorbeeld van een sleutel is VOORNAAM en een voorbeeld van een waarde is Kaylie.

Het gebruik van zo’n INI-bestand is ideaal voor het opslaan en opvragen van gebruikers- en/of systeemgebonden instellingen. Het werkt snel en is makkelijk te beheren.

'-----------------------------------------------------------------------------------------------------------------------
' Auteur        : pascalterheege.nl
' Datum         : 28-3-2017
' Object        : clsTekstINI
' Doel          : waarden laden, wijzigen en verwijderen uit TekstBestandINI m.b.v. modTekstINI
' Objecten      : 1. Sectie
'                 2. Sleutel
'                 3. Waarde
'-----------------------------------------------------------------------------------------------------------------------

Option Explicit

Public Sub Laden(lsb As ListBox)

'   Waarden uitlezen op sectieniveau (=nummer)

    Dim strSecties() As String
    Dim strSectie As Variant
    Dim i As Integer
    
    strSecties = SectiesINI(TekstBestandINI)
    
    For Each strSectie In strSecties
        With lsb
            .AddItem
            .List(i, 0) = strSectie
            .List(i, 1) = LeesINI(CStr(strSectie), "Voornaam", TekstBestandINI)
            .List(i, 2) = LeesINI(CStr(strSectie), "Achternaam", TekstBestandINI)
        End With
        i = i + 1
    Next

End Sub

Public Sub Toevoegen(strNummer As String, strVoornaam As String, strAchternaam As String)

'   Toevoegen aan INI-bestand

    SchrijfINI strNummer, "Voornaam", strVoornaam, TekstBestandINI
    SchrijfINI strNummer, "Achternaam", strAchternaam, TekstBestandINI

End Sub

Public Sub Wijzig(strNummer As String, strVoornaam As String, strAchternaam As String)

'   Wijzigen is gelijk aan toevoegen

    Toevoegen strNummer, strVoornaam, strAchternaam

End Sub

Public Sub Verwijder(strNummer As String, blnAlles As Boolean)

'   Heel bestand verwijderen of aan de hand van nummer hele sectie verwijderen
    
    If blnAlles = True Then
        Kill TekstBestandINI
    Else
        SchrijfINI strNummer, "", "", TekstBestandINI
    End If
    
End Sub
'-----------------------------------------------------------------------------------------------------------------------
' Auteur        : pascalterheege.nl
' Datum         : 28-3-2017
' Object        : modTekstINI
' Doel          : ondersteuning voor klasse clsTekstINI
' Opmerking     : ingebouwde functies
'-----------------------------------------------------------------------------------------------------------------------

Option Explicit

#If VBA7 Then
    Public Declare PtrSafe 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 lpBestand As String) As Long
    Public Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpBestand As String) As Long
    Private Declare PtrSafe Function GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" (ByVal lpszReturnBuffer As String, ByVal nSize As Long, ByVal lpBestand As String) As Long
#Else
    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 lpBestand 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 lpBestand As String) As Long
    Private Declare Function GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" (ByVal lpszReturnBuffer As String, ByVal nSize As Long, ByVal lpBestand As String) As Long
#End If

Public Function LeesINI(strSectie As String, strSleutel As String, strBestand As String) As String

'   Waarde lezen

    Dim strBuffer As String
    strBuffer$ = String$(750, Chr$(0&))
    LeesINI$ = Left$(strBuffer$, GetPrivateProfileString(strSectie$, ByVal UCase$(strSleutel$), "", strBuffer, Len(strBuffer), strBestand$))

End Function

Public Sub SchrijfINI(strSectie As String, strSleutel As String, strWaarde As String, strBestand As String)

'   Waarde wegschrijven; zijn sleutel en waarde leeg dan gehele sectie verwijderen

    If strSleutel = "" And strWaarde = "" Then
        WritePrivateProfileString strSectie$, vbNullString, vbNullString, strBestand$
    Else
        WritePrivateProfileString strSectie$, UCase$(strSleutel$), strWaarde$, strBestand$
    End If

End Sub

Public Function SectiesINI(strBestand As String) As String()
    
'   Array voor secties
    
    If Dir(strBestand) = "" Then Exit Function
    
    Dim strBuffer As String, intLengte As Integer
    
    Do While (intLengte = Len(strBuffer) - 2) Or (intLengte = 0)
    
        If strBuffer = vbNullString Then
            strBuffer = Space(256)
        Else
            strBuffer = String(Len(strBuffer) * 2, 0)
        End If
    
        intLengte = GetPrivateProfileSectionNames(strBuffer, Len(strBuffer), strBestand)
    
    Loop
    
    strBuffer = Left$(strBuffer, intLengte)
    
    SectiesINI = Split(strBuffer, vbNullChar)
    
    ReDim Preserve SectiesINI(UBound(SectiesINI) - 1) As String

End Function