| [Ü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.
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) |
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 Wert | 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 |
| Überschrift nur mit Kennung schreiben | Declare 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 |
| Überschrift | lpApplicationName lpAppName | Text, der in eckigen Klammern erscheinen soll |
| Kennung | lpKeyName | Text, der einen Schlüsselbegriff bedeutet, das "=" wird automatisch eingetragen |
| Wert: | lpString | muß als String geschrieben werden, deshalb bei Zahlen Cstr(zahl) verwenden! |
| Name der Ini-Datei | lpFileName | Wenn 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 |
| Defaultwert | lpDefault | Text für den Fall, daß nichts eingetragen wird |
| gelesener Text | lpReturnedString | |
| zulässige Länge des Textes | nSize |
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" End SubWritePrivateProfileString "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" |
erzeugt folgende Ini-Datei:
| [Erste Abteilung] Männer=5 Frauen=8 Kinder=25 [Zweite Abteilung] [Versuch] |
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 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.