VB.NET: Einstellungen in der Windows Registry Speichern
In so gut wie jedem Computerprogramm müssen Informationen wie Einstellungen oder Benutzerdaten gespeichert werden. Um dies zu realisieren gibt es viele Ansätze wie zB: eine Datenbank, eine XML oder INI Datei oder direkt in der Registry. In diesem kleinem Tutorial werde ich auf die letztere Methode eingehen.
Zu nächst sei gesagt, dass ich es euch nicht empfehlen würde eine Einstellungen in der Registry zu sichern. Das hat folgende Gründe:
- Die Daten sind sehr versteckt und nicht jeder Benutzer weiß, wie man an diese herankommt
- Man kann diese nur sehr schwer sichern oder auf ein anderen System umziehen
- Es wird oft vergessen diese Einstellungen aus der Registry zu löschen, sodass diese als "Leichen" im System bleiben
- Speicherort ist von der Version des Programms abhängig
Auf der anderen Seite gibts aber auch natürlich Vorteile:
- Einstellungen sind vor ungeübten Nutzern "geschützt"
- Sehr geringer Programmier-Aufwand
- Einstellungen können oft auch nach einer Neuinstallation weiter verwendet werden. (Kann auch zum Nachteil werden wenn Einstellungen fehlerhaft sind)
Besonders in früheren Windows Zeiten wurden fast alle Einstellungen in der Registry gesichert. Inzwischen setzt sich die Sicherung der Daten in XML Dateien durch und das .NET Framework bietet seit der 3er Version auch den Namensraum My.Settings mit denen diese XML Dateien automatisch erzeugt werden. Aber heute scheuen wir uns mal den anderen Weg an!
Wie oben bereits erwähnt kann man mit sehr wenig Aufwand seine Einstellungen in der Registry sichern, diese werden dabei hier gesichert:
HKEY_CURRENT_USER\Software\[Unternehmen]\[Programm]\[Version]
Hier werden die Einstellungen gesichert, dabei werden die Variablen in den Klammern automatisch gefüllt.
.Dazu bietet uns der Application-Namesraum alles was wir benötigen. Was wir aber noch machen sollten ist die Überprüfung der Werte und das Exceptionhandling.
Alles was man zum speichern eines Werts angeben muss ist der Name unter dem der Wert gespeichert werden soll und der Wert selbst. Alle Werte werden dann automatisch unter dem oberen Pfad abgelegt.
'''
''' Speichert einen Wert unter angegebenem Namen in der Registry
'''
Public Sub SaveSetting(ByVal name As String, ByVal value As String)
Try
Application.UserAppDataRegistry.SetValue(name, value)
Catch ex As Exception
debug.WriteLine("Fehler: " & ex.Message)
End Try
End Sub
Um die Werte nun wieder auszulesen benötigt man lediglich den Namen, den man zum speichern benutzt hat und man bekommt den Wert aus der Registry geworfen!
'''
''' Lädt den String aus der Regitry passend zu dem angegebenem Namen
'''
Public Function LoadSetting(ByVal name As String) As String
Try
If Not Application.UserAppDataRegistry.GetValue(name) Is Nothing Then
Return CType(Application.UserAppDataRegistry.GetValue(name), String)
Else
Return String.Empty
End If
Catch ex As Exception
debug.WriteLine("Fehler: " & ex.Message)
Return String.Empty
End Try
End Function
Hier muss man aber beachten, dass das Programm, das die Werte ausließt die selbe Version haben muss wie das was sie in die Registry geschrieben hat, da der Pfad (siehe oben) nicht mehr passt!
Wenn man die oberen Methoden implementeirt hat kann man nun die Einstellungen sehr bequem speichern:
'Die Einstellung aller Controls auf der Form speichern Sub Button1Click(sender As Object, e As EventArgs) Dim rs As New RegSaver 'Diese Klasse beinhaltet die oben definierten Funktionen 'Daten für alle Controls speichern For Each c As Control In Me.Controls If TypeOf c Is RadioButton Then Dim a As RadioButton = CType(c, RadioButton) rs.SaveSetting(a.Name,a.Checked) End If If TypeOf c Is CheckBox Then Dim a As CheckBox = CType(c, CheckBox) rs.SaveSetting(a.Name,a.Checked) End If If TypeOf c Is TextBox Then Dim a As TextBox = CType(c, TextBox) rs.SaveSetting(a.Name,a.text) End If Next End Sub
und auch wieder auslesen:
'Die werte aller Controls wieder laden
Sub MainFormLoad(sender As Object, e As EventArgs)
Dim rs As New RegSaver
'Daten für alle Controls laden
For Each c As Control In Me.Controls
Try 'beim ersten starten gibt es keinen wert der gecastet werden kann!
If TypeOf c Is RadioButton Then
Dim a As RadioButton = CType(c, RadioButton)
a.Checked = cbool(rs.loadsetting(a.Name))
End If
If TypeOf c Is CheckBox Then
Dim a As CheckBox = CType(c, CheckBox)
a.Checked = cbool(rs.loadSetting(a.Name))
End If
Catch ex As Exception
debug.WriteLine("Fehler: " & ex.Message)
End Try
If TypeOf c Is TextBox Then
Dim a As TextBox = CType(c, TextBox)
a.Text = rs.loadSetting(a.Name)
End If
Next
End Sub
Wenn die Werte das erste Malgeladen werden, kann es zu fehlern kommen, da man NULL-Strings zurückbekommt, deswegen sollte man hier immer die Exceptions catchen! Falls es in der Registry noch keine passenden Einstellung zu dem Namen gibt, wird diese beim Laden automatisch angelegt!
Bild 1: Demoapplikation mit den geladenen Einstellungen
Wenn der Code durchgelaufen ist wird folgende Struktur in der Registry angelegt:
Bild 2: Die Einstellungen in der Registry
Natürlich bleibt es euch überlassen, wie ihr die Einstellungen benennet, ich habe hier den Namen des Controls verwendet um dessen Status zu speichern, damit ich nicht so viel Code schreiben musste.
Welche Methode ihr nutzt müsst ihr natürlich selber an Hand des Projekts entscheiden, kennen sollte man sie aber alle.
Ein Kleines Demoprojekt gibts hier:
Download: Diesmal ausnahmsweise ein SharpDevelop Projekt
April 29th, 2010
Bloggd: VB.NET: Einstellungen in der Windows Registry Speichern – http://blog.bigbasti.com/vb-net-einstell...