INI-Dateien

Deklaration und Aufruf | Funktionen für die Verwaltung von Ini-Dateien | Beispiel: Ini-Datei schreiben
Beispiel: Ini-Datei lesen und auswerten

Windows-Programme enthalten oft Ini-Dateien, die z.B. Fenstereinstellungen, bei Spielen Hitlisten u.s.w. enthalten. Sie werden standardmäßig (zumindest bis Windows 3.11) im Windows-Verzeichnis gespeichert und beim Programmstart automatisch geladen. Ihre Struktur ist einfach:
 
[Überschrift1]
Kennung1 = Wert
Kennung2 = Wert
...
[Überschrift2]
Kennung7 = Wert
...
[Überschrift3]
...

Immer, wenn das Programm Einstellungen oder Daten enthält, die beim späteren Programmstart wieder gebraucht werden, dann sollte man eine Ini-Datei anlegen. Unterstützt wird die Arbeit mit Ini-Dateien durch  Windows API-Funktionen.


Deklaration und Aufruf

API's müssen vor ihrer Benutzung deklariert werden. Wie es geht, steht hier:

Ein Beispiel

Eintrag im Startmodul:
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Aufruf:
Dim wort As String, a As Long wort = Space(25)
a = Len(wort)
GetUserName wort, a
username = Trim(wort)
zum Anfang

Die Funktionen für die Verwaltung von Ini-Dateien

Achtung, die folgenden Funktionsdeklarationen schreibt man nicht etwa ab, sondern holt sie aus dem API-Katalog, wie oben beschrieben. Ich zeige sie nur, damit die Aufrufe klar werden!

Ini-Eintrag mit Überschrift und WertDeclare Function WritePrivateProfileString Lib "kernel32"  Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Überschrift nur mit Kennung schreibenDeclare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
Zeichenkette
lesen
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
Integerwert
lesen
Declare Function GetPrivateProfileInt Lib "kernel32"  Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long

 
ÜberschriftlpApplicationName
lpAppName
Text, der in eckigen Klammern erscheinen soll
KennunglpKeyNameText, der einen Schlüsselbegriff bedeutet, das "=" wird automatisch eingetragen
Wert:lpStringmuß als String geschrieben werden, deshalb bei Zahlen Cstr(zahl) verwenden!
Name der Ini-DateilpFileNameWenn kein Pfad angegeben wird, wird die Ini-Datei ins Windows-Verzeichnis geschrieben. App.Path gibt zur Laufzeit eines vb-Programms den Pfad der .vbp bzw. der .exe an. Mit App.Path & "meinnane.ini" wird in das Arbeitsverzeichnis des Programmes geschrieben
DefaultwertlpDefaultText für den Fall, daß nichts eingetragen wird
gelesener TextlpReturnedString 
zulässige Länge des TextesnSize 
zum Anfang

Beispiel: Ini-Datei schreiben

Eine Ini-Datei wird, wenn es sie noch nicht gab angelegt, wenn sie schon da war überschrieben. Beim Neustart werden die Einträge auf Verlangen übernommen.
Im folgenden Code sind alle Texteinträge direkt vorgenommen worden, natürlich könnten es auch Variablennamen sein. Diese müssen allerdings dann zulässige Werte (Strings) enthalten. Sonst kommt es zu Abstürzen. Dies Routine:
 

Private Sub command1_Click()
WritePrivateProfileString "Erste Abteilung", "Männer", CStr(5), App.Path & "\test.ini"
WritePrivateProfileString "Erste Abteilung", "Frauen", CStr(8), App.Path & "\test.ini"
WritePrivateProfileString "Erste Abteilung", "Kinder", CStr(25), App.Path & "\test.ini"
WritePrivateProfileString "Zweite Abteilung", "Männermasse",  CStr(90.5), App.Path & "\test.ini"
WritePrivateProfileString "Zweite Abteilung", "Frauenmasse", CStr(55.7), App.Path & "\test.ini" 
WritePrivateProfileString "Zweite Abteilung", "Kindermasse", CStr(25.2), App.Path & "\test.ini"
WritePrivateProfileSection "Versuch", "Allerlei", App.Path & "\test.ini"
End Sub

erzeugt folgende Ini-Datei:
 

[Erste Abteilung]
Männer=5
Frauen=8
Kinder=25

[Zweite Abteilung]
Männermasse=90,5
Frauenmasse=55,7
Kindermasse=25,2

[Versuch]
Allerlei

Daß der Aufruf hier mit einem Tastendruck erfolgte, muß zunächst nicht verwundern. Wir sind beim Testen. Im Programm muß eine solche Schreibroutine genau (überall) dort aufgerufen werden, wo das Programm beendet werden kann.
Zu beachten ist hier ein Problem, das bei Visual Basic öfter auftritt. Ihm (wieso "ihm", besser ihr, der Sprache!) war abverlangt, aus den Dezimalzahlen Strings zu machen. Dabei ersetzte vb die (intern erforderlichen) Dezimalpunkte durch (wegen der Spracheinstellung) äußerlich erforderlichen Kommas. Beim Lesen kann das zu Schwierigkeiten führen.

zum Anfang

Beispiel: Ini-Datei lesen und auswerten

Zum Lesen der Ini-Datei gibt es zwei Funktionen: GetPrivateProfileString und GetPrivateProfileInt. Aufgerufen wird teilweise mit den gleichen Parametern wie beim Schreiben.

Fall1: Die eingetragenen Werte sind (aus Prinzip) Ganzzahlen.
Die gelesenen Werte ergeben sich dann als Ergebnis des Funktionsaufrufes, also bezogen auf die oben geschriebene Ini-Datei:

Dim MännerZahl As Integer, AllerleiZahl As Integer
...
MännerZahl = GetPrivateProfileInt("Erste Abteilung", "Männer", 10, App.Path & "\test.ini")
AllerleiZahl = GetPrivateProfileInt("Versuch", "Allerlei", 111, App.Path & "\test.ini")

Wo hier die 10 steht, könnte auch ein Variablenname stehen. Der Wert bedeutet einen default-Wert, der dann zurückgemeldet wird, wenn die Ini-Datei kein Ergebnis liefert. Der angegeben Aufruf ergibt für Männerzahl den Wert 5, für AllerleiZahl den Wert 111.

Fall2: Die eingetragenen Werte müssen als String ausgelesen werden. Diesmal ist mehr Aufwand nötig. Die Funktion GetPrivateProfileString meldet nämlich als Ergebnis die Länge der in der Inidatei hinter "=" stehenden Zeichenkette (im Aufruf unten die Variable "lang"), die Zeichenkette selbst wird einer Stringvariablen übergeben, die zuvor mit endlicher Länge angelegt werden muß (unten im Aufruf die Variable "Masse"). Auch hier kann ein Default-Wert für die Rückgabe vorgesehen werden (unten im Aufruf "22,2")

Dim lang, Masse as string*15
...
lang = GetPrivateProfileString("Zweite Abteilung", "Frauenmasse", "22,2", Masse, 15, App.Path & "\test.ini")

Dieser Aufruf ergibt für lang den Wert 4, für Masse den String "55,7", welcher sich mit einer Umwandlungsfunktion CSng(Masse) in den Zahlenwert zurückverwandeln läßt.

zum Anfang

© R. Hirte * 2001