+ All Categories
Home > Documents > JOACHIMFUCHS ANDREASBARCHFELD Das VisualBasic2008 … · 2008. 12. 17. · VB.NET ordnet die Klasse...

JOACHIMFUCHS ANDREASBARCHFELD Das VisualBasic2008 … · 2008. 12. 17. · VB.NET ordnet die Klasse...

Date post: 15-Feb-2021
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
20
Das Visual Basic 2008 Codebook Visual Studio Professional 2008 Edition (90-Tage-Testversion) JOACHIM FUCHS ANDREAS BARCHFELD
Transcript
  • DasVisualBasic2008

    Codebook

    Visual StudioProfessional 2008 Edition(90-Tage-Testversion)

    JOACHIMFUCHSANDREASBARCHFELD

  • Teil II Rezepte

    Basics

    Datum und Zeit

    Anwendungen

    Mit GDI+ zeichnen

    GDI+-Bildbearbeitung

    Windows Forms

    Windows Controls

    Eigenschaftsfenster (Property Grid)

    Dateisystem

    Netzwerk

    System/WMI

    Datenbanken

    XML

    Wissenschaftliche Berechnungenund Darstellungen

    Geodaten

    DirectX

    Verschiedenes

  • Anw

    endu

    ngen

    Anwendungen

    Im Bereich der Anwendungskonfiguration, der Ressourcen und der Anwendungssteuerung hatsich vieles verändert. Dieses Kapitel wurde daher vollständig neu aufgebaut. Aber keine Angst –die im alten Codebook beschriebenen Vorgehensweisen für Konfigurationsdateien funktionie-ren noch immer. Bestehender Code muss nicht geändert werden.

    Die Änderungen bezüglich der Verwaltung der Konfigurationsdaten ziehen sich durchs Frame-work wie auch durch Visual Studio. Etliche neue Klassen erlauben gezielte Zugriffe auf Konfi-gurationsdateien und ermöglichen inzwischen auch das Speichern benutzerspezifischer Datendurch die Anwendung. Die Entwicklungsumgebung wurde durch Assistenten und Automatis-men erweitert, die viele der üblichen Anwendungsfälle abdecken und erheblich vereinfachen.

    48 Anwendungskonfiguration mit Visual Studio erstellenMithilfe des Designers lassen sich zwei Arten von Konfigurationsdaten erstellen: anwen-dungsspezifische und benutzerspezifische. Erstere gehören zur Anwendung und werden alsXML-Datei im Exe-Verzeichnis der Anwendung gespeichert. Sie sollten zur Laufzeit des Pro-gramms möglichst nicht verändert werden und dienen in keinem Fall zum Speichern benut-zerspezifischer Daten. Oft besitzt die gestartete Anwendung auch keine ausreichenden Rechte,um Änderungen an der Anwendungskonfigurationsdatei vornehmen zu können. Meist sind esstatische Informationen, die nur selten geändert werden müssen.

    Die benutzerspezifischen Konfigurationsdaten werden hingegen in privaten Verzeichnissendes angemeldeten Benutzers als XML-Datei gespeichert. Sie liegen meist in einem Verzeichniswie C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Anwendungsdaten\Firmenname\Anwendungsname\1.0.0.0. Die Tatsache, dass der Firmenname standardmäßigBestandteil des Pfads ist, legt nahe, diesen in der Anwendung auch korrekt anzugeben. Wie inAbbildung 16 gezeigt, kann das über die Projekteigenschaften, Karteireiter Anwendung, Schalt-fläche Assemblyinformationen vorgenommen werden.

    Allerdings wird der Firmenname nur bis zu einer bestimmten Länge berücksichtigt. Der in derAbbildung gezeigte Name wird nach ca. 25 Zeichen abgebrochen. Dies sollten Sie bei IhrenAnwendungen berücksichtigen.

  • >> Anwendungskonfiguration mit Visual Studio erstellen118An

    wen

    dung

    en

    Abbildung 16: Der Firmenname spielt bei der Ablage benutzerspezifischer Konfigurationsdaten eine wichtige Rolle.

    Auch die Definition der Konfigurationsdaten ist einfacher geworden. Sie müssen nicht mehrvon Hand eine App.config-Datei anlegen, sondern benutzen ebenfalls die Anwendungskonfi-guration zur Eingabe von Daten (Karteireiter Einstellungen) (siehe Abbildung 17). Alternativkönnen Sie die Anwendungseinstellungen auch über den Eintrag Settings.settings im Projekt-mappen-Explorer erreichen. In der ersten Spalte geben Sie den Namen einer Konfigurations-eigenschaft vor, in der zweiten Spalte wählen Sie den Typ. Dabei haben Sie Zugriff auf eineVielfalt von Datentypen des Frameworks und sind nicht auf Zeichenketten beschränkt. Wie imBild gezeigt können auch Enumerationen oder Strukturen wie Point und Size verwendet wer-den.

  • >> Anwendungen 119

    Anw

    endu

    ngen

    Abbildung 17: Eingabe benutzerspezifischer Daten und Auswahl des Datentyps

    In der Spalte Bereich können Sie wählen, ob die Eigenschaft anwendungs- oder benutzerspe-zifisch sein soll, und in der letzten Spalte geben Sie den Standardwert für die Eigenschaft vor.Die Werteingabe erfolgt als Text und muss daher so aufgebaut sein, dass der zugeordneteDatentyp diesen Text auch interpretieren kann. Die Syntax ist typabhängig und folgt der Dar-stellung entsprechender Werte im Eigenschaftsfenster (PropertyGrid).

    Für anwendungsspezifische Eigenschaften wählen Sie den entsprechenden Eintrag in derSpalte Bereich (Abbildung 18).

    Abbildung 18: Auch statische, schreibgeschützte Anwendungseigenschaften lassen sich anlegen.

    Aus den Eingaben im Tabellenfenster generiert der Designer automatisch eine Konfigurations-datei wie in Listing 48 gezeigt. Sie wird als App.config dem Projekt hinzugefügt und beimStart der Anwendung in das Binärverzeichnis unter dem Namen Anwendungsname.exe.configkopiert. Im Element configSections werden alle Konfigurationsgruppen deklariert. Hierzu

  • >> Anwendungskonfiguration mit Visual Studio erstellen120An

    wen

    dung

    en

    gehören im vorliegenden Fall userSettings und applicationSettings. Für beide Gruppen gibtes weiter unten einen Datenteil, in dem Sie die eingegebenen Eigenschaften und ihre Wertewieder finden.

    ... 0, 0 200, 150 Normal

    Listing 48: Vom Designer generierte XML-Datei app.config

  • >> Anwendungen 121

    Anw

    endu

    ngen

    Visual Studio 2005 belässt es aber nicht beim Erstellen der XML-Datei, sondern geht nocheinen Schritt weiter. Dem Projekt wird unterhalb von Settings.settings die Code-Datei Set-tings.Designer.vb hinzugefügt (Listing 49). Diese Datei enthält Klassendefinitionen für die vonIhnen vorgegebenen Eigenschaften. Für jede Eigenschaft, die über die Tabelle für die Anwen-dungseinstellungen definiert worden ist, wird eine Property angelegt. BenutzerspezifischeEigenschaften können gelesen und geschrieben werden, anwendungsspezifische sind hingegenschreibgeschützt.

    Über Attribute werden die Property-Definitionen den verschiedenen Bereichen zugeordnet(UserScopedSettingAttribute bzw. ApplicationScopedSettingAttribute). Die Initialwerte wer-den über das Attribut DefaultSettingValueAttribute festgelegt.

    Konfiguration von Windows-Anwendungen

    Namespace My

    _ Partial Friend NotInheritable Class MySettings Inherits Global.System.Configuration.ApplicationSettingsBase

    Private Shared defaultInstance As MySettings = _ CType(Global.System.Configuration.ApplicationSettingsBase. _ Synchronized(New MySettings), MySettings)

    #Region "Funktion zum automatischen Speichern von My.Settings"...#End Region

    Public Shared ReadOnly Property [Default]() As MySettings Get

    #If _MyType = "WindowsForms" Then If Not addedHandler Then SyncLock addedHandlerLockObject If Not addedHandler Then AddHandler My.Application.Shutdown, _ AddressOf AutoSaveSettings addedHandler = True End If End SyncLock

    Listing 49: Vom Designer automatisch generierter Code zur typsicheren Einbindung der Konfigurationsdaten

    Listing 48: Vom Designer generierte XML-Datei app.config (Forts.)

  • >> Anwendungskonfiguration mit Visual Studio erstellen122An

    wen

    dung

    en

    End If#End If Return defaultInstance End Get End Property

    _ Public Property WindowLocation() As _ Global.System.Drawing.Point Get Return CType(Me("WindowLocation"), _ Global.System.Drawing.Point) End Get Set(ByVal value As Global.System.Drawing.Point) Me("WindowLocation") = Value End Set End Property

    _ Public Property WindowSize() As Global.System.Drawing.Size Get Return CType(Me("WindowSize"), Global.System.Drawing.Size) End Get Set(ByVal value As Global.System.Drawing.Size) Me("WindowSize") = Value End Set End Property

    _ Public Property WindowState() As _ Global.System.Windows.Forms.FormWindowState Get Return CType(Me("WindowState"), _ Global.System.Windows.Forms.FormWindowState) End Get Set(ByVal value As _ Global.System.Windows.Forms.FormWindowState) Me("WindowState") = Value End Set End Property

    Listing 49: Vom Designer automatisch generierter Code zur typsicheren Einbindung der Konfigurationsdaten (Forts.)

  • >> Anwendungen 123

    Anw

    endu

    ngen

    VB.NET ordnet die Klasse dem Namensraum My zu. Über My.Settings haben Sie somit direktenZugriff auf alle Konfigurationsdaten. In Listing 50 sehen Sie ein kleines Anwendungsbeispiel,das die Konfigurationsdaten im Load-Ereignis des Fensters einliest und nutzt und beim Schlie-ßen des Fensters wieder abspeichert.

    _ Public ReadOnly Property ApplicationTitle() As String Get Return CType(Me("ApplicationTitle"), String) End Get End Property End ClassEnd Namespace

    Namespace My

    _ Friend Module MySettingsProperty

    _ Friend ReadOnly Property Settings() As _ Global.Application1.My.MySettings Get Return Global.Application1.My.MySettings.Default End Get End Property End ModuleEnd Namespace

    Private Sub Hauptfenster_Load(...) Handles MyBase.Load Me.Location = My.Settings.WindowLocation Me.Size = My.Settings.WindowSize Me.WindowState = My.Settings.WindowState Me.Text = My.Settings.ApplicationTitle

    ToolStripStatusLabel1.Text = "Initiale Fenstergröße: " & _ My.Settings.WindowSize.ToString() & ", Position: " & _

    Listing 50: Konfigurationsdaten lesen und speichern

    Listing 49: Vom Designer automatisch generierter Code zur typsicheren Einbindung der Konfigurationsdaten (Forts.)

  • >> Anwendungskonfiguration mit Visual Studio erstellen124An

    wen

    dung

    en

    My.Settings.Save() führt zum Speichern der benutzerspezifischen Eigenschaften im privatenVerzeichnis des angemeldeten Benutzers. Der tatsächliche Ablageort hängt davon ab, ob dieAnwendung über die Entwicklungsumgebung gestartet wurde oder auf anderem Weg. Über-prüfen Sie im Einzelfall selbst, welche Verzeichnisse unter C:\Dokumente und Einstellun-gen\Benutzername\Lokale Einstellungen\Anwendungsdaten\Firmenname angelegt worden sind.

    Allerdings wird nur dann eine Datei angelegt, wenn die Eigenschaften von den Initialwertender Anwendungskonfigurationsdatei abweichen. Listing 51 zeigt einen möglichen Aufbau derbenutzerspezifischen Datei user.config, Abbildung 19 das Fenster der Beispielanwendung.

    My.Settings.WindowLocation.ToString() & ", State: " & _ My.Settings.WindowState

    End Sub

    Protected Overrides Sub OnClosing(...) If Me.WindowState = FormWindowState.Normal Then My.Settings.WindowLocation = Me.Location My.Settings.WindowSize = Me.Size End If My.Settings.WindowState = Me.WindowState

    My.Settings.Save()

    MyBase.OnClosing(e)End Sub

    117, 322 511, 154 Normal

    Listing 51: In der Datei user.config werden die benutzerspezifischen Daten gespeichert.

    Listing 50: Konfigurationsdaten lesen und speichern (Forts.)

  • >> Anwendungen 125

    Anw

    endu

    ngen

    Abbildung 19: Die gespeicherten Fensterdaten werden beim Start der Anwendung berücksichtigt und Änderungen beim Schließen wieder gespeichert.

    49 Konfiguration für Datenbankverbindung speichern (mit und ohne Verschlüsselung)

    Auch die Connection-Strings für Datenbankzugriffe können über den Designer in der Konfigu-rationsdatei eingetragen werden. Als Datentyp wird hierzu (Verbindungszeichenfolge) gewählt(Abbildung 20). Über die Schaltfläche in der Wert-Spalte lässt sich dann der bekannte Verbin-dungs-Assistent für Datenbanken aufrufen. Der erzeugte Verbindungs-String lässt sich dannüber My.Settings im Programm abrufen.

    Abbildung 20: Connection-String für Datenbankzugriffe festlegen

    In der Konfigurationsdatei wird eine eigene Sektion für Verbindungs-Strings angelegt (Listing52). Für jede Verbindung wird ein Eintrag vorgenommen. Natürlich werden die Strings imKlartext gespeichert.

    Listing 52: Datenbank-Connection-String in der Konfigurationsdatei

  • >> Konfiguration für Datenbankverbindung speichern (mit und ohne Verschlüsselung)126An

    wen

    dung

    en

    Daten verschlüsseln

    Während bei einer web.config-Datei die enthaltenen Daten dem normalen Anwender ohnehinnicht zugänglich sind, da der Server die Datei nicht zum Browser schickt, kann ein Verbin-dungs-String im Klartext für eine Windows-Anwendung ein Sicherheitsrisiko bedeuten. Dannmacht es unter Umständen Sinn, die Sektion zu verschlüsseln.

    Und auch dafür stellt das neue Framework Methoden bereit. Listing 53 zeigt, wie alle Datender betreffenden Sektion der Konfigurationsdatei verschlüsselt werden können. Der veränderteBereich der Konfigurationsdatei ist in Listing 54 zu sehen. In der Beispielanwendung wird derConnection-String beim Start gelesen und auf einem Label angezeigt. Über zwei Schaltflächenkann der Bereich der Konfigurationsdatei ver- und entschlüsselt werden. Den Code für dieEntschlüsselung zeigt Listing 55, das fertige Ergebnis Abbildung 21.

    ' Konfigurationsdatei mit dem ConfigurationManager öffnenDim config As Configuration = _ ConfigurationManager.OpenExeConfiguration( _ ConfigurationUserLevel.None)

    ' Zugriff auf die Sektion mit den Connection-StringDim cs As ConnectionStringsSection = config.ConnectionStrings

    ' Verschlüsselncs.SectionInformation.ProtectSection( _ "DataProtectionConfigurationProvider")

    ' Konfiguration speichernconfig.Save()

    Listing 53: Verschlüsseln der Verbindungs-Strings in der Konfigurationsdatei

    AQAAANCMnd8BFd4jvKQi ...

    Listing 54: Die Verbindungsdaten sind nun vor aufdringlichen Blicken geschützt.

    ' Konfigurationsdatei mit dem ConfigurationManager öffnenDim config As Configuration = _ ConfigurationManager.OpenExeConfiguration( _ ConfigurationUserLevel.None)

    ' Zugriff auf die Sektion mit den Connection-String

    Listing 55: Entschlüsseln der verschlüsselten Sektion

  • >> Anwendungen 127

    Anw

    endu

    ngen

    Abbildung 21: Beispielanwendung zum Ver- und Entschlüsseln von Connection-Strings

    Möglich sind die oben beschriebenen Aktionen dank der Klasse ConfigurationManager. Siestellt im Framework 2.0 den zentralen Zugang zu den Konfigurationsdateien bereit. Die vomDesigner generierten Klassen helfen hier nicht weiter. Zudem kann der vom Designer gene-rierte Code keine Änderung in der Sektion der Anwendungsdaten vornehmen. Über den Con-figurationManager ist das möglich, sofern die Anwendung über ausreichende Rechte verfügt.

    Dim cs As ConnectionStringsSection = config.ConnectionStrings

    ' Nur, wenn bereits eine Verschlüsselung bestehtIf cs.SectionInformation.IsProtected Then

    ' Entschlüsseln cs.SectionInformation.UnprotectSection()

    ' Konfiguration speichern config.Save()End If

    Note Zum Testen der Beispielanwendung starten Sie diese am besten über den Explorer und

    nicht im Debug-Modus. Denn sonst kopiert die Entwicklungsumgebung nach Programm-ende die Konfigurationsdateien wieder um, sodass die vorgenommenen Änderungen ver-loren gehen. Beachten Sie ferner, dass die Entwicklungsumgebung zwei .config-Dateienim Binärverzeichnis anlegt, von der die eine für Debug-Zwecke benutzt wird.

    Die Anwendung muss über ausreichende Rechte verfügen, um die Konfigurationsdateiändern zu können.

    Note Für die Nutzung der Klasse ConfigurationManager muss dem Projekt ein Verweis auf die

    Bibliothek System.configuration.dll hinzugefügt werden.

    Listing 55: Entschlüsseln der verschlüsselten Sektion (Forts.)

  • >> Zusätzliche Sektionen in der Konfigurationsdatei einrichten128An

    wen

    dung

    en

    50 Zusätzliche Sektionen in der Konfigurationsdatei einrichten

    Die Klasse ConfigurationManager ist der Schlüssel für jede Art von Zugriffen auf die Konfigu-rationsdateien. Sie bietet zahlreiche Methoden zum Öffnen und Speichern der Dateien sowiefür den Umgang mit den einzelnen Sektionen. Die Methode GetSection beispielsweise öffneteine Sektion und stellt ein Objekt zur Verfügung, über das auf die Daten zugegriffen werdenkann. Der Typ dieses Objektes hängt von den Deklarationen innerhalb der Konfigurationsdateiab. Auch eigene Typen lassen sich realisieren.

    Jede Sektion muss in der Konfigurationsdatei im Element configSections deklariert werden.Für eine Sektion müssen der Name und der Typ des Section-Handlers festgelegt werden. ImBeispiel in Listing 56 wird die Sektion BookSection deklariert und der Typ Application2.Book-Info für den Handler festgelegt.

    Der Aufruf von ConfigurationManager.GetSection führt dann zur Instanziierung des angegebe-nen Typs. Im vorliegenden Beispiel wird eine zusätzliche Klasse bereitgestellt, welche dieInformationen dieser Sektion auswerten kann (Klasse BookInfo, Listing 57). Für die beidenEigenschaften werden zwei öffentliche Properties implementiert. Sie werden mit einemStringValidator-Attribut versehen, um mögliche Konfigurationsfehler zu erkennen. Internarbeiten sie mit dem Indexer der Basisklasse ConfigurationSection. Über den Namen derEigenschaft als Index kann lesend und schreibend auf den Wert zugegriffen werden.

    Damit das Objekt weiß, welche Eigenschaften mit welchem Typ umzusetzen sind, erfolgt imKonstruktor eine Deklaration dieser Eigenschaften. Der Properties-Auflistung werden Instan-zen der Klasse ConfigurationProperty hinzugefügt, welche die benötigten Informationen be-inhalten.

    ...

    ...

    Listing 56: Beispiel für eine selbst definierte Sektion

    Imports System.ConfigurationPublic Class BookInfo Inherits System.Configuration.ConfigurationSection

    Public Sub New()

    Listing 57: Ein Handler für eine eigene Sektion der Konfigurationsdatei

  • >> Anwendungen 129

    Anw

    endu

    ngen

    Im Load-Ereignis der Beispielanwendung wird mittels GetSection die Klasse BookInfo instanzi-iert und die Sektion geladen. Die gespeicherten Werte lassen sich dann über die bereitgestell-ten Eigenschaften lesen. Abbildung 22 zeigt das Fenster des Beispielprogramms, Listing 58 dieImplementierung.

    ' Eigenschaft Title hinzufügen Dim propTitle As New _ ConfigurationProperty("Title", GetType(String)) Me.Properties.Add(propTitle)

    ' Eigenschaft Publisher hinzufügen Dim propPublisher As New _ ConfigurationProperty("Publisher", GetType(String)) Me.Properties.Add(propPublisher)

    End Sub

    ' Eigenschaft Title _ Public Property Title() As String Get Return CStr(Me("Title")) End Get Set(ByVal value As String) Me("Title") = value End Set End Property

    ' Eigenschaft Publisher _ Public Property Publisher() As String Get Return CStr(Me("Publisher")) End Get Set(ByVal value As String) Me("Publisher") = value End Set End Property

    End Class

    ' Sektion lesenDim bi As BookInfo = CType( _ ConfigurationManager.GetSection("BookSection"), BookInfo)

    Listing 58: Laden der zusätzlichen Sektion

    Listing 57: Ein Handler für eine eigene Sektion der Konfigurationsdatei (Forts.)

  • >> Lesen der Konfigurationsdatei machine.config130An

    wen

    dung

    en

    Abbildung 22: Informationen aus eigenen Sektionen lesen

    Die Möglichkeiten für eigene Sektionen sind vielfältig und können hier nicht vollständig dar-gestellt werden. Eine Reihe von Klassen des Frameworks kann direkt benutzt werden oder alsBasisklasse eigener Klassen dienen, die um zusätzliche Funktionalität erweitert werden. Die imBeispiel verwendete Basisklasse ConfigurationSection bietet zahlreiche überschreibbare Metho-den wie DeserializeElement oder DeserializeSection, in denen Einfluss auf die Umsetzung indie XML-Struktur genommen werden kann. Klassen wie SingleTagSectionHandler, Dictionary-SectionHandler, NameValueCollectionHandler oder IgnoreSectionHandler können direkt einge-setzt werden.

    51 Lesen der Konfigurationsdatei machine.configAuch auf andere Konfigurationsdateien kann leicht zugegriffen werden. So erlaubt der Confi-gurationManager direkt das Öffnen der zentralen Konfigurationsdatei machine.config mithilfeder Methode OpenMachineConfiguration. Über die Eigenschaft Sections lassen sich dann alleSektionen abrufen bzw. über GetSection eine bestimmte Sektion laden.

    Listing 59 zeigt ein Beispiel, bei dem die Namen aller Sektionen in einer Listbox aufgeführtund alle definierten Datenbankverbindungen gelesen und in einer Tabelle dargestellt werden.Das Ergebnis ist in Abbildung 23 zu sehen.

    ' Werte abrufenLabel1.Text = bi.TitleLabel2.Text = bi.Publisher

    ' Wert aus My.Settings lesenMe.Text = My.Settings.Applicationname

    Ach

    tung Beachten Sie bitte, dass in Konfigurationsdateien zwischen Groß- und Kleinschrift

    unterschieden wird. Alle Tag- und Attributnamen müssen korrekt geschrieben werden,damit die beschriebene Vorgehensweise zum Erfolg führt.

    ' Öffnen der machine.config-DateiDim config As Configuration = _ ConfigurationManager.OpenMachineConfiguration()

    Listing 59: Lesen von Informationen aus machine.config

    Listing 58: Laden der zusätzlichen Sektion (Forts.)

  • >> Anwendungen 131

    Anw

    endu

    ngen

    Abbildung 23: Darstellen der aus der machine.config gelesenen Daten

    ' Alle Sektionen durchlaufen und Namen ausgebenFor Each section As ConfigurationSection In config.Sections ListBox1.Items.Add(section.SectionInformation.Name)Next

    ' Connection-String-Sektion ermittelnDim csc As ConnectionStringsSection = CType(config.GetSection _ ("connectionStrings"), ConnectionStringsSection)

    ' Auflistung der Connection-Strings durchlaufenFor Each connStrSetting As ConnectionStringSettings _ In csc.ConnectionStrings

    ' Name des Connection-Strings Dim lvi As ListViewItem = _ ListView1.Items.Add(connStrSetting.Name)

    ' Datenbank-Provider lvi.SubItems.Add(connStrSetting.ProviderName)

    ' Verbindungs-String lvi.SubItems.Add(connStrSetting.ConnectionString)

    Next

    Listing 59: Lesen von Informationen aus machine.config (Forts.)

  • >> Neue Anwendungseinstellungen132An

    wen

    dung

    en

    52 Neue AnwendungseinstellungenÜber die Anwendungskonfigurationsseite lassen sich einige Einstellungen vornehmen, diezuvor nur mit zusätzlichem Aufwand zu realisieren waren. Erwähnung sollen hierbei insbe-sondere die drei in Abbildung 24 markierten Eigenschaften finden.

    Wird das Häkchen für Visuelle XP-Stile aktivieren gesetzt, dann können einige der Controlsim Look von Windows XP dargestellt werden, sofern sie unter XP oder Windows 2003 Serververwendet werden. Dieses Häkchen ersetzt den früher notwendigen Aufruf von Applica-tion.EnableVisualStyles.

    Abbildung 24: Neue Konfigurationseinstellungen vereinfachen die Programmierung.

    Setzt man das Häkchen für Einzelinstanzanwendung erstellen, dann kann die Anwendungnicht erneut gestartet werden, wenn eine andere Instanz bereits läuft. Die schon gestarteteInstanz erhält dann automatisch den Fokus. Durch dieses kleine Häkchen wird das Rezept 53des alten Codebooks überflüssig, in dem auf drei Seiten der Einsatz eines systemweiten Mutex-Objektes für diesen Zweck erläutert wurde.

    Das dritte Häkchen steuert, ob geänderte Konfigurationseinstellungen automatisch gespeichertwerden, wenn das Programm beendet wird. Ist dies nicht erwünscht, kann die Speicherungjedoch jederzeit mittels My.Settings.Save per Programm vorgenommen werden.

    53 Zentrales Exception-HandlingEs gibt Situationen, in denen man eventuell auftretende Exceptions nicht durch Try-/Catch-Blöcke abfangen kann oder will. Dazu gehören z.B. automatisch beim Databinding ausgelösteAusnahmen, die auftreten können, ohne dass sie im eigenen Code abgefangen werden könn-ten. Auch gibt es oft organisatorische oder andere Gründe, eine zentrale Ausnahmebehand-lung vorzusehen.

  • >> Anwendungen 133

    Anw

    endu

    ngen

    Den Aufruf von Application.Run in einem Try-Block zu platzieren ist wenig sinnvoll. Zwarwürde jede nicht behandelte Ausnahme zu einem Aufruf des zugeordneten Catch-Blockes füh-ren, die Ausführung von Application.Run und somit der gesamten Fensterkonstruktion wäreaber damit beendet. Diese Variante eignet sich höchsten für die Ausgabe einer Fazit-Meldungwie »Dieser Absturz wurde Ihnen präsentiert von . . . «.

    Für jeden Thread können Sie jedoch eine zentrale Ausnahmebehandlung vorsehen, indem Sieeinen Handler an das Ereignis Application.ThreadException anhängen. Eine nicht behandelteAusnahme führt dann zum Aufruf dieses Handlers. Die Anbindung des Handlers muss aller-dings erfolgen, bevor Application.Run aufgerufen wird. Listing 60 zeigt die übliche Vorge-hensweise, bei der in Sub Main erst der Handler registriert und anschließend das Hauptfensterangezeigt wird.

    Wie Sie den Handler gestalten, bleibt Ihnen überlassen. Die in Listing 61 gezeigte Ausführungdient nur zur Demonstration (siehe auch Abbildung 25). Natürlich müssen die Fehler, die hiergemeldet werden, sinnvoll bearbeitet werden. Je nach Art des Fehlers kann es durchaus sinn-

    Public Shared Sub Main()

    ' Instanz des Hauptfensters anlegen Dim mw As New MainWindow

    ' Zentraler Error-Handler ist Member-Funktion des Hauptfensters AddHandler Application.ThreadException, _ AddressOf mw.CentralExceptionHandler

    ' Hauptfenster anzeigen Application.Run(mw)

    End Sub

    Listing 60: Binden eines Event-Handlers zum zentralen Exception-Handling

    Private Sub CentralExceptionHandler(ByVal sender As Object, _ ByVal e As System.Threading.ThreadExceptionEventArgs)

    ' Meldung zusammensetzen und ausgeben Dim sw As New System.io.StringWriter sw.Write("Hier könnte jetzt die zentrale Auswertung für ") sw.WriteLine("die Exception") sw.Write(">") sw.WriteLine("vorgenommen werden") sw.Close() MessageBox.Show(sw.ToString(), "Zentrale Fehlerbehandlung")

    End Sub

    Listing 61: Beispielimplementierung eines zentralen Error-Handlers

  • >> Zentrales Exception-Handling134An

    wen

    dung

    en

    voll sein, das Programm zu beenden. Der Vorteil des zentralen Handlers liegt jedoch darin,dass trotz nicht abgefangener Ausnahmen das Programm fortgesetzt werden kann, sofern derFehler für Ihren Code nicht kritisch oder behebbar ist.

    Abbildung 25: Nicht abgefangene Exceptions werden im zentralen Handler bearbeitet.

    Ach

    tung Das Verhalten des Debuggers von Visual Studio hat sich geändert. Exceptions, die auf

    die beschriebene Weise abgefangen werden, führen auch im Debugger zur Fehlerbe-handlung. Starten Sie das Beispielprogramm ohne Debugger, um das gezeigte Ergebniszu erhalten.

    Das Visual Basic 2008 CodebookTeil II RezepteAnwendungen48 Anwendungskonfiguration mit Visual Studio erstellen49 Konfiguration für Datenbankverbindung speichern (mit und ohne Verschlüsselung)Daten verschlüsseln

    50 Zusätzliche Sektionen in der Konfigurationsdatei einrichten51 Lesen der Konfigurationsdatei machine.config52 Neue Anwendungseinstellungen53 Zentrales Exception-Handling

    Ins Internet: Weitere Infos zum Buch, Downloads, etc.


Recommended