.NET
VB.NET: Einstellungen in der Windows Registry Speichern
Posted on .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 Subund 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:
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author bigbasti87
Posted at 11:17 29. April 2010.
Bloggd: VB.NET: Einstellungen in der Windows Registry Speichern – http://blog.bigbasti.com/vb-net-einstell…