Rubrik: Dateisystem · INI-Dateien | VB-Versionen: VB4, VB5, VB6 | 05.09.01 |
Control-Inhalte speichern und abrufen Zwei Funktionen, mit denen sich die Inhalte von Eingabecontrols einer Form speichern und bei Bedarf wieder lesen lassen. | ||
Autor: Dieter Otter | Bewertung: | Views: 21.604 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Mit den beiden nachfolgenden Routinen lassen sich Bildschirm-Eingabemasken temporär speichern und jederzeit wiederherstellen. Berücksichtigt werden Textboxen, Option- und Checkboxen sowie horizontale und vertikale Scrollbalken.
Die einzelnen Werte der Controls werden hierbei in einer INI-Datei gespeichert und von dort aus auch wieder ausgelesen. Der Zugriff auf die INI-Datei erfolgt hierbei über die beiden WinAPI-Funktionen WritePrivateProfileString und GetPrivateProfileString. Diese beiden, sowie alle nachfolgenden Funktionen deklarieren Sie am besten in einem Modul:
' zunächst die benötigten API-Funktionen 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 ' INI-Datei Public MyIniFile As String Public Sub Main() MyIniFile = App.Path & "\Controls.ini" End Sub
Werte der Eingabecontrols eines Formulars speichern
Das Ermitteln aller vorhandenen und unterstützten Eingabecontrols erfolgt über die Controls-Auflistung. Mit TypeOf wird hierbei der Typ des Controls geprüft. Die Inhalte werden folgendermassen in der INI-Datei gespeichert:
[Controls] Name=Inhalt
Handelt es sich bei dem Control um ein Steuerelementfeld (also mit gesetzter Index-Eigenschaft), so wird der Index direkt hinter dem Controlnamen in runden Klammern angegeben.
' Inhalte der Controls speichern Public Sub SaveCtrlsTemp(ByVal Form As Form, _ ByVal IniSection As String) Dim Ctl As Control Dim x As String Dim value As String ' Alle Controls der übergebenen Form durchlaufen For Each Ctl In Form.Controls With Ctl x = .Name ' Prüfen, ob Steuerelementfeld (Array) On Local Error Resume Next x = x & "(" & CStr(.Index) & ")" On Local Error GoTo 0 End With value = vbNullString If TypeOf Ctl Is TextBox Then ' TextBox value = Ctl.Text ElseIf TypeOf Ctl Is HScrollBar Or _ TypeOf Ctl Is VScrollBar Then ' horiz./vertik. Scrollbar value = CStr(Ctl.value) ElseIf TypeOf Ctl Is OptionButton Or _ TypeOf Ctl Is CheckBox Then ' OptionButton/CheckBox value = CStr(Ctl.value) Else ' kann beliebig erweitert werden End If ' Inhalt/Wert speichern If value <> vbNullString Then WritePrivateProfileString IniSection, x, value, MyIniFile End If Next End Sub
Die Prozedur erwartet zwei Paramater:
Form - Form-ObjektIniSection - Name des Abschnitts der INI-Datei
Gespeicherte Werte auslesen und Control-Inhalte wiederherstellen
Das Wiederherstellen gespeicherter Control-Inhalte erfolgt in ähnlicher Weise wie beim Speichern. Es wird auch hier die Controls-Auflistung durchlaufen und mit TypeOf geprüft, ob es sich um ein unterstütztes Control handelt. Per GetPrivateProfileString wird der Inhalt aus der INI-Datei ausgelesen und im Control angezeigt.
' Inhalte der Controls lesen Public Sub RestoreCtrlsTemp(ByVal Form As Form, _ ByVal IniSection As String) Dim Ctl As Control Dim x As String Dim value As String Dim lRet As Long ' Alle Controls der übergebenen Form durchlaufen For Each Ctl In Form.Controls With Ctl x = .Name ' Prüfen, ob Steuerelementfeld (Array) On Local Error Resume Next x = x & "(" & CStr(.Index) & ")" On Local Error GoTo 0 End With value = Space$(256) lRet = GetPrivateProfileString(IniSection, x, vbNullString, _ value, Len(value), MyIniFile) If lRet <> 0 Then value = Left$(value, lRet) If TypeOf Ctl Is TextBox Then ' TextBox Ctl.Text = value ElseIf TypeOf Ctl Is HScrollBar Or _ TypeOf Ctl Is VScrollBar Then ' horiz./vertik. Scrollbar Ctl.value = CInt(value) ElseIf TypeOf Ctl Is OptionButton Then ' OptionButton Ctl.value = CBool(value) ElseIf TypeOf Ctl Is CheckBox Then ' CheckBox Ctl.value = CInt(value) Else ' Kann beliebig erweitert werden End If End If Next End Sub
Beispiel
Im nachfolgenden Beispiel wird versucht beim Laden der Form die zuletzt gespeicherten Control-Inhalte wiederherzustellen, welche beim Beenden der Form gespeichert wurden.
Private Sub Form_Load() ' Control-Inhalte wiederherstellen RestoreCtrlsTemp Me, "Controls Form1" End Sub Private Sub Form_Unload(Cancel As Integer) ' Control-Inhalt speichern SaveCtrlsTemp Me, "Controls Form1" End Sub