BigBasti's Blog About Me & my Digital Lifestyle

29Apr/100

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

18Apr/100

Interessante Lektuere: Das Kochbuch fuer Geeks

Bei meinem letzten Besuch in der Buchhandlung ist mir ein Buch ins Auge gesprungen, dass ich euch nicht vorenthalten möchte. Das "Kochbuch für Geeks", ich hielts erst für eine Art Scherz, da als Verlag O'Reilly  angegeben war, aber es ist wirklich ein "Echtes" Kochbuch.

Nach etwas herumblättern in dem Buch war ich schon begeistert, denn alles ist so geschrieben, wie man es eigentlich aus einem echten Programmier-buch so kennt, inklusive Klassendiagrammen und kleinen Geekwitzen wie "Sicher umgehen mit Cookies" oder "Die LAN-Party überleben".

O'Reillys Kochbuch für Geeks

Was weiterhin interessant ist, ist dass viele Gerichte danach gewählt werden wie viel Geschirr diese verschmutzen und wie feinfühlig man vorgehen muss. Sehr amüsant!

Auch wenn ich es mir nicht gekauft habe, kann ich mir dennoch gut vorstellen, dass es einem von euch gut gefällt. Wenigstens einen Blick herein zu werfen kann nicht schaden! :-*

veröffentlicht unter: Allgemein, Buch keine Kommentare
15Apr/104

Anonym durchs Internet dank Fake SMS und Fake eMails

Wer viel im netz unterwegs ist hat sicherlich schon Situationen erlebt, in denen er eine E-Mail Adresse und/oder seine Handynummer eingeben musste, sei es nur drum um einen Bestätigungscode zu erhalten oder seine Echtheit zu bestätigen.

Ich weiß nicht wie es euch dabei geht, aber ich gebe nur ungern meine privaten Daten irgendwo bekant wo ich nicht hinterblicken kann, was mit ihnen geschieht. Deswegen habe ich mir schon seit längerem einige zweit E-Mail Adressen angelegt wo ich meißt Spam weiterleite. Aber das ist alles ziemlich unbequem!

Zum Glück gibt es sehr schöne Alternativen die uns viel Arbeit ersparen. Vor ca einem Jahr habe ich den Dienst 10minutemail.com entdeckt.

Dieser Dienst stellt euch eine E-Mailadresse zur Verfügung, die nach 10 Minuten automatisch gelöscht wird, außer man verlängert manuell. So muss man sich nicht mehr um den Spam kümmern, denn dieser verschwindet nach 10 Minuten samt der Adresse!

Doch wenn ein Dienst eure Handynummer haben wollte sah die Welt schon anders aus, da man diese nicht einfach mal so anlegen kann und wieder schnell mal löschen. Doch zum Glück gibts auch hier einen netten Dienst namens Trash-SMS.com

Bei einer Anmeldung oder Aktivierung gebt ihr einfach deren Handynummer an und empfangt die SMS online auf eurem Computer! - Genial! Doch muss man hier aufpassen, denn die Inbox ist von jedem öffentlich einsehbar, also sollte man keine privaten Inhalte an diese Nummern schicken sondern nur Informationen, die man nur ein Mal benutzen kann und die verwerflich sind!

Viel Spaß mit den Diensten, diese haben mir schon so manche Anmeldung leichter gemacht!

14Apr/103

C#: Das Dateisystem mit dem FileSystemWatcher überwachen

Oftmals ist man darauf angewiesen, dein Inhalt von einem oder mehreren Ordnern zu überwachen und auf Änderungen oder Aktionen des Benutzers  zu reagieren.

Dafür gibt es verschiedene Ansätze, ich will euch heute den FileSystemWatcher aus dem .NET Framework vorstellen. Der FileSystemWatcher (FSW) bietet uns eine Reihe von Events mit denen wir das System immer im Blick haben, darunter fallen die Events Changed, Created, Renamed und Deleted.

Da der FSW auch in einem eigenem Thread läuft gibt es auch keine Kollisionen mit der GUI und den anderen Programmabläufen. Hier muss man lediglich darauf achten, dass man keine Exceptions wegen der Threadübergreifenden Aktionen bekommt!

Fangen wir mit der Implementierung an:


            //Eine neue FileSystemWatcher Instanz erstellen
            FileSystemWatcher fw = new FileSystemWatcher("C:\temp");

            //Events regestrieren
            fw.Changed += new FileSystemEventHandler(onChanged);
            fw.Created += new FileSystemEventHandler(onChanged);
            fw.Deleted += new FileSystemEventHandler(onChanged);
            fw.Renamed += new RenamedEventHandler(onRenamed);

            fw.IncludeSubdirectories = true;

            //Überwachung starten
            fw.EnableRaisingEvents = true;

Hier erzeugen wir als erstes eine neues FileSystemWatcher Objekt und geben diesem einen expliziten Pfad als Parameter. Dieser Pfad wird dann vom FSW überwacht.

Als nächstes werden die vier Events registriert über die der FSW uns informieren soll. Zum Schluss sagen wir dem FSW noch, dass er auch die Unterordner des gewählten Pfads mit überwachen soll und starten die Überwachung.

Nun müssen wir noch die Events implementieren:


        private void onChanged(object source, FileSystemEventArgs e)
        {
            if (this.lstEvents.InvokeRequired)
            {
                addItemDel ad = new addItemDel(addItem);
                this.Invoke(ad, new object[] { e.ChangeType + " " + e.FullPath });
            }
            else
            {
                lstEvents.Items.Add(e.ChangeType + " " + e.FullPath);
            }
        }

        private void onRenamed(object source, RenamedEventArgs e)
        {
            if (this.lstEvents.InvokeRequired)
            {
                addItemDel ad = new addItemDel(addItem);
                this.Invoke(ad, new object[] { e.ChangeType + " " + e.OldName + " -> " + e.Name });
            }
            else
            {
                lstEvents.Items.Add(e.ChangeType + " " + e.OldName + " -> " + e.Name);
            }
        }

Da der FSW in einem eigenem Thread läuft müssen wir hier darauf achten und die Werte aus den Events über Delegate Methoden übergeben.


        private delegate void addItemDel(string text);

        private void addItem(string text)
        {
            lstEvents.Items.Add(text);
        }

Aus den übergebenen Event Argumenten können wir alle für uns wichtigen Informationen auslesen, wie den kompletten Pfad und die Dateinamen vor und nach dem umbenennen.

Übrigens nutzen zB. auch Antivieren Programme auch diese Technik für den Liveschutz vom Dateisystem.

Die FSW Klasse bietet noch weitere Möglichkeiten, mehr dazu im MSDN.

Natürlich habe ich hier auch wieder eine kleine Demo vorbereitet:

Bild 1: Events die aus dem überwachten Ordner ausgelesen wurden

Die Demo gibts hier:

11Apr/100

Happy Birthday: Mein Blog wird 1 Jahr alt

Eigentlich war es vorgestern soweit, aber da ich heute erst aus dem Urlaub gekommen bin wird erst heute gratuliert!

Ach wie die Zeit vergeht, mir kommt es vor, als wäre es gestern gewesen als ich den ersten Post schrieb. Aber nun ist schon ein Jahr rum und es hat sich vieles getan. Wie ich es von anderen Blogs so kenne werde ich auch ein paar Statistiken präsentieren:

In dem letzten Jahr

  • wurden 90 Artikel verfasst
  • wurden 565 Kommentare gepostet wurden
  • von denen 86 zugelassen wurden (Rest war Spam)
  • wurden 145 Bewertungen für 60 der 90 Artikel abgegeben bei einer durchschnittlichen Note von 7.8
  • wurden durchschnittlich 24 Demos am Tag heruntergeladen
  • wurde eine Design (Theme)-Änderung durchgeführt
  • wurde der Server gewechselt

Die Besucherzahlen entwickeln sich auch soweit auch ganz gut und befinden sich zur Zeit bei ca 80 Besuchern Täglich und ca 120 Seitenaufrufen.

Bild 2: Durchschnittliche Besucherzahlen

Als kleines Geschenk an euch habe ich mir noch überlegt den News Feed ab heute auf die volle Länge zu schalten (fragt mich nicht warum ich das nicht von Anfang an so gemacht habe), somit ist nun nicht mehr die Kurzfassung als Feed erhältlich, sondern der Volle Artikel inklusive Bildern und Videos!

Ich werde mir natürlich Mühe geben auch weiterhin viele interessante Artikel zu schreiben, sofern die Zeit es erlaubt und hoffe, dass diese euch auch gefallen werden!

Auf ein weiteres Jahr,

Sebastian!

veröffentlicht unter: Allgemein keine Kommentare
   
Get Adobe Flash playerPlugin by wpburn.com wordpress themes