843
Das VB.NET Codebook

VB.NET Codebook

  • Upload
    lydiep

  • View
    431

  • Download
    15

Embed Size (px)

Citation preview

  • Das VB.NET Codebook

  • An imprint of Pearson EducationMnchen Boston San Francisco Harlow, England

    Don Mills, Ontario Sydney Mexico CityMadrid Amsterdam

    Das VB.NET Codebook

    J. Fuchs. A. Barchfeld

    Copyright-Hinweis Addison-Wesley VerlagCopyrightDaten, Texte, Design und Grafiken dieses eBooks, sowie die eventuell angebotenen eBook-Zusatzdaten sind urheberrechtlich geschtzt. Dieses eBook stellen wir lediglich als persnliche Einzelplatz-Lizenz zur Verfgung!Jede andere Verwendung dieses eBooks oder zugehriger Materialien und Informationen, einschliesslich der Reproduktion, der Weitergabe, des Weitervertriebs, der Platzierung im Internet, in Intranets, in Extranets, der Vernderung, des Weiterverkaufs und der Verffentlichung bedarf der schriftlichen Genehmigung des Verlags.Bei Fragen zu diesem Thema wenden Sie sich bitte an: [email protected]

    ZusatzdatenMglicherweise liegt dem gedruckten Buch eine CD-ROM mit Zusatzdaten bei. Die Zurverfgungstellung dieser Daten auf unseren Websites ist eine freiwillige Leistung des Verlags. Der Rechtsweg ist ausgeschlossen.

  • Bibliografische Information Der Deutschen Bibliothek

    Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet ber abrufbar.

    Die Informationen in diesem Produkt werden ohne Rcksicht auf einen eventuellen Patentschutz verffentlicht. Warennamen werden ohne Gewhrleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit grter Sorgfalt vorgegangen. Trotzdem knnen Fehler nicht vollstndig ausgeschlossen werden. Verlag, Heraus-geber und Autoren knnen fr fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung bernehmen.Fr Verbesserungsvorschlge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar.

    Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulssig.

    Falls alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwhnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden.

    Umwelthinweis:Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt.

    10 9 8 7 6 5 4 3 2 106 05 04

    ISBN 3-8273-2007-1

    2004 by Addison-Wesley Verlag,ein Imprint der Pearson Education Deutschland GmbHMartin-Kollar-Strae 1012, D-81829 Mnchen/GermanyAlle Rechte vorbehalten

    Korrektorat: G & U Technische Dokumentation GmbH, FlensburgLektorat: Frank Eller, [email protected]: Monika Weiher, [email protected]: reemers publishing services gmbh, Krefeld gesetzt aus der MinionUmschlaggestaltung: Marco Lindenbeck, [email protected] und Verarbeitung: Ksel, Kempten (www.Koeselbuch.de)

    Printed in Germany

  • Inhaltsverzeichnis

    Teil I Einfhrung 13

    Vorwort 151 Die Autoren 162 Homepage fr dieses Buch 16

    Einleitung 173 Von gestern bis heute 174 Was sich mit Visual Basic .NET realisieren lsst und was nicht 195 Inhalt des Buches 19

    Teil II Rezepte 31

    Basics 331 Zahlen-, Zeichen- und String-Literale 332 Ganzzahlen dual, oktal oder hexadezimal darstellen 353 String mit dualer, oktaler oder hexadezimaler Darstellung in Zahlenwert wandeln 354 Zahlenwerte formatieren 355 Positive und negative Zahlen unterschiedlich formatieren 366 Zusammengesetzte Formatierungen 377 Format-Provider fr eigene Klassen definieren 388 Ausgaben in lnderspezifischen Formaten 399 Informationen zu lnderspezifischen Einstellungen abrufen 4110 Grter und kleinster Wert eines numerischen Datentyps 4411 Berechnen der signifikanten Vorkommastellen 4512 Lange einzeilige Texte umbrechen 4713 Zahlenwerte kaufmnnisch runden 4814 berprfen, ob ein Bit in einem Integer-Wert gesetzt ist 4915 Bit in einem Integer-Wert setzen 5016 Bit in einem Integer-Wert lschen 5117 Bit in einem Integer-Wert einen bestimmten Zustand zuweisen 5118 Bit in einem Integer-Wert umschalten (togglen) 5219 Boolean-Array aus Bit-Informationen eines Integer-Wertes erzeugen 5220 Integer-Wert aus Bit-Informationen eines Boolean-Arrays zusammensetzen 5321 Gesetzte Bits eines Integer-Wertes abfragen 5422 Nicht gesetzte Bits eines Integer-Wertes abfragen 5523 Konvertierungen zwischen 8-Bit, 16-Bit, 32-Bit und 64-Bit Datentypen 5624 Basistyp fr Enumeration festlegen 5925 Enum-Werte ein- und ausgeben 6026 Bezeichner und Werte eines Enum-Typs abfragen 6227 Prfen, ob ein Zahlenwert als Konstante in einer Enumeration definiert ist 6328 Prfen, ob ein bestimmter Enumerationswert in einer Kombination

    von Werten vorkommt 6329 Objekte eigener Klassen vergleichbar und sortierbar machen 6430 Binre Suche in Arrays und Auflistungen 67

  • 6 Inhaltsverzeichnis

    31 Strings in Byte-Arrays konvertieren und vice versa 6932 Ersatz fr unvernderliche (konstante) Zeichenketten-Arrays 71

    Datum und Zeit 7333 Umgang mit Datum und Uhrzeit 7334 Schaltjahre 7535 Wochentag berechnen 7636 Beginn einer Kalenderwoche berechnen 7637 Anzahl der Kalenderwochen eines Jahres bestimmen 7738 Berechnung der Kalenderwoche zu einem vorgegebenen Datum 7839 Berechnung des Osterdatums 8040 Berechnung der deutschen Feiertage 8141 Darstellung der Feiertage im Kalender-Steuerelement 9342 Gregorianisches Datum in Julianische Tageszhlung 9543 Julianische Tageszhlung in Gregorianisches Datum 9744 Datum und Uhrzeit im ISO 8601-Format ausgeben und einlesen 99

    Anwendungen 10345 Anwendungskonfigurationsdatei erstellen und bearbeiten 10346 Globale Werte aus der .config-Datei lesen 10447 Zustzliche Konfigurationsdatei-Sektionen mit Attributwerten lesen 10548 Zustzliche Konfigurationsdatei-Sektionen mit Key/Value-Eintrgen lesen 10649 Knoten beliebiger Struktur aus einer Konfigurationsdatei lesen 10750 Konfigurationsdatei zur Laufzeit ndern 11051 Eine eigene Konfigurationsdatei fr Ihre Anwendung 11052 Konfigurationsmanager und -daten trennen 11653 Verhindern, dass mehrere Instanzen einer Anwendung gleichzeitig

    gestartet werden knnen 12154 Zentrales Exception-Handling 124

    GDI+ Zeichnen 12755 Outline-Schrift erzeugen 12756 Text im Kreis ausgeben und rotieren lassen 12857 Schriftzug mit Hintergrundbild fllen 13358 Transparente Schriftzge ber ein Bild zeichnen 13659 Blockschrift fr markante Schriftzge 13860 Text mit versetztem Schatten zeichnen 14061 Schriftzug perspektivisch verzerren 14262 Font-Metrics zur exakten Positionierung von Schriftzgen ermitteln 14463 Schatten durch Matrix-Operationen erzeugen 14764 Rechtecke mit abgerundeten Ecken zeichnen 15065 3D-Schriften erzeugen 15266 3D- und Beleuchtungseffekte auf strukturierten Hintergrundbildern 154

    GDI+ Bildbearbeitung 15967 Bilder zeichnen 15968 Bildausschnitt zoomen 16269 Basisklasse fr eine Dia-Show 16670 Horizontal und vertikal berblenden 17171 Diagonal berblenden 17772 Elliptische berblendung 179

  • Inhaltsverzeichnis 7

    73 berblendung durch zufllige Mosaik-Muster 18174 berblendung durch Transparenz 18375 Bilder verzerrungsfrei maximieren 18676 Blockierung der Bilddatei verhindern 19177 Ordnerauswahl mit Miniaturenansicht der enthaltenen Bilder 19178 Drehen und Spiegeln von Bildern 20579 Encoder fr verschiedene Dateiformate zum Speichern von Bildern ermitteln 20780 Bilder im JPEG-Format abspeichern 20881 Bilder im GIF-Format speichern 20982 Thumbnails fr Web-Seiten erstellen 21083 Invertieren eines Bildes 21284 Farbbild in Graustufenbild wandeln 21385 Weitere Bildmanipulationen mit Hilfe der ColorMatrix 21586 Bitmapdaten in ein Array kopieren 21687 Array in Bitmap kopieren 21788 Allgemeiner Schrfefilter 21989 Schrfe nach Gauss 22290 Schrfe mittels Sobel-Filter 22491 Schrfe mittels Laplace-Filter 22592 Der Boxcar Unschrfefilter 22693 Adaptive Schrfe 227

    Windows Forms 22994 Fenster ohne Titelleiste anzeigen 22995 Fenster ohne Titelleiste verschieben 22996 Halbtransparente Fenster 23197 Unregelmige Fenster und andere Transparenzeffekte 23298 Startbildschirm 23499 Dialoge kapseln 238100 Gekapselter Dialog mit bernehmen-Schaltflche 243101 Dialog-Basisklasse 245102 Validierung der Benutzereingaben 249103 Screenshots erstellen 254104 TextViewer-Klasse 259105 RTFTextViewer-Klasse 261106 PictureViewer-Klasse 263107 HTML-Viewer 266108 Drag&Drop-Operationen aus anderen Anwendungen ermglichen 269109 Analyseprogramm fr Drag&Drop-Operationen aus anderen Anwendungen 271110 Anzeigen von Daten aus der Zwischenablage 277111 Exportieren von Daten ber die Zwischenablage 278112 Exportieren von Daten ber Drag&Drop 280113 Windows XP Darstellungsformate nutzen 282114 Eingabetaste in TextBox abfangen 284115 Pfade so krzen, dass sie in den verfgbaren Bereich passen 286

    Windows Controls 293116 Ersatz fr VB6-Control-Arrays 293117 ListBox-Items selber zeichnen 296118 Mehrspaltige DropDown-Liste (ComboBox) 299119 Basisklassen fr selbst definierte Steuerelemente 302

  • 8 Inhaltsverzeichnis

    120 ComboBox mit Auto-Vervollstndigen-Funktion 303121 Benutzersteuerelement als Container fr andere Steuerelemente 304122 Scroll-Balken eines Benutzersteuerelementes im Design-Mode verfgbar machen 305123 Benutzersteuerelemente und die Text-Eigenschaft 305124 PanelGroupPictureBox ein Steuerelement fr alle Flle 306125 Einem Benutzersteuerelement ein Icon zuweisen 312126 Transparenz eines Steuerelementes im Designer einstellen 313127 Abfangen von Windows-Nachrichten 313128 Steuerelement fr Verzeichnisauswahl 319129 Ein Windows-Explorer-Steuerelement im Eigenbau 330130 ListView des Explorer-Steuerelementes sortieren 334131 FolderBrowser-Steuerelement mit zustzlichen CheckBoxen zum

    Aufbau von Verzeichnislisten 341132 Benutzerdefinierte Steuerelemente mit nicht rechteckigem Umriss 351133 Mausposition in kreisfrmigen Steuerelementen in Winkel umrechnen 353134 Maus-Ereignisse zur Entwurfszeit abfangen 356135 Ein Steuerelement zur grafischen Anzeige von Zeitbereichen programmieren 358136 Neue Zeitscheiben zur Laufzeit mit der Maus hinzufgen 368137 Nachrichten verschicken mit SendMessage 372138 Zeilen ermitteln, wie sie in einer mehrzeiligen TextBox dargestellt werden 373139 Anzahl der Zeilen einer mehrzeiligen TextBox ermitteln 375140 Zeilenindex aus Zeichenindex ermitteln (mehrzeilige TextBox) 376141 Index des ersten Zeichens einer Zeile ermitteln (mehrzeilige TextBox) 377142 Index der ersten sichtbaren Zeile einer mehrzeiligen TextBox bestimmen 377143 Zeichenindex aus Grafikkoordinaten berechnen (mehrzeilige TextBox) 378144 Koordinate eines Zeichens ermitteln (mehrzeilige TextBox) 379145 Mehrzeilige TextBox per Code auf- und abwrts scrollen 380146 Tabulatorpositionen in einer mehrzeiligen TextBox setzen 381

    Eigenschaftsfenster (PropertyGrid) 383147 Grundlegende Attribute 383148 Eigenschaften mehrerer Objekte gleichzeitig anzeigen 388149 Abfangen ungltiger Werte 389150 Standardwerte fr Eigenschaften 390151 Festlegen einer Standard-Eigenschaft 391152 Eigenschaften gegen Vernderungen im PropertyGrid-Control schtzen 391153 Enumerationswerte kombinieren 392154 Geschachtelte expandierbare Eigenschaften 393155 DropDown-Liste mit Standardwerten fr Texteigenschaften 397156 Visualisierung von Eigenschaftswerten mit Miniaturbildern 399157 Einen eigenen DropDown-Editor anzeigen 401158 Eigenschaften ber einen modalen Dialog bearbeiten 405159 Datei ffnen-Dialog fr Eigenschaften bereitstellen 410160 Auflistungen anzeigen und bearbeiten 411161 Aktionen ber Hyperlink-Tasten anbieten 419162 Eigenschaften dynamisch erstellen und hinzufgen 423163 Eigenschaften in unterschiedlichen Sprachen anzeigen (Lokalisierung) 431164 Neue Tab-Flchen hinzufgen 434

  • Inhaltsverzeichnis 9

    Dateisystem 439165 System-Verzeichnisse mit .NET 439166 Anwendungs-/Bibliotheksname des laufenden Prozesses 442167 Existenz eines Verzeichnisses 443168 Verzeichnis erstellen 445169 Verzeichnis lschen 446170 Verzeichnis umbenennen/verschieben 446171 Verzeichnis kopieren 448172 Verzeichnisgre mit Unterverzeichnissen 450173 Existenz einer bestimmten Datei 453174 8.3 Dateinamen 454175 Datei umbenennen/verschieben 456176 Datei kopieren 457177 Dateiversion feststellen 458178 Dateigre 460179 Dateivergleich 462180 Temporre Dateinamen 464181 Datei in mehreren Verzeichnissen suchen am Beispiel der Verzeichnisse von PATH 466182 Dateiinformationen mit File System Object 468183 Laufwerksinformationen mit FSO 470184 Delimited-Dateien nach XML transformieren 472185 berwachung des Dateisystems 475186 Datei-Attribute 478187 Bestandteile eines Pfads ermitteln 482188 Absolute und gekrzte (kanonische) Pfade ermitteln 483189 Relativen Pfad ermitteln 484190 Icons und Typ einer Datei ermitteln 486191 Dateien kopieren, verschieben, umbenennen und lschen mit SHFileOperation 490

    Netzwerk 501192 IPv4-Adressen nach IPv6 umrechnen 501193 IPv6-Adressen nach IPv4 umrechnen 503194 IP-Adresse eines Rechners 504195 Netzwerkadapter auflisten 506196 Freigegebene Laufwerke anzeigen 508197 Web-Service 510198 Internet Explorer starten 513

    System 515199 WMI-Namensrume 515200 WMI-Klassen 516201 Ist WMI installiert? 517202 BIOS-Informationen 518203 Computer-Modell 523204 Letzter Boot-Status 524205 Sommer-/Winterzeit 525206 Computerdomne 525207 Domnenrolle 526208 Benutzername 527209 Monitorauflsung 529210 Der Monitor-Typ 529

  • 10 Inhaltsverzeichnis

    211 Auflsung in Zoll 530212 Logische Laufwerke mit WMI 531213 Physikalische Platten 536214 Installierte Programme 539215 Programm ber Namen starten 542216 Programm ber Datei starten 543217 Parameterbergabe per Befehlszeile 544218 Systemprozesse mit WMI 546219 Systemprozesse mit .System.Diagnostics 549220 Liste aller Dienste 553221 Dienst starten 554222 Dienst anhalten 557223 Dienst fortsetzen 559224 Dienst stoppen 560225 Prozess abbrechen (killen) 561226 Leistungsberwachung/Performance Counter 563227 Registry-Eintrge abfragen 566228 Registry-ey anlegen 568229 Registry-Key lschen 569230 Informationen zum installierten Betriebssystem 570231 Prozessorgeschwindigkeit 575232 Prozessorauslastung 577233 Bitbreite des Prozessors 577234 Prozessor-Informationen 578235 SMTP eMail 578236 Fax senden 580237 Logon-Sessions mit XP 581

    Datenbanken 583238 Erreichbare SQL-Server 584239 Default-Anmeldung am SQL-Server 585240 NT-Security-Anmeldung am SQL-Server 587241 SQL-Server-Anmeldung 587242 Datenbanken eines Servers 588243 Datenbank festlegen 589244 Tabellen einer Datenbank 589245 Felder einer Tabelle 590246 Einfaches Backup einer Datenbank 590247 Einfaches Zurcksichern einer Datenbank 591248 Erstellen eines Backup-Devices 592249 Datensicherung auf ein Backup-Device 594250 Liste der Backup-Devices 596251 Rcksicherung von einem Backup-Device 597252 Erstellen einer Datenbank 599253 Erstellen eines T-SQL-Datenbank-Skriptes 601254 Erstellen eines Jobauftrages 604255 Auflistung der vorhandenen Jobauftrge 608256 Tabellenindizes 610257 Bilder in Tabellen abspeichern 612258 Datagrid fllen 614259 MDAC-Version ermitteln 616260 Excel als Datenbank abfragen 617

  • Inhaltsverzeichnis 11

    XML 621261 Schreiben von XML-Dateien mit dem XmlTextWriter 621262 Lesen von XML-Dateien mit dem XmlTextReader 625263 Bilder und andere Binrdaten in XML-Dateien speichern 629264 Bilder und andere Binrdaten aus XML-Dateien lesen 632265 XML-Dateien lesen mit XmlDocument 633266 Hinzufgen, Entfernen und ndern von Knoten mit XmlDocument 636267 XmlDocument mit XPath-Ausdrcken durchsuchen 638268 XPath-Abfragen und XML-Namespaces 643269 Schnellere Suche mit XPathDocument und XPathNavigator 646270 XmlView-Steuerelement zur strukturierten Darstellung von XML-Dateien 650271 Nachrichten aus RSS-Kanlen aufbereiten 657272 Das Wichtigste der Tagesschau im UserControl 664273 XML-Dateien validieren 668274 XSL-Transformationen 674275 XSL-Transformation mit Parametern 677276 Einer XSL-Transformation zustzliche Funktionen bereitstellen 678277 Parallelbetrieb von XmlDataDocument und DataSet 681278 Klassenhierarchie aus XML-Schema erzeugen 684279 Serialisierung mit Hilfe der Klasse XmlSerializer 685280 Unbekannte XML-Inhalte bei der Deserialisierung mit dem XmlSerializer 691281 Serialisierung mit Hilfe der Klasse SoapFormatter 692

    Wissenschaftliche Berechnungen und Kurvendiagramme 697282 Gleitkommazahlen vergleichen 697283 Typsichere Maeinheiten 699284 Definition von Lngenmaen 706285 Definition von Flchenmaen 708286 Definition von Geschwindigkeiten 710287 Definition von Zeiten 712288 Definition von Temperaturen 713289 Universeller Umrechner fr Maeinheiten 716290 Schnittstelle fr Datenquellen mit typsicheren physikalischen Werten 721291 Skalierung fr Diagramme berechnen 723292 Einfaches T-Y-Diagramm mit statischen Werten 727293 Kontinuierliches T-Y-Diagramm mit dynamischen Werten 741294 Die Zahl p 748

    Verschiedenes 751295 Sound abspielen ber API-Funktionen 751296 Sound abspielen ber DirectX 753297 Trace- und Debug-Ausgaben ber Config-Datei steuern 755298 Debug- und Trace-Ausgaben an eine TextBox weiterleiten 757299 Debug- und Trace-Ausgaben in einer Datei speichern 759300 Debug- und Trace-Ausgaben an das Eventlog weiterleiten 761301 Eigene EventLogs fr die Ereignisanzeige anlegen und beschreiben 762302 EventLog berwachen und lesen 765303 Leistungsindikatoren anlegen und mit Daten versorgen 766304 Zeiten mit hoher Auflsung messen 771305 API-Fehlermeldungen aufbereiten 773

  • 12 Inhaltsverzeichnis

    Teil III Anhang 775

    Visual Basic .NET 7771 Klassen Referenzen Objekte 7772 Strukturen (Wertetypen) 7793 (Instanz-)Methoden 7804 Statische Methoden und statische Variablen 7815 Module 7826 Eigenschaften (Properties) 7837 Vererbung 7848 Arrays 7899 Listen 79810 CLS-Kompatibilitt 803

    Visual Studio 80511 Texte in der Toolbox zwischenspeichern 80512 Standard-Einstellungen fr Option Strict 80513 Projektweite Imports-Einstellungen 80614 Steuerelemente und Fensterklasse im Entwurfsmodus debuggen 80715 Verknpfung einer Datei einem Projekt hinzufgen 80916 Dokumentgliederung anzeigen und nutzen 80917 Tabellenansicht einer XML-Datei 80918 XML-Schema fr vorhandene XML-Datei erstellen und bearbeiten 81119 Navigation ber die Klassenansicht 811

    Internetquellen 81320 Websites zu .NET 81321 Newsgroups 81422 Recherche mit Google 816

    Grundlagen weiterer Technologien 81923 Kurzer berblick ber WMI 81924 XML DOM-Grundlagen 822

    API-Funktionen 825

    Stichwortverzeichnis 831

  • TEIL IEinfhrung

  • Vorwort

    Mit .NET hat Microsoft eine umfassende und richtungsweisende Plattform fr die Programmie-rung von Anwendungssystemen geschaffen. Die Realisierung komplexer Aufgaben wird durch.NET erheblich vereinfacht und vereinheitlicht. Eine umfangreiche Klassenbibliothek in Formeines Frameworks bietet vielfltige Mglichkeiten, die von verschiedenen Programmiersprachengleichermaen genutzt werden knnen. Um auch mit Visual Basic von diesen MglichkeitenGebrauch machen zu knnen, musste die Sprache grundlegend gendert werden.

    Daher ist der Umstieg von Visual Basic 6 nach Visual Basic .NET gewaltig. Geblieben ist ein Teilder Syntax, hinzugekommen der Zwang zur Objektorientierten Programmierung und die Verfg-barkeit eines komplexen, fast unberschaubaren Frameworks, das die meisten Aufgabenbereicheabdeckt. Um die Vorteile von .NET nutzen zu knnen, ist eine intensive Beschftigung mit dem.NET Framework unumgnglich.

    Das Erlernen der Objektorientierten Programmierung knnen wir Ihnen nicht abnehmen.Hierzu gibt es inzwischen umfangreiche Literatur. Aber den tglichen Umgang mit dem Frame-work wollen wir Ihnen in praxisorientierten Rezepten nher bringen. Beginnend mit einfachenBeispielen zu grundlegenden Formatierungen und Umrechnungen bis hin zu komplexen Techni-ken wie WMI, XML und professionellen Steuerelementen deckt das Buch ein breites Spektrum anFachgebieten ab.

    Trotz der groen Komplexitt des .NET Frameworks bietet es zurzeit noch nicht alle Details, dieSie bisher mit Windows-Anwendungen realisieren konnten. Auch hier zeigen wir anhand einigerBeispiele auf, wie fehlende Funktionalitten im Framework durch andere Techniken ergnzt wer-den knnen.

    Aus den Praxiserfahrungen im Umgang mit .NET, die wir seit dem Erscheinen der Beta-Version2001 gesammelt haben, ist dieses Buch entstanden. Die einzelnen Rezepte spiegeln Lsungen froft gestellte Fragestellungen wider. Neben der einfachen Anwendung der Rezepte knnen dieseauch als Einstiegspunkt fr eine tiefer gehende Auseinandersetzung mit neuen Technologien die-nen.

    Unsere Rezepte bestehen nicht nur aus kommentierten Quelltexten, sondern auch aus detaillier-ten Erluterungen zur Aufgabenstellung und deren Lsung. So lassen sie sich auch auf hnlicheAufgabenstellungen bertragen. Soweit es der Umfang des Buches gestattet, gehen wir im Anhangauch auf weniger bekannte Technologien ein. Die Quelltexte lassen sich schnell mit Hilfe des aufder CD enthaltenen Code-Repositories in eigene Projekte bernehmen. Ergnzend finden Sie alleProjekte zu den einzelnen Rezepten auf der Buch-CD.

    Dieses Buch ersetzt in vielen Fllen umfangreiche Recherchen in der Online-Hilfe und/oder imInternet. Informationen, die sonst nur sehr verstreut zu finden sind, werden in verschiedenenThemengruppen zusammengefasst. Dadurch bleibt Ihnen in vielen Fllen eine zeitaufwndigeSuche erspart.

    Wir danken unseren Frauen fr ihr Verstndnis und fr ihre Geduld mit uns whrend der Erstel-lung dieses Buches. Auch danken wir unserem Lektor, Frank Eller, fr seine Untersttzung.

  • 16 Vorwort

    1 Die AutorenDr. Joachim Fuchs ist selbstndiger Softwareentwickler und Dozent, seit 2001 mit dem Schwer-punkt Softwareentwicklung mit .NET. Sein umfangreiches Wissen gibt er unter anderem inSeminaren, in den Microsoft Newsgroups und in Form von Fachartikeln weiter. Sie erreichen ihnber seine Homepage http://www.fuechse-online.de/beruflich/index.html.

    Andreas Barchfeld ist IT-Leiter in einem Hamburger Krankenhaus und verfgt ber mehrereJahre Erfahrung als System- und Organisationsprogrammierer im Bereich Windows und Unix. Erbeschftigt sich seit dem Erscheinen der .NET-Beta-Version mit diesem Programmierumfeld.Seine Schwerpunkte in diesem Bereich liegen bei VB, C++ und Datenbanken.

    2 Homepage fr dieses Buchnoch nicht geklrt.

    Entweder

    http://www.fuechse-online.de/vbcodebook/index.html

    oder

    www.vbcodebook.de

    oder

    www.vbcodebook.com

  • Einleitung

    3 Von gestern bis heuteEin kleiner historischer Rckblick soll die Entstehungsgeschichte und die Ziele von Visual Basic.NET erlutern. Keine Angst, wir gehen hier nicht ins Detail, sondern skizzieren nur dieUmstnde und Intentionen der Entwickler von Basic, Visual Basic und Visual Basic.NET.

    10 LET A=4So oder hnlich kennen viele noch die ersten Basic-Programme. Auf Kleincomputern von Sinclair,Apple, Commodore usw. gab es bereits Ende der 70er die ersten Basic-Interpreter. Basic war einesimple Programmiersprache, die jeder verstehen konnte und die alles Notwendige fr den bli-chen Bedarf mitbrachte. Whrend Fortran, Cobol etc. vorwiegend auf Grorechnern zu findenwaren, gehrten Basic-Interpreter bald zur Standardausrstung der Homecomputer.

    Mit der unaufhaltsamen Weiterentwicklung hherer Programmiersprachen wie C, C++, Pascalund vielen anderen geriet Basic immer mehr in Vergessenheit, konnte man doch mit den neuerenSprachen wesentlich eleganter und sauberer programmieren als mit dem blichen Basic-Spa-ghetti-Code.

    On Error GotoAls Microsoft begann, mit Windows das Betriebssystem mit einer grafischen Oberflche auszu-statten, war man der festen berzeugung, dass die Zukunft der Programmierung mit der SpracheC fest verbunden sei. Windows selbst ist zum grten Teil in Standard-C programmiert worden.Auch die ersten Anwendungsprogramme wurden in C geschrieben.

    Bald stellte sich heraus, dass C fr Windows-Programme, die hauptschlich ereignisgesteuertsind, zu umstndlich war. So kam der Umstieg auf C++, um wenigstens die oft bentigten Vorge-hensweisen in Klassenbibliotheken bereitstellen zu knnen. Aber auch der Umgang mit den(anfangs sehr vielen) Klassenbibliotheken war alles andere als einfach und hielt viele Program-mierer davon ab, Windows-Programme zu entwickeln.

    Bentigt wurde eine einfache Sprache mit einer integrierten Entwicklungsumgebung, die allesbereithlt, um mal eben ein Fenster mit ein paar Steuerelementen anzulegen. So wurde VisualBasic ins Leben gerufen. Basic als zugrunde liegende einfache Programmiersprache, verbundenmit einer (zumindest spter) komfortablen Entwicklungsumgebung. Schon die Version 3 konnteviele Anwendungsflle abdecken, die bis dahin eine Domne der C-Programmierung waren.

    Was in VB fehlte, konnte man ber den direkten Aufruf von API-Funktionen ergnzen. VB selbstwurde stndig weiterentwickelt. Ab Version 4 kamen erste objektorientierte Anstze hinzu, die lei-der auch in der Version 6 noch lange nicht vervollstndigt worden sind. Der erste Ansatz, mitKomponenten in Form von VBX-Dateien Visual Basic erweiterbar zu machen, wurde bald wiedereingestellt und durch COM (Component Object Model) ersetzt (und spter in ActiveX umbe-nannt ;-)).

    Mit COM war der erste Schritt zu einem Baukastensystem in Form von beliebig zusammenstell-baren Komponenten getan. Mit VB erstellte Komponenten lassen sich auch heute noch in anderenProgrammen verwenden.

  • 18 Einleitung

    Bei den Office-Produkten wurde Visual Basic for Applications (VBA) zum Standard fr die Auto-matisierung. Durch die Verbreitung von VBA hat Visual Basic noch mehr an Bedeutung gewon-nen.

    Try Catch FinallyMit .NET hat Microsoft nun endlich eine umfangreiche sprachbergreifende Plattform geschaf-fen, die universell fr fast alle Bereiche der Softwareentwicklung einsetzbar ist. Aus den Erfahrun-gen, die bislang bei der Programmierung mit C++, VB und Java gesammelt wurden, entstandendie Bausteine des .NET-Konzeptes.

    Alle Programmiersprachen arbeiten mit demselben Typsystem. Definitionen wie CLS (CommonLanguage Specification), CLR (Common Language Runtime), CTS (Common Type System) unddie allen Sprachen gemeinsame Kompilierung in einen von JIT (Just In Time)-Compilern aufdem jeweiligen Zielsystem bersetzten Zwischencode (MSIL Microsoft Intermediate Language)sorgt fr flexible Austauschbarkeit von Komponenten. Klassen, die in einer VB.NET-Klassen-bibliothek abgelegt sind, knnen in einem C#-Programm eingebunden, benutzt oder gar durchVererbung erweitert werden und vice versa. Aber auch jede andere Programmiersprache, dieintern auf den Regeln des .NET aufbaut, kann eine so erstellte Bibliothek benutzen (Eiffel.NET,Perl.NET etc.)

    Die Sprachen selbst haben an Bedeutung verloren. Eine Programmiersprache dient lediglich zurUmsetzung von Algorithmen in lauffhige Programme. Das gesamte Umfeld, also die Erzeugungvon Fenstern, die Zugriffe auf Datenbanken, die Zeichenoperationen und vieles mehr sind nichtmehr Bestandteil der Sprache, sondern werden vom Framework, einer gewaltigen Klassenbiblio-thek, bereitgestellt.

    Unglcklicherweise hat man bei den alten VB-Versionen auch versucht, fehlende Funktionalittvon Basic in die Sprache Visual Basic einzubauen. So finden sich auch in VB.NET leider immernoch viele Altlasten in Form von Funktionen, die eigentlich nichts in der Programmiersprache zusuchen haben, sondern in den Aufgabenbereich des Betriebssystems fallen. Der eigentlicheWunsch, den Umsteigern von VB6 nach VB.NET zu helfen, indem man einen Groteil der altenBasic-Funktionen auch unter VB.NET verfgbar macht, schlgt leider allzu oft ins Gegenteil um.Ohne Hilfe ist kaum nachzuvollziehen, ob und wie eine Methode von der Programmierspracheauf das Framework abgebildet wird.

    Whrend der Schritt von C nach C++ hauptschlich darin bestand, auf die Sprache C einenobjektorientierten Ansatz aufzupfropfen, wurde mit VB.NET quasi eine neue Sprache entwickelt,die mit VB6 und den Vorgngern (ab sofort VB Classic genannt) nur noch einen kleinen Teil derSyntax gemein hat. Das Verstndnis der Objektorientierten Programmierung (OOP) ist zwin-gende Voraussetzung fr die Programmierung unter .NET, auch fr VB.NET. Selbst wenn maneinfache Aufgaben mit der prozeduralen Vorgehensweise, wie sie leider bei der VB Classic-Pro-grammierung vorherrschte, auch auf hnliche Weise mit VB.NET erledigen kann, stt man sehrschnell an Grenzen. Die Mglichkeiten des Frameworks lassen sich nur erschlieen, wenn mandie wichtigsten OOP-Konzepte (Klassen Objekte Referenzen, Vererbung, Schnittstellen usw.)beherrscht. Auch wenn viele Rezepte in Form von Funktionen realisiert sind, verstehen sich dieseFunktionen als Bestandteil einer bergeordneten Klasse.

  • Was sich mit Visual Basic .NET realisieren lsst und was nicht 19

    4 Was sich mit Visual Basic .NET realisieren lsst und was nicht

    Da .NET alle Sprachen mit den gleichen Mglichkeiten ausstattet, hat sich das Einsatzgebiet vonVisual Basic .NET gegenber VB Classic erheblich erweitert. Neben Windows-Applikationen undKlassenbibliotheken knnen Sie nun auch mit Visual Basic .NET Web-Anwendungen, WebSer-vices und Konsolenanwendungen programmieren. Sogar Windows-Dienste sind realisierbar.

    Fr Handheld-PCs, die mit dem entsprechenden Framework ausgestattet sind, lsst sich ebenfallsSoftware in Visual Basic .NET entwickeln. Visual Studio bietet fr diese Gerte eine spezielle Test-umgebung an.

    Kein Einsatzgebiet fr .NET-Anwendungen sind Gertetreiber. Diese bleiben nach wie vor eineDomne der C-Programmierung und knnen nicht mit VB.NET realisiert werden.

    Aber auch bei den direkt nutzbaren Features des Betriebssystems hat sich einiges getan. Multi-threading konnte man beispielsweise mit VB6 zwar einsetzen, aber nicht mit der Entwicklungs-umgebung austesten. Das hat sich mit VB.NET gendert.

    Grundstzlich lsst sich mit VB.NET alles realisieren, was Sie auch mit C# realisieren knnen.Aufgrund der syntaktischen Unterschiede der Sprachen lassen sich manche Dinge in der einenoder anderen Sprache eleganter ausdrcken. Unberwindbare Einschrnkungen, wie es sie frherfr VB6 in Bezug auf C++ gab, gibt es bei den .NET-Sprachen nicht mehr.

    5 Inhalt des BuchesWill man ein Buch zu .NET schreiben, stellt sich die Frage, auf welcher Ebene man aufsetzt undwelches Ziel verfolgt werden soll. Wie wir schon im Vorwort erwhnt haben, richtet sich das Buchnicht an VB Classic-Programmierer, die mit .NET noch keine Erfahrung gesammelt haben. Frden Umstieg von VB6 nach VB.NET und den Einstieg in die Objektorientierte Programmierunggibt es bereits umfangreiche Literatur. Die wichtigsten Begriffe rund um die ObjektorientierteProgrammierung mit Visual Basic .NET haben wir im Referenzteil erlutert. Dennoch kann diekurze Zusammenfassung nicht jedes Detail beleuchten und ersetzt nicht die Literatur zum Erler-nen der OOP.

    Ziel des Buches ist es vielmehr, anhand von vielen praxisorientierten Rezepten Vorgehensweisenaufzuzeigen, wie man effektiv mit den Framework-Klassen arbeitet, wie man mit Techniken wieGDI+, XML, ADO.NET, Windows Forms, Windows Controls, WMI usw. umgeht und nichtzuletzt, wie man notfalls auch auf das Windows-API zugreifen kann, wenn die bentigte Funk-tionalitt (noch) nicht im Framework vorhanden ist.

    Diese Rezepte, die Sie direkt im Anschluss an die Einleitung finden, stellen den Hauptteil desBuches dar. In mehrere Kategorien aufgeteilt, haben wir fr Sie ca. 300 Rezepte aus den unter-schiedlichsten Bereichen entwickelt. Ausgewhlt haben wir die Themen und Aufgabenstellungenaus eigenen praktischen Erfahrungen, aus vielen Fragestellungen, die im Rahmen von Seminarenan uns herangetragen worden sind, aus Diskussionen in den Newsgroups und aus den Anregun-gen der zahlreichen Beitrge im Internet.

    Ein Rezept erklrt zunchst eine Aufgabenstellung und zeigt dann eine Lsung, bestehend auskommentierten Listings, Abbildungen und, vor allem, einer Erluterung des Lsungsweges. Zuden meisten Rezepten finden Sie auf der Buch-CD die Visual Studio-Projekte, mit denen wir denCode getestet haben. Die abgedruckten Listings knnen Sie ber das ebenfalls auf der CD befind-liche Repository kopieren. Sie mssen also nichts abtippen.

  • 20 Einleitung

    ZielgruppeDas Buch richtet sich an Anwendungsentwickler, die bereits Erfahrungen mit .NET gesammelthaben. Gute Programmierkenntnisse und Kenntnisse der Objektorientierten Programmierungwerden bei der Erluterung der Rezepte vorausgesetzt. Natrlich sind alle Quelltexte mit VisualBasic .NET geschrieben worden, sonst wre ja das Thema verfehlt. Aber auch Programmiereranderer Sprachen, die die Syntax von VB.NET einigermaen beherrschen, knnen die Rezepteumsetzen.

    Der Schwerpunkt der Themen liegt eindeutig auf der Windows-Programmierung, da die Web-Programmierung bereits durch das ASP.NET Codebook abgedeckt wird. Aber auch Web-Pro-grammierer werden viele ntzliche Rezepte in diesem Buch finden. Selbst die Rezepte zu GDI+knnen fr Web-Anwendungen interessant sein, wenn z.B. auf dem Server Grafiken onlineerstellt werden mssen.

    Voraussetzungen zur Nutzung der RezepteAlle Projekte, die Sie auf der Buch-CD finden, wurden mit Visual Studio .NET 2003 und der Fra-mework-Version 1.1 unter Windows 2000 erstellt. Wir gehen davon aus, dass Sie selbst mit VisualStudio .NET arbeiten, denn das ist der Standard fr die Programmierung mit Visual Basic .NET.

    Alternativ knnen Sie auch die Freeware SharpDevelop einsetzen. Sie kann den Umfang vonVisual Studio .NET zurzeit aber bei weitem nicht erreichen. Wichtige Features wie Debuggingund umfassende visuelle Designer fehlen. Fr die ganz hart Gesottenen bleiben dann noch diekostenlose Nutzung von Nodepad-Editor und Kommandozeilenaufrufe des Compilers .

    Die Softwareentwicklung mit Visual Basic .NET sollten Sie nur auf den Betriebssystemen Win-dows 2000 und Windows XP bzw. zuknftigen Nachfolgern vornehmen. Visual Studio .NET 2003arbeitet ohnehin nur noch mit diesen Betriebssystemen. SharpDevelop funktioniert angeblichauch unter Windows NT4 und Windows 98/ME, wir raten aber davon ab.

    Typische Fragen zum Visual Basic .NET Codebook und zur Programmierung mit Visual Basic .NET

    Wie bekomme ich die abgedruckten Quelltexte aus den Rezepten in meine Anwendung?Auf der Buch-CD befindet sich ein Repository-Programm. Nach Kategorien organisiert suchenSie das betreffende Rezept und dort das gewnschte Listing aus und kopieren den Quelltext berdie Zwischenablage in Ihre Anwendung.

    Kann ich die Rezepte ohne Vernderung in meine Anwendung bernehmen?Wenn es sich realisieren lie, haben wir die Rezepte so aufgebaut, dass sie ohne nderung ber-nommen werden knnen. Allerdings war das in vielen Fllen nicht mglich, da bei der Objektori-entierten Programmierung z.B. Methoden nicht einfach aus dem Klassenverbund herausgerissenwerden knnen. Bei Windows-Forms oder Windows-Controls ergibt sich das Problem, dass wiraus Platzgrnden nicht den Code zur Generierung der Steuerelemente etc. abdrucken knnen.Auch syntaktische Gegebenheiten, wie z.B. Imports-Anweisungen am Anfang einer Datei, verhin-dern oft, dass Methoden und Klassen mit einem Mausklick kopiert werden knnen. Meist mssenan mehreren Stellen nderungen vorgenommen werden.

    Eine Reihe von Rezepten haben wir anhand von Beispielen erlutert. Hier mssen Sie natrlichden Beispielcode fr Ihre Zwecke anpassen.

  • Inhalt des Buches 21

    Gibt es zu den Rezepten Beispielprojekte?Ja. Fr fast alle Rezepte finden Sie auf der CD Beispielprojekte, in denen der beschriebene Codeeingesetzt und demonstriert wird. Dabei gibt es einige Rezepte, die an einem zusammenhngen-den Beispiel erlutert werden und dann auch in einem Projekt zusammengefasst werden. Nur frganz wenige Rezepte, die ohne nennenswerten Code auskommen (z.B. zur Diskussion von Basis-klassen fr Steuerelemente), gibt es keine eigenen Projekte.

    Wie finde ich das zu einem Rezept zugehrige Projekt?Auf der CD finden Sie eine Projekt-Referenz, die es Ihnen erlaubt, ber eine Rezeptauswahl zumProjektverzeichnis zu navigieren.

    Kann ich die Beispielprojekte sofort verwenden?Das sollte gehen. Bedenken Sie aber bitte, dass das Projekt zuvor auf die Festplatte kopiert werdenmuss, da sonst der Compiler keine Dateien und Verzeichnisse auf der CD anlegen kann.

    Ich programmiere mit C#. Kann ich das Buch auch nutzen?Ja. Denn das Kernthema des Buches ist die Programmierung mit dem .NET Framework undnicht, wie man mit Visual Basic eine Schleife programmiert. Wenn Sie C# beherrschen und sichein bisschen mit der Syntax von VB.NET auseinander setzen, werden Sie die Rezepte nutzen kn-nen. Hierzu knnen Sie wahlweise den VB-Code selbst in C# umsetzen oder einfach die Projektenutzen und als Klassenbibliothek in einem C#-Projekt einbinden.

    Ich programmiere mit ASP.NET. Was bringt mir das Buch?Das Schwerpunktthema des Buches ist die Programmierung von Windows-Anwendungen. Aberauch die umfasst viele Bereiche, die nichts mit Windows-Oberflchen zu tun haben. Beispiels-weise sind Systemzugriffe, Datumsberechnungen, Zugriffe auf XML-Dateien und Datenbankenoder Dateioperationen fr Web-Anwender genauso interessant wie fr Windows-Programmierer.Selbst die Rezepte zum Eigenschaftsfenster knnen sehr ntzlich sein, wenn Sie Web-Controlsentwerfen, die Sie an andere Anwender weitergeben wollen.

    Wird auf ASP.NET eingegangen?Nein. Hierfr gibt es das ASP.NET Codebook, dem wir auch keine Konkurrenz machen wollen .Web-Anwendungen und Web-Dienste werden nur insoweit besprochen, wie sie in Windows-Anwendungen genutzt werden knnen. Auf spezielle ASP.NET-Themen wird nicht eingegangen.

    Bentige ich Visual Studio fr die Programmierung mit VB?Jein. Eigentlich ist alles, was Sie bentigen, das .NET Framework SDK und ein Texteditor (undeigentlich knnen Sie Ihre Programme auch auf Lochkarten stanzen ;-)). Aber wenn Sie bereitsmit den Visual Basic 5 oder 6 gearbeitet haben, dann wollen Sie die komfortable Entwicklungs-umgebung bestimmt nicht missen. Fr die professionelle Arbeit mit Visual Basic .NET fhrt der-zeit kein Weg an Microsoft Visual Studio vorbei.

    Bentige ich Visual Studio fr den Einsatz der Rezepte?Auch hier ein Jein. Im Prinzip nicht, aber praktischer ist es schon. Alle Projekte wurden mit VisualStudio erstellt und knnen mit diesem natrlich auch wieder geffnet und weiterbearbeitet wer-den.

    Ich habe nur VB6. Kann ich die Beispiele auch benutzen?Nein. Die Programmierung unter VB.NET hat nicht mehr viel mit der Programmierung unterVB6 zu tun. Die Beispiele sind nur unter VB.NET lauffhig.

  • 22 Einleitung

    Werden Module oder andere aus Kompatibilittsgrnden bernommene alte VB6-Techniken verwendet?Nein. Diese Techniken sind fr Umsteiger beim Erlernen des .NET-Konzeptes eher hinderlich alsfrderlich. Alles, was sich mit dem Framework und den Techniken der Objektorientierten Pro-grammierung realisieren lsst, haben wir auch so realisiert. Natrlich verwenden wir dort, wo esSinn macht, VB-Begriffe wie z.B. Integer statt System.Int32. Auch fr gngige Typ-Umwandlun-gen setzen wir in vielen Fllen Methoden wie CInt oder CSng ein, statt die doch sehr umstndlicheTypecast-Syntax von CType oder DirectCast zu verwenden.

    Grundstzlich sind wir der Meinung, dass man sich auch (oder vielleicht gerade) als ehemaligerVB6-Programmierer von den Altlasten von VB Classic befreien muss und nicht gegen die Kon-zepte von .NET arbeiten sollte. Die prozedurale Programmierung, in der hufig mit globalenVariablen und Methoden gearbeitet wurde, hat hier keinen Platz mehr.

    Werden alle Themenbereiche von .NET angesprochen?Wenn Sie bei dieser Frage insgeheim denken ich hoffe doch ja, dann sollten Sie wissen, dass Sieein solches Buch nicht mehr forttragen knnten. Nein, .NET umfasst derartig viele Bereiche, dasses vllig unmglich ist, auch nur annhernd alles in einem Buch zu beschreiben. Wir haben dieThemen herausgesucht, die unserer Meinung nach fr die meisten Visual Basic-Programmierervon Belang sind und/oder sich in der Praxis, Newsgroups etc. als relevant herausgestellt haben.

    Werden Techniken wie XML detailliert erklrt?Nein. Auch hier stoen wir mit dem Buch an Grenzen. Wir erklren, wie Sie mit diesen Technikenin .NET umgehen knnen. Aber die Grundlagen von z.B. XML knnen wir nicht umfassenddokumentieren. Hierzu gibt es ausreichende Literatur, in Bchern und online.

    Wird auch Multithreading eingesetzt?Wie bereits oben erwhnt, ist der Einsatz von Multithreading in Visual Basic .NET wesentlich ver-einfacht worden. Allerdings warnen wir ausdrcklich davor, ohne massive Kenntnis der Grundla-gen Multithreading einzusetzen. Gerade im Umgang mit Windows-Anwendungen gibt es vieleFallen, in die (mit Multithreading) unerfahrene Programmierer tappen knnen. Multithreadingist erheblich komplizierter, als es auf den ersten Blick den Anschein macht.

    Wir haben Multithreading nur in einzelnen Ausnahmefllen eingesetzt, wenn auch wirklich einGrund dafr gegeben war.

    Auf welchen Plattformen laufen die entwickelten .NET-Programme?Theoretisch auf allen Plattformen, fr die es das .NET Framework gibt. Das heit auf Windows98SE, Windows ME, Windows NT 4.0, Windows 2000, Windows XP und Windows 2003 Server.Allerdings gibt es fr Windows 98/ME sehr viele Einschrnkungen. hnlich sieht es bei WindowsNT aus. Die vollstndige Framework-Implementierung gibt es erst ab Windows 2000.

    Auf welchen Plattformen funktionieren die Beispiele aus dem Buch?Entwickelt und getestet haben wir unter Windows 2000. Die Programme sollten sich unter Win-dows XP und Windows 2003 Server genauso verhalten. Auf den lteren Plattformen werdenhchstwahrscheinlich einige Beispiele (z.B. mit Transparenzeffekten) nicht funktionieren.

    Funktionieren die Rezepte auch auf dem Framework 1.0 und mit Visual Studio .NET 2002?Grtenteils wahrscheinlich schon. Wir haben es aber nicht ausprobiert. Im Sourcecode sind ggf.kleine nderungen bei den For-Schleifen notwendig, da wir in der Regel von der MglichkeitGebrauch gemacht haben, die Schleifenvariablen im For-Statement zu definieren. Auch kann es in

  • Inhalt des Buches 23

    Ausnahmefllen vorkommen, dass Erweiterungen des Frameworks benutzt werden, die in derVersion 1.0 nicht enthalten sind. Ein Beispiel dafr ist die Enumeration Environment.SpecialFol-der, die in der Version 1.1 deutlich umfangreicher ausgefallen ist.

    Die RezepteIn 15 Kategorien finden Sie ber 300 Rezepte. Was Sie in den Kategorien erwartet, haben wir hierkurz zusammengefasst.

    BasicsHier finden Sie Grundlegendes z.B. zu Formatierungen, Bit-Operationen, Vergleichen und Sor-tieren von Objekten und Enumerationen. Die alte VB Format-Anweisung hat ausgedient. LesenSie nach, welche neuen weitaus komfortableren Mglichkeiten das Framework bietet, um Zahlenund andere Werte zu formatieren und zu konvertieren. Der Umgang mit Bits und Bytes ist in.NET wesentlich einfacher geworden. Nicht nur, dass die Sprache VB.NET selbst endlich Schiebe-operationen kennt, sondern auch das Framework hlt einige Klassen fr Konvertierungen bereit,die frher nur sehr umstndlich realisierbar waren.

    Enumerationen sind in .NET nicht mehr einfache benannte Konstanten, sondern bieten auch zurLaufzeit Untersttzungen, z.B. zum Abfragen aller definierten Werte und Namen. Wir zeigenIhnen, wie Sie mit Enumerationen umgehen knnen, wie Sie Enums ein- und auslesen knnen,ohne mit den nackten Zahlenwerten arbeiten zu mssen.

    Zum Sortieren von Listen und Arrays, die Objektreferenzen enthalten, gibt es allgemeingltige,vom Framework genutzte Entwurfsmuster (Design Patterns). Wir erklren die Mechanismen, dieSie bentigen, um Objekte vergleichen und suchen zu knnen.

    (Fast) ausgedient haben auch die alten Funktionen Asc und Chr, denn sie arbeiten nur mit ASCII-Zeichen. Zur Laufzeit arbeiten .NET Strings aber grundstzlich mit Unicode. Wie Sie dieUmwandlung zwischen den verschiedenen Zeichencodierungen (ASCII, UTF8, UTF16 usw.) vor-nehmen knnen, erfahren Sie ebenfalls in dieser Kategorie.

    Datum und ZeitFr den Umgang mit Datums- und Zeitangaben stellt das Framework umfangreiche Strukturen,Klassen und Methoden bereit. Leider gibt es auch ein paar Fehler und Fallen, z.B. bei der Berech-nung der Kalenderwochen, wie sie in Europa blich sind. Dagegen helfen unsere Rezepte .

    Ein immer wieder gefragtes Thema ist die Berechnung der deutschen Feiertage. Mit mehrerenRezepten zeigen wir, wie grundlegende Daten (Kirchenjahr, Osterdatum) berechnet werden, undstellen Ihnen eine Klasse fr den Umgang mit Feiertagen zur Verfgung, die beliebig erweitertwerden kann.

    Fr Historiker interessant ist die Umrechnung zwischen dem Gregorianischen Datum und derJulianischen Tageszhlung.

    AnwendungenNach Ini-Dateien und Registry-Eintrgen werden heute Konfigurationsdaten in XML-Dateiengespeichert. In der Kategorie Anwendungen stellen wir Rezepte vor, um aus der Konfigurations-datei einer Anwendung Daten zu lesen. Wir zeigen, wie Sie selbst Konfigurationsdateien anlegenund in Ihrem Programm diese lesen und schreiben knnen.

    Auch fr die oft gestellte Frage, wie man verhindern kann, dass eine Anwendung mehrfach gestar-tet wird, finden Sie hier ein Rezept. Ebenso fr die Klrung der Frage, wie man in einer Anwen-dung eine zentrale Fehlerbehandlung durchfhren kann.

  • 24 Einleitung

    GDI+ ZeichnenGDI+ ist das Grafik-API der neuen Betriebssysteme und wird ab Windows XP mit diesem zusam-men installiert. GDI steht fr Graphics Device Interface. Es ist nicht Bestandteil von .NET, jedochbasieren alle grafischen Ausgaben auf GDI+. GDI+ ist somit die Plattform fr alle Zeichnungen,die mit einem .NET-Programm erstellt werden. Gegenber dem alten gewachsenen GDI bietet eseine Reihe von Vorteilen. Hier nur einige wichtige:

    Systematisch aufgebautes Klassen- und Funktionsmodell

    Einfach anwendbare Zeichengerte wie Pen, Brush und Font

    Koordinatensysteme und -transformationen

    Transparenz ber Alpha-Kanal

    Heutige Grafikkarten verfgen in der Regel noch nicht ber eine Hardware-Beschleunigung frGDI+. In vielen Fllen, insbesondere bei der Anwendung von Transparenz, kann es daher zu Per-formance-Einbuen gegenber GDI kommen. Diese Nachteile sollten jedoch in einigen Jahren,wenn die nchsten Generationen von Grafikkarten zur Verfgung stehen, der Vergangenheitangehren.

    Im Wesentlichen ersetzt GDI+ alle Funktionen von GDI. Es soll jedoch nicht verschwiegen wer-den, dass ein paar Mglichkeiten des alten GDI in GDI+ nicht mehr oder zumindest nur nocheingeschrnkt zur Verfgung stehen. Dazu gehrt z.B. die Mglichkeit, durch wiederholtes XOR-Drawing zuvor gezeichnete Figuren wieder zu lschen, ohne den Hintergrund neu zeichnen zumssen.

    Dieses Buch kann und soll nicht die Grundlagen von GDI+ erklren. Stattdessen wird an Handeiniger Beispiele der praktische Einsatz gezeigt. Da Zeichenoperationen aber zu den wichtigstenBestandteilen einer grafischen Oberflche zhlen, gehen wir im Buch etwas ausfhrlicher auf sieein In der Kategorie GDI+ Zeichnen zeigen wir Ihnen zunchst allerlei Tricks und Kniffe imUmgang mit Schriften, Schatten und 3D-Effekten. Die Zeiten der eintnig grau in grau erschei-nenden Dialogboxen sollte allmhlich der Vergangenheit angehren.

    GDI+ BildbearbeitungBeginnend mit den Grundlagen zum Zeichnen von Bildern finden Sie Rezepte zu komplexenberblend-Funktionen mit Clipping und Transparenz, zum Vergrern von Bildausschnitten,zur Maximierung von Bildanzeigen und zum Drehen und Spiegeln. Wir zeigen Ihnen, wie Sie inIhrem Programm eine Ordnerauswahl mit miniaturisierten Vorschaubildern anzeigen undThumbnail-Bilder fr Webseiten generieren knnen.

    Des Weiteren finden Sie Rezepte zum Umgang mit verschiedenen Dateiformaten und Encodern.Oft wird gefragt, wie man Bilder im JPEG-Format speichern und dabei Einfluss auf die Qualittnehmen kann. Auch das zeigen wir hier.

    Mit Hilfe von Matrix-Operationen knnen die Farbinformationen auch von greren Bildernsehr schnell verndert werden. Wir haben Rezepte fr Sie vorbereitet, um Farbbilder zu invertie-ren oder in Graustufen umzuwandeln. In einem Rezept erklren wir ein Testprogramm, mit des-sen Hilfe Sie die Farbmatrix online verndern und gleichzeitig die Auswirkung sehen knnen.

    Fr technische und wissenschaftliche Auswertungen werden oft Scharfzeichnungsfilter bentigt.In mehreren Rezepten erklren wir, wie die gngigen Filteralgorithmen in Visual Basic .NETumgesetzt werden knnen.

  • Inhalt des Buches 25

    Windows FormsNahezu unberschaubar sind die Mglichkeiten, die .NET zur Gestaltung von Fenstern bietet.Neu hinzugekommen sind Fenster mit nicht rechteckigen Umrissen sowie ganz oder teilweisedurchsichtige Fenster. Wir zeigen an einigen Beispielen, wie Sie die neuen Effekte nutzen knnen.Sie finden Rezepte zu oft gestellten Fragen, wie z.B. Fenster ohne Titelleiste erzeugt und verscho-ben werden knnen und wie man per Programm ScreenShots erstellen kann.

    Viele VB Classic-Programmierer haben groe Probleme bei der Programmierung von Dialogfens-tern unter .NET. Die Fragen in den Newsgroups zeigen nur allzu oft, dass Dialoge unter VB Clas-sic nur selten objektorientiert programmiert worden sind, obwohl bereits VB5 eine MengeMglichkeiten zur Kapselung von Dialogen zu bieten hatte. Wir halten es daher fr auerordent-lich wichtig, diese Thematik in einigen Rezepten aufzugreifen und zu erklren, wie man unter.NET Dialoge kapseln kann. Dadurch erhalten die Dialogklassen eine saubere Struktur, sind bes-ser wartbar und knnen wiederverwendet werden. Durch Vererbung knnen Sie zustzlich errei-chen, dass die Dialogfenster eines Programms ein einheitliches Aussehen bekommen.

    Ebenfalls im Zusammenhang mit Dialogfenstern wird diskutiert, wie Benutzereingaben berprftwerden knnen. Das Framework bietet auch hierzu einige neue Mechanismen.

    Auch oft gestellte Fragen wie z.B., wie man einen Startbildschirm (Splashscreen) anzeigt oder wieman ber Drag&Drop oder ber die Zwischenablage Daten importieren oder exportieren kann,werden in dieser Kategorie mit mehreren Rezepten beantwortet.

    Wenngleich wir die Projekte alle unter Windows 2000 erstellt haben, zeigen wir natrlich auch,wie Sie die neuen Darstellungsformate fr Schaltflchen etc. unter Windows XP nutzen knnen.

    Letztlich zeigen wir Lsungen fr banal klingende Aufgabenstellungen, die sich bei nhererBetrachtung als uerst knifflig erweisen, z.B. wie in einer TextBox die Eingabetaste abgefangenwerden kann und wie man Dateipfade so krzen kann, dass sie in noch lesbarer Form in Mensverwendet werden knnen.

    Windows ControlsDieses ist aus gutem Grund die umfangreichste Kategorie. Der Umgang mit Steuerelementen hatsich grundlegend gendert. Es gibt nicht mehr die Aufteilung in Ressource und Code-Teil, wie esin VB Classic der Fall war. Alle Steuerelemente werden per Code erzeugt. Auch die Eigenschaftenwerden im Code initialisiert. Beginnend mit einfachen Themen, z.B., wie die Control-Arrays ausVB Classic ersetzt werden knnen, ber das benutzerdefinierte Zeichnen von ListBoxen undmehrspaltigen ComboBoxen gehen wir intensiv auf die Programmierung eigener Steuerelementeein. Wir erlutern, welche Basisklassen sich fr welche Steuerelemente eignen und welche Mg-lichkeiten es gibt, in den Nachrichtenfluss eines Controls einzugreifen.

    Komplexere Steuerelemente fr Verzeichnis- und Dateiauswahl werden ausfhrlich vorgestellt. Sieknnen direkt fr den Bau eigener Dialoge verwendet werden, falls die von Windows bereitge-stellten nicht ausreichen.

    Am Beispiel eines grafischen Steuerelementes zur Anzeige von Zeitsegmenten demonstrieren wir,wie man Steuerelemente mit nicht rechteckigem Umriss definiert, wie Koordinaten transformiertwerden, wie Maus-Ereignisse auch zur Entwurfszeit bearbeitet werden knnen und was zu tun ist,um auch im Eigenschaftsfenster die Zeitsegmente einstellen zu knnen.

    Mehrzeilige TextBoxen werden vom Framework etwas stiefmtterlich behandelt. Einige Informa-tionen und Einstellungen sind nur ber API-Funktionen erreichbar. Auch hierzu halten wir einigeRezepte parat.

  • 26 Einleitung

    Eigenschaftsfenster (PropertyGrid)Eines der leistungsfhigsten Steuerelemente, die Ihnen auch fr eigene Anwendungen zur Verf-gung stehen, ist das PropertyGrid-Control (Eigenschaftsfenster). Es handelt sich dabei um dasSteuerelement, das der Designer benutzt, um dem Entwickler die Mglichkeit zu geben, fr einausgewhltes Objekt (Steuerelement, Fenster, Men etc.) dessen Eigenschaften anzuzeigen und zundern (siehe Abbildung 1). Sicher haben auch Sie es schon oft in Verbindung mit dem Designerverwendet.

    Egal, ob Sie im Designer die Eigenschaften Ihrer eigenen Steuerelemente korrekt anzeigen wollenoder ob Sie zur Laufzeit das PropertyGrid-Control in Ihren eigenen Anwendungen dazu benutzenmchten, die Eigenschaften beliebiger Objekte anzuzeigen, es stehen Ihnen vielfltige Mglichkei-ten zur Verfgung, das Verhalten des Eigenschaftsfensters gezielt zu steuern. Insbesondere fr dieprofessionelle Entwicklung von Steuerelementen ist es unerlsslich, sich nher mit dem Property-Grid zu beschftigen, um dem Anwender alle erdenklichen Hilfestellungen und Vereinfachungenfr den Umgang mit den Steuerelementen zur Verfgung stellen zu knnen.

    Eigentlich wollten wir einem einzelnen Steuerelement kein eigenes Kapitel widmen. Das Proper-tyGrid-Control ist aber leistungsstark wie kaum ein anderes, wird oft eingesetzt und ist in derMSDN-Dokumentation nur lckenhaft beschrieben. Auch im Internet findet man nur sehr ver-streut die bentigten Informationen. Deswegen haben wir an dieser Stelle eine zusammenhn-gende, viele Details umfassende Sammlung von Rezepten zum Eigenschaftsfenster fr Sieerarbeitet.

    Angefangen mit Rezepten zur Steuerung des PropertyGrid ber Attribute fr Kategorien,Beschreibungen, Standardwerten und Standardeigenschaften fhren wir Sie in Techniken zumAnzeigen eigener Editoren ein, die den Anwender bei der Eingabe der Daten untersttzen knnen.

    Abbildung 1: Das Eigenschaftsfenster (PropertyGrid) ist eines der leistungsfhigsten Steuerelemente und lsst sich auch in eigene Anwendungen einbinden

  • Inhalt des Buches 27

    Wir erklren den Umgang mit Auflistungen und Enumerationen und wie Sie das Eigenschaftsfens-ter um zustzliche Hyperlink-Schaltflchen und Tab-Seiten erweitern knnen.

    Das starre Anzeigen der vorgegebenen Eigenschaftsnamen kann in mehrsprachigen Programmenstrend sein. Daher finden Sie hier auch ein Rezept, das beschreibt, wie Sie die angezeigten Textelokalisieren knnen.

    DateisystemDateisystemverwaltung zhlt zu den grundlegenden Eigenschaften, die ein Betriebssystem unter-sttzen muss. Ohne die Mglichkeit, Dateien und Verzeichnisse erstellen, verndern und lschenzu knnen, wren alle Informationen mit dem Abschalten des Rechners verloren. Was bliebe,wren Lochstreifen und Lochkarten. Im Laufe der Jahre haben sich die Anforderungen an einDateisystem stetig erhht.

    In den Rezepten zum Dateisystem finden Sie Rezepte fr eben diese Mglichkeiten. Da dasBetriebssystem aber neben normalen Dateien ebenfalls im Dateisystem abgespeichert wird, zei-gen einige Rezepte auf, in welchen Verzeichnissen ein Anwender diese Informationen bei derInstallation des Betriebssystems hinterlegt hat.

    Da ein modernes Dateisystem ein recht dynamisches Gebilde ist, kann man manchmal die ber-wachung von bestimmten Dateien oder Verzeichnissen in einem Programm nicht vermeiden.Auch findet heute der Datenaustausch zwischen unterschiedlichen Plattformen teilweise nochimmer ber Dateien statt. Ein Rezept stellt die Mglichkeiten vor, wie man innerhalb eines Pro-gramms nderungen am Dateisystem berwachen kann.

    NetzwerkEin Netzwerk ist in der modernen EDV nicht mehr wegzudenken. War ein Netzwerk bis vor kur-zer Zeit noch ein zustzliches Programm oder ein zustzlicher Treiber, der dem Betriebssystembekannt gemacht werden musste, gehren Netzwerkfunktionen heute bereits zum Betriebssystem.Dementsprechend unterscheiden viele Funktionen nicht mehr zwischen lokal und global.

    Wir haben in diesem Abschnitt des Buches Rezepte aufgefhrt, die trotz allem mehr dem Netz-werk zuzuordnen sind, z.B. welche Netzwerkadapter sind in einem Rechner eingebaut. Da die IP-Adressen der Version 6 immer bekannter werden, sind auch zwei Rezepte zur Umrechnung alt aufneu und umgekehrt hier zu finden.

    Um das Thema Web-Services nicht allein den ASP-Programmierern zu berlassen haben wiran dieser Stelle auch ein Rezept fr die Erstellung eines Google-Web-Clients fr VB.NET aufge-fhrt.

    SystemDieser Abschnitt basiert zu einem nicht kleinen Teil auf einer Technik, die relativ unbekannt, abertrotz allem sehr effektiv genutzt werden kann: WMI. Eine kleine Einfhrung in die Thematikhaben wir in den Anhang aufgenommen.

    Das System kann grob in zwei Bereiche unterteilt werden, die Hardware und die Software. Fr denBereich Hardware finden Sie Rezepte, die es Ihnen ermglichen, den Plattenplatz zu ermittelnoder das BIOS auszulesen. Aber auch der Prozessor und seine Eigenschaften oder die Auflsungdes Monitors finden Sie in den Rezepten wieder. Auf der Softwareseite finden Sie Rezepte, wie Siefeststellen knnen, welche Software auf dem System installiert ist oder wie Sie die Registry mit.NET bearbeiten knnen.

    Natrlich drfen Dienste und deren Steuerung in einem solchen Kontext nicht fehlen. ZweiRezepte haben hier Eingang gefunden, die mehr mit der Kommunikation zu tun haben, aber viel-

  • 28 Einleitung

    fach als Systemfunktionalitt in einem Programm Einzug finden: das Versenden von Fax undeMail aus einer Anwendung heraus.

    DatenbankenIn diesem Teil des Buches finden Sie hauptschlich Rezepte, die mit der Verwaltung einer Daten-bank zu tun haben. Da es gengend Bcher zum Thema ADO.NET gibt, aber eher selten etwasber die Verwaltung einer Datenbank ber ein eigenes Programm ausgefhrt wird, finden Sie hierRezepte, mit denen Sie Datenbanken aus einer Anwendung heraus oder als eigenstndiges Pro-gramm steuern knnen. Dies ist umso wichtiger, da mit der MSDE kein entsprechendes Pro-gramm von Microsoft ausgeliefert wird.

    In diesem Abschnitt des Buches finden Sie Rezepte zur Erstellung von Datensicherungen (mitoder ohne Device-Kontext) und zur Automatisierung dieser Ttigkeiten. Sie knnen dies nichtnur mit der lokalen Datenbank, sondern mit jeder SQL-Datenbank, fr die Sie entsprechendeRechte im Netzwerk haben. Natrlich wird auch der umgekehrte Weg, also die Rcksicherung inden Rezepten gezeigt.

    Einige Rezepte beschftigen sich aber auch mit anderen Themen als der Datenbankverwaltung. Sofinden Sie ein Rezept zur Feststellung der MDAC-Version auf einem Rechner, wie man Bilder ineiner Datenbank abspeichern kann oder wie Excel als Datenbank angesprochen wird.

    XMLXML ist eine der tragenden Sulen in .NET. Deswegen wird XML auch in vielen Bereichen desFrameworks eingesetzt und in vielfltiger Weise untersttzt. Wir knnen leider nicht sehr tief aufdie Grundlagen von XML eingehen (dazu gibt es Bcher, die durchaus dicker sind als dieses), aberwir zeigen Ihnen die wichtigsten Vorgehensweisen im Umgang mit XML-Daten und -Dateien auf.

    Sie finden in dieser Kategorie einige Rezepte zu grundlegenden Klassen wie XmlTextWriter undXmlTextReader oder zum Lesen und Schreiben von Bildern und Binrdaten ebenso wie solchezum Umgang mit dem Document Object Model (DOM).

    XPath-Ausdrcke sind leistungsstarke Konstrukte fr XML-Abfragen. Auch sie werden ausfhr-lich behandelt, besonders in Zusammenhang mit Namensrumen, die bei XPath einigen zustzli-chen Aufwand erfordern. Wir geben Ihnen Rezepte zu den Klassen XmlDocument undXPathDocument und erlutern die Unterschiede.

    Viele Nachrichtenagenturen, Zeitschriftenverlage und auch das MSDN stellen im Internet XML-Dateien (Stichwrter RSS und RDF) mit den aktuellen Nachrichten zur Verfgung. Zwei Rezeptezeigen auf, wie Sie diese Nachrichten verarbeiten und anzeigen knnen.

    Auch Techniken, wie die Validierung von XML-Dateien ber ein XML-Schema oder die komfor-tablen Aufrufmglichkeiten von Stylesheet-Transformationen (XSLT) haben wir in Rezeptformfr Sie aufgearbeitet. Sie finden hier auch ein Rezept, wie Sie Code fr Klassen erzeugen knnen,ohne selbst programmieren zu mssen.

    Ein interessantes Thema ist auch der Parallelbetrieb von DataSet und XmlDataDocument, bei demSie wechselweise mit XPath- oder SQL-Abfragen arbeiten knnen.

    Abschlieend werden in dieser Kategorie die Serialisierung beliebiger Objekte von und nach XMLerlutert. Sie finden Rezepte zu den Klassen XmlSerializer und SoapFormatter.

    Wissenschaftliche Berechnungen und KurvendiagrammePhysikalisch technische Mae werden in der Programmierung meist als simple Gleitkommazah-len abgehandelt. Eine Typsicherheit, um hier nicht Lngenmae und Geschwindigkeiten durch-einander zu werfen, wird nur selten vorgesehen.

  • Inhalt des Buches 29

    Am Beispiel einiger Mae (Lngenma, Flchenma usw.) zeigen wir, wie Sie die Objektorien-tierte Programmierung gezielt einsetzen knnen, um zum einen die Typsicherheit zu gewhrlei-sten und zum anderen, wie Angaben in verschiedenen Einheiten automatisch in eine Standard-Einheit umgerechnet werden knnen.

    Zur wissenschaftlichen Aufarbeitung von Mess- und Simulationswerten gehrt auch die Darstel-lung in Form von Kurvendiagrammen. Wir beschreiben, wie Sie die Skalierungen der Achsenberechnen knnen und wie die Kurven gezeichnet werden; insbesondere, wie kontinuierlichdurchlaufende T/Y-Diagramme programmiert werden knnen.

    Falls Ihnen die Genauigkeit nicht reicht, mit der das Framework die Zahl Pi berechnet, finden Siehier auch ein Rezept, mit dem Sie Pi auf 2400 Stellen genau berechnen knnen .

    VerschiedenesIn der letzten Kategorie haben wir all die Rezepte gesammelt, die fr die Kategorie Basics nichteinfach genug sind und die nicht zu den Themen der andere Kategorien passen.

    Eine oft gestellte Frage ist, wie man unter .NET Sound-Dateien abspielen kann. Da das Frame-work dafr bislang keine Untersttzung bietet, zeigen wir, wie Sie wahlweise mit API-Funktionenoder ber DirectX die Aufgabe lsen knnen.

    Wenig bekannte Debug-Mglichkeiten, z.B. die Steuerung von Ausgaben ber die Konfigura-tionsdatei der Anwendung, die Ausgabe von Debug- und Trace-Ausgaben in TextBoxen, Dateienoder Eventlogs oder die Erstellung und Nutzung eigener Leistungsindikatoren (Performance-Counter) waren uns auch einige Rezepte wert. Auch wenn Sie wissen mchten, wie Sie auf Event-log-Ausgaben anderer Anwendungen reagieren knnen, finden Sie hier Lsungen.

    Ein weiteres Rezept gibt Ratschlge, wie Sie Zeiten mit hoher Auflsung messen knnen und wasdabei zu beachten ist. Auch, wie Sie vorgehen knnen, wenn Sie Fehlermeldungen der API-Funk-tionen im Klartext anzeigen wollen.

    Typografische KonventionenDie folgenden typografischen Konventionen werden in diesem Buch verwendet:

    Schlsselwrter von Visual Basic sowie Bezeichner fr Variablen, Methoden, Klassen usw.werden innerhalb des Flietextes in der Schriftart Courier dargestellt.

    Beispiel: die Klasse System.Object und der Wert True

    Listings werden in folgender Schriftart gedruckt. VB-Schlsselwrter werden fett gedruckt:

    Kommentare in Listings werden kursiv geschrieben:

    Dateinamen und Verzeichnisnamen werden kursiv formatiert:

    Beispiel: Text.txt

    Internetadressen sehen so aus: www.addison-wesley.de

    Texte der Bedienoberflchen, Menpunkte, Schaltflchenbeschriftungen etc. werden in Kapi-tlchen formatiert:

    Beispiel: Menpunkt DATEI/FFNEN

    Dim i As Integer = 123

    ' Das ist ein Kommentar

  • 30 Einleitung

    Inhalt der Buch-CDAuf der Buch-CD befindet sich das bereits erwhnte Repository, mit dessen Hilfe Sie die abge-druckten Quelltexte auffinden und ber die Zwischenablage in Ihre Projekte bernehmen kn-nen. Zustzlich finden Sie auf der CD alle Beispielprojekte und eine Querverweisliste, der Sie dieZuordnung von Rezepten zu Projekten entnehmen knnen.

    ErrataKeine Qualittskontrolle kann hundertprozentig verhindern, dass Fehler bersehen werden. Soverhlt es sich auch bei einem Codebook mit mehr als 800 Seiten. Natrlich haben wir alle Bei-spiele sorgfltig getestet, aber wir knnen nicht ausschlieen, dass uns Fehler unterlaufen sindoder dass in manchen Situationen ein Beispiel nicht so funktioniert, wie es beschrieben wird.

    Falls Sie also Fehler oder Unstimmigkeiten finden sollten oder Anregungen und Verbesserungs-vorschlge haben, lassen Sie es uns wissen. Unsere Internet-Adresse, ber die Sie den Kontakt her-stellen knnen, finden Sie im Vorwort.

    Anhang / ReferenzteilIm Anhang haben wir fr Sie wichtige Hintergrundinformationen zusammengefasst. In einerkurzen Zusammenfassung erlutern wir die wichtigsten Themen und Begriffe rund um dieObjektorientierte Programmierung mit Visual Studio .NET. Wir zeigen, was sich gegenber VB6wesentlich verndert hat. Auch Arrays und Auflistungen werden hier nher errtert.

    Ein weiteres Schwerpunktthema im Referenzteil ist der Umgang mit Visual Studio .NET 2003.Nicht, wie Sie ein Projekt anlegen (das sollten Sie bereits beherrschen), sondern kleine, aber hilf-reiche Details, die oft ungenutzt bleiben, werden hier vorgestellt.

    Natrlich nennen wir auch einige Quellen im Internet, in denen Sie zustzliche Informationenfinden knnen. Auch erklren wir, wie Sie in den gngigen Newsgroups Hilfe finden knnen, wieSie mit Google in den Newsgroups recherchieren oder selber an den Diskussionen teilnehmenknnen.

    Einige Grundlagenthemen, die aus Platzgrnden nicht in die Rezepte aufgenommen werdenkonnten, werden im Referenzteil ebenfalls kurz aufgegriffen und erlutert.

    Da das .NET Framework nicht alles abdecken kann, werden in einigen Rezepten Windows-API-Funktionen verwendet. Die verwendeten Funktionen, Strukturen und Konstanten haben wir ineiner Klasse gekapselt, die ebenfalls im Referenzteil abgedruckt ist.

  • TEIL IIRezepte

  • !"

    #

    "

    $%&

    '

    (

    Basics

    Zu Beginn wollen wir Ihnen ein paar grundlegende Vorgehensweisen vorstellen, die einige Leservielleicht schon kennen. Aber die Erfahrung zeigt, dass viele Umsteiger von VB6 mit den neuenFeatures von VB.NET und den grundlegenden Framework-Klassen und -Methoden nicht vertrautsind. Daher beginnen wir mit einfachen Dingen wie Zahlenformaten und gehen auch auf Bit-Operationen und Vergleiche von Objekten ein.

    1 Zahlen-, Zeichen- und String-LiteraleAufgrund der in .NET allgegenwrtigen Typprfungen ist es oft wichtig, bereits die Literale mitdem richtigen Typ zu definieren. Auch wenn VB.NET im Umgang mit Literalen etwas grozgi-ger ist, als es sein drfte, sollten Sie wissen, wie ein Literal fr den jeweiligen Typ definiert wird. InTabelle 1 sind die wichtigsten Literal-Formate aufgefhrt.

    Die Methode PrintInfo

    erzeugt bei den folgenden Aufrufen

    Datentyp Postfix Beispiel Frameworktyp

    Integer - 123 System.Int32

    Integer I 123I System.Int32

    Short S 123S System.Int16

    Long L 123L System.Int64

    Double - 123.456 System.Double

    Double - 123.45E45 System.Double

    Single F 123.45F System.Single

    Decimal D 123.45D System.Decimal

    String - "A" System.String

    Char C "A"c System.Char

    Tabelle 1: Definition von Literalen in VB.NET

    Public Sub PrintInfo(ByVal o As Object) Debug.WriteLine(o.ToString() & " [" & o.GetType.Name & "]")End Sub

    PrintInfo(3.2)PrintInfo(3.2F)PrintInfo(3D)PrintInfo(3.2E+25)PrintInfo(3)PrintInfo(3L)

  • 34 Basics

    diese Ausgaben:

    Wollen Sie bei Methodenaufrufen Literale bergeben, dann knnen Sie durch den entsprechen-den Postfix gezielt eine berladung fr einen bestimmten Typ aufrufen. Bei dieser Methoden-berladung:

    knnen Sie gezielt eine der beiden Methoden mit einem Literal aufrufen:

    Alternativ knnen Sie auch den Typ mit einem TypeCast anpassen, entweder allgemein mit CTypeoder speziell mit den VB-Typumwandlungen CSng, CShort, CChar usw.

    Hexadecimal-Literale werden definiert, wie schon frher in VB6: mit vorangestelltem &H:

    Analog gilt fr Oktal-Literale ein vorangestelltes &O:

    Datums-Literale werden in amerikanischer Notation angegeben (# Monat / Tag / Jahr# bzw. #Stunde : Minute : Sekunde# oder Kombinationen hieraus). Beispiele:

    PrintInfo(3S)PrintInfo("A")PrintInfo("A"c)

    3,2 [Double]3,2 [Single]3 [Decimal]3,2E+25 [Double]3 [Int32]3 [Int64]3 [Int16]A [String]A [Char]

    Public Sub Compute(ByVal value As Integer) ' Berechnungen mit Integer-WertEnd Sub

    Public Sub Compute(ByVal value As Short) ' Berechnungen mit Short-WertEnd Sub

    Compute(123) ' ruft die erste Variante aufCompute(123S) ' ruft die zweite Variante auf

    Dim h As Integer = &H1000 ' weist h den Wert 4096 zu

    Dim o As Integer = &O1000 ' weist o den Wert 512 zu

  • Ganzzahlen dual, oktal oder hexadezimal darstellen 35

    !"

    #

    "

    $%&

    '

    (

    2 Ganzzahlen dual, oktal oder hexadezimal darstellenBentigen Sie einen String, der die duale, oktale oder hexadezimale Reprsentation einer ganzenZahl darstellt, dann knnen Sie diesen durch Aufruf der statischen Methode Convert.ToString(Wert, Basis) abrufen. Basis gibt die Darstellungsbasis an. Erlaubt sind die Werte 2 (dual), 8(oktal) und 16 (hexadezimal).

    Die Aufrufe

    erzeugen die Ausgaben

    3 String mit dualer, oktaler oder hexadezimaler Darstellung in Zahlenwert wandeln

    Umgekehrt geht die Wandlung selbstverstndlich auch. Je nach bentigtem Datentyp knnen Sieeine der ToXXX-Methoden von Convert verwenden:

    Convert.ToByte (text, base)

    Convert.ToInt16 (text, base)

    Convert.ToInt32 (text, base)

    Convert.ToInt64 (text, base)

    base gibt hier wieder die Darstellungsbasis an und kann die Werte 2, 8 und 16 annehmen. Bei-spielsweise wird mit

    der Variablen b der Wert 7 zugewiesen.

    4 Zahlenwerte formatierenJeder numerische Datentyp verfgt ber eine eigene berschreibung der Methode ToString mitverschiedenen berladungen. Eine der berladungen nimmt als Parameter einen Format-Stringan, mit dem Sie definieren knnen, wie der Zahlenwert ausgegeben werden soll. Wird kein For-mat-String bergeben, wird eine Standard-Formatierung vorgenommen (Format General). Die

    Dim d As DateTime d = #10/20/2003#d = #2:20:30 PM#d = #9/10/2004 2:20:30 PM#

    Debug.WriteLine(Convert.ToString(1024, 2))Debug.WriteLine(Convert.ToString(1024, 8))Debug.WriteLine(Convert.ToString(1024, 16))

    100000000002000400

    Dim b As Byte = Convert.ToByte("0000111", 2)

  • 36 Basics

    mglichen Formatierungen sind von Typ zu Typ unterschiedlich. Grundstzlich gibt es standardi-sierte Formatbezeichner wie D, E, X usw. sowie benutzerdefinierte Formate wie #.## und 0000. Hiereinige Beispiele:

    Verschiedene Formatierungen fr Integer-Werte:

    erzeugen die Ausgabe

    Oder fr Double-Werte:

    mit den Ausgaben

    Bei der Verwendung von Dezimal- und Tausendertrennzeichen werden die lnderspezifischenEinstellungen des Betriebssystems bercksichtigt. Die Beispielausgaben wurden auf einem deut-schen Betriebssystem erzeugt.

    Zur Formatierung von Datum und Uhrzeit siehe 2.36((Umgang mit Datum und Uhrzeit)).

    5 Positive und negative Zahlen unterschiedlich formatieren

    In manchen Fllen mssen positive und negative Werte unterschiedlich behandelt werden. Hier-fr lsst sich der Format-String in Abschnitte aufteilen. Diese Abschnitte werden mit einem Semi-kolon getrennt. Zwei oder drei Abschnitte sind mglich.

    Dim value As Integer = 876Debug.WriteLine(value.ToString("00000"))Debug.WriteLine(value.ToString("d"))Debug.WriteLine(value.ToString("e"))Debug.WriteLine(value.ToString("X"))

    008768768,760000e+00236C

    Dim value As Double = 0.43219Debug.WriteLine(value.ToString("G"))Debug.WriteLine(value.ToString("00.00"))Debug.WriteLine(value.ToString("##.##"))Debug.WriteLine(value.ToString("0.00%"))Debug.WriteLine(value.ToString("E"))

    0,4321900,43,4343,22%4,321900E-001

  • Zusammengesetzte Formatierungen 37

    !"

    #

    "

    $%&

    '

    (

    Bei zwei Abschnitten gibt der erste das Format fr positive Zahlen und Null an, der zweite dasFormat fr negative Zahlen. Bei drei Abschnitten gibt der erste das Format fr positive Zahlen,der zweite fr negative Zahlen und der dritte fr den Wert Null an.

    Die Ausgabe in der For-Schleife

    erzeugt die Ausgaben:

    6 Zusammengesetzte FormatierungenMit Hilfe der Methode String.Format knnen Sie auf einfache Weise komplexe Werte formatiertzusammenfhren. Als ersten Parameter bergeben Sie hierzu einen Format-String. Die bentig-ten Werte sind die nachfolgenden Parameter:

    Der Format-String kann beliebigen Text beinhalten. Um an einer bestimmten Position einen derbergebenen Werte einzusetzen, geben Sie dessen Index in geschweiften Klammern an. Beispiel:

    Erzeugt die Ausgabe:

    Fr jeden Parameter knnen Sie, abgetrennt durch einen Doppelpunkt, die Formatierung whlen.Der Format-String

    eingesetzt in obigem Code fhrt zu folgender Ausgabe:

    For i As Integer = -1 To 1 Debug.WriteLine(i.ToString("Positiv: +00;Negativ: -00;Null: 00"))Next

    Negativ: -01Null: 00Positiv: +01

    String.Format ( Formatstring, Wert1, Wert2, Wert3 ...)

    Dim d As Double = 54.293Dim i As Integer = 200Dim x As Integer = 1023Dim p As Double = 0.55Dim t As Stringt = String.Format("d: {0}, i: {1}, x: {2}, p:{3}", d, i, x, p)Debug.WriteLine(t)

    d: 54,293, i: 200, x: 1023, p:0,55

    "d: {0:0.0}, i: {1:0000}, x: {2:X}, p:{3:0.0%}"

    d: 54,3, i: 0200, x: 3FF, p:55,0%

  • 38 Basics

    7 Format-Provider fr eigene Klassen definierenAuch fr Ihre eigenen Klassen knnen Sie Formatierungen durch Format-Strings untersttzen.Hierzu mssen Sie lediglich die Schnittstelle IFormattable implementieren und die MethodeToString mit den entsprechenden Parametern berladen. Sie knnen beliebige Format-Stringsuntersttzen. Einzig das Format G ist Pflicht.

    In Listing 1 sehen Sie ein Beispiel fr die Klasse Vector, die die Formate X, Y, Z und G untersttzt.Fr X und Y wird jeweils der Zahlenwert der betreffenden Komponente zurckgegeben, bei Z einespezielle Formatierung mit spitzen Klammern und bei G und allen anderen die Standard-Forma-tierung, die auch die ToString-berladung ohne Parameter zurckgibt.

    Die Ausgaben

    Public Class Vector Implements IFormattable

    Public X, Y As Double

    Public Sub New(ByVal x As Double, ByVal y As Double) Me.X = x Me.Y = y End Sub

    Public Overloads Overrides Function ToString() As String Return String.Format("({0},{1})", X, Y) End Function

    Public Overloads Function ToString(ByVal format As String, _ ByVal formatProvider As System.IFormatProvider) As String _ Implements System.IFormattable.ToString

    ' Gewnschtes Format bercksichtigen Select Case format Case "X", "x" : Return X.ToString("0.00") Case "Y", "y" : Return Y.ToString("0.00") Case "Z", "z" : Return String.Format( _ "", X, Y) Case "G", "g" : Case Else : Return Me.ToString() End Select End Function

    End Class

    Listing 1: Untersttzen von Format-Anweisungen durch Implementierung der Schnittstelle IFormattable

    Dim V1 As New Vector(4.283, 6.733)Dim V2 As New Vector(21.4, 55.2)

  • Ausgaben in lnderspezifischen Formaten 39

    !"

    #

    "

    $%&

    '

    (

    fhren zu folgendem Ergebnis:

    8 Ausgaben in lnderspezifischen FormatenFormatierte Zahlen- und Datumsausgaben erfolgen stets in den kulturspezifischen Formaten, wiesie in den Lndereinstellungen des Betriebssystems vorgegeben worden sind. Sie knnen dieseEinstellung aber temporr fr den laufenden Thread ndern, um nachfolgende Ausgaben ineinem lnderspezifischen Format eines anderen Landes zu formatieren.

    Zunchst bentigen Sie hierzu die Referenz des CultureInfo-Objektes der gewnschten Kultur.Diese erhalten Sie beispielsweise ber die Methode CultureInfo.CreateSpecificCulture. berge-ben knnen Sie den aus Sprachcode und Landescode bestehenden Namen (siehe RFC 1766), z.B.de-DE, en-US, nl-NL usw.

    Anschlieend weisen Sie die Referenz der CurrentCulture-Eigenschaft des laufenden Threads zu.Danach erfolgen alle Formatierungen mit dem neu eingestellten Format, bis Sie wieder ein ande-res CultureInfo-Objekt zuweisen.

    Ein Beispiel hierzu: Der folgende Code

    erzeugt auf einem Betriebssystem mit der Lndereinstellung DEUTSCH-DEUTSCHLAND diese Aus-gabe:

    Mchten Sie nun die gleiche Ausgabe im Format ENGLISCH-AUSTRALIEN vornehmen, dann weisenSie dem aktuellen Thread das fr Australien spezifische CultureInfo-Objekt zu:

    Debug.WriteLine(String.Format("{0} und {1}", V1, V2))Debug.WriteLine(String.Format("{0:z} und {1:z}", V1, V2))Debug.WriteLine(String.Format("{0:x} und {0:y}", V1))

    (4,283,6,733) und (21,4,55,2) und 4,28 und 6,73

    Debug.WriteLine("ISO-Datum: " & DateTime.Now.ToString("s"))Debug.WriteLine("Datum : " & DateTime.Now.ToString())Debug.WriteLine("Double : " & 123456.78.ToString())Debug.WriteLine("Double : " & 123456.78.ToString("#,###.##"))Debug.WriteLine("Whrung: " & 123.456.ToString("C"))

    ISO-Datum: 2003-10-13T13:35:06Datum : 13.10.2003 13:35:06Double : 123456,78Double : 123.456,78Whrung: 123,46 _

    Imports System.GlobalizationImports System.Threading

  • 40 Basics

    Die Ausgabe des obigen Codes sieht danach so aus:

    Wenn Sie spter wieder auf das ursprngliche Format zurckschalten wollen, speichern Sie sicham besten in einer Hilfsvariablen vor der ersten nderung die Referenz der aktuellen Einstellungund weisen diese spter Thread.CurrentThread.CurrentCulture wieder zu.

    Auf der Buch-CD finden Sie ein Beispielprogramm, mit dem Sie die Ausgaben in unterschiedli-chen Lndereinstellungen ausprobieren knnen (siehe Abbildung 1). Wie Sie eine TreeView mitden Namen der Lndereinstellungen fllen, erfahren Sie im nchsten Rezept.

    ' CultureInfo-Objekt anlegenDim cultInfo As CultureInfocultInfo = CultureInfo.CreateSpecificCulture("en-AU")

    ' Aktuelle Kultur ndernThread.CurrentThread.CurrentCulture = cultInfo

    ISO-Datum: 2003-10-13T13:34:14Datum : 13/10/2003 1:34:14 PMDouble : 123456.78Double : 123,456.78Whrung: $123.46

    Abbildung 1: Lnderspezifische Formatierungen von Zahlen- und Datumswerten

  • Informationen zu lnderspezifischen Einstellungen abrufen 41

    !"

    #

    "

    $%&

    '

    (

    9 Informationen zu lnderspezifischen Einstellungen abrufen

    Alle von Windows vorgesehenen lnderspezifischen Informationen und Formate lassen sich auchim Programmcode abrufen. Eine Liste der CultureInfo-Objekte erhalten Sie durch den Aufruf derstatischen Methode CultureInfo.GetCultures. ber einen Parameter vom Typ CultureTypesknnen Sie festlegen, welche Art von CultureInfo-Objekten als Array zurckgegeben wird.Tabelle 2 gibt Aufschluss ber die Bedeutung der mglichen Konstanten.

    Um ein TreeView-Steuerelement mit den Namen der verfgbaren Kulturen zu fllen, wie inAbbildung 1 und Abbildung 2 zu sehen ist, werden zunchst alle neutralen Kulturen, also alle, diekeinem spezifischen Land oder Region zugeordnet sind, abgerufen und als Stammknoten derTreeView hinzugefgt (siehe Listing 2). Fr die Anzeige des Namens knnen Sie whlen, welcheDarstellung der Bezeichnung Sie verwenden mchten:

    Betriebssystemspezifische Darstellung (Name in der Sprache des Betriebssystems, EigenschaftDisplayName)

    Englische Bezeichnung (Eigenschaft EnglishName)

    Den Namen in der Landessprache (z.B. fr Arabisch, Eigenschaft NativeName)

    Das Zwei/Vier-Buchstaben-Krzel (z.B. en fr Englisch bzw. en-us fr Englisch-USA, Eigen-schaft Name)

    Das Drei-Buchstaben-Krzel (z.B. DEU oder deu fr Deutsch, Eigenschaften ThreeLetterWin-dowsLanguageName bzw. ThreeLetterISOLanguageName)

    sowie weitere weniger wichtige.

    Anschlieend werden alle lnderspezifischen CultureInfo-Objekte abgefragt. Fr jedes Objektdieser Liste wird in der TreeView der zugehrige Stammknoten gesucht (das neutrale Culture-Info-Objekt mit der gleichen Sprachkennung, Eigenschaft ThreeLetterISOLanguageName).

    Fr jeden Knoten wird in der Tag-Eigenschaft die Referenz des zugehrigen CultureInfo-Objek-tes fr den spteren Zugriff gespeichert.

    Konstante Bedeutung

    AllCultures Alle Kulturen

    InstalledWin32Cultures Alle Kulturen, die im Betriebssystem installiert sind. In der Regel sind

    das weniger als die vom Framework untersttzten

    NeutralCultures Kulturen, die nur einer Sprache zugeordnet sind, aber keinem

    bestimmten Land (z.B. Deutsch).

    SpecificCultures Einem bestimmten Land zugeordnete Kulturen (z.B. Deutsch-

    Deutschland)

    Tabelle 2: Enumerationskonstanten fr den Aufruf von CultureInfo.GetCultures

    Dim tn As TreeNode

    ' Alle neutralen Kulturen durchlaufen und als Stammknoten' in der TreeView eintragen

    Listing 2: Fllen einer TreeView mit den Namen der verfgbaren Kulturen

  • 42 Basics

    Jedes CultureInfo-Objekt verfgt ber eine Reihe weiterer Informationen. Diese Informationenlassen sich leicht mit Hilfe eines Eigenschaftsfensters (PropertyGrid-Control) darstellen. Dazuwird der Eigenschaft SelectedObject des PropertyGrid-Controls die Referenz des ausgewhltenCultureInfo-Objektes zugewiesen (Listing 3). Nheres zum PropertyGrid-Steuerelement erfahrenSie in Kapitel 0 ((Eigenschaftsfenster (PropertyGrid))).

    Von besonderem Interesse im Zusammenhang mit den Zahlen- und Datumsformaten sind nochdie Eigenschaften DateTimeFormat und NumberFormat. Sie verweisen auf Objekte vom Typ

    For Each cult As CultureInfo In CultureInfo.GetCultures( _ CultureTypes.NeutralCultures)

    ' Displayname im Baum anzeigen tn = New TreeNode(cult.DisplayName)

    ' Verweis auf CultureInfo-Objekt speichern tn.Tag = cult

    ' Knoten hinzufgen TVCultures.Nodes.Add(tn)

    Next

    ' Alle lnderspezifischen CultureInfo-Objekte durchlaufenFor Each cult As CultureInfo In CultureInfo.GetCultures( _ CultureTypes.SpecificCultures)

    ' Displayname fr TreeView-Anzeige tn = New TreeNode(cult.DisplayName)

    ' Verweis auf CultureInfo-Objekt speichern tn.Tag = cult

    ' Stammknoten suchen, der die neutrale Kultur enthlt For Each n As TreeNode In TVCultures.Nodes

    ' CultureInfo-Objekt des Stammknotens Dim ncult As CultureInfo = DirectCast(n.Tag, CultureInfo)

    ' Ist es der richtige? If ncult.ThreeLetterISOLanguageName = _ cult.ThreeLetterISOLanguageName Then

    ' Ja, hier den Knoten einfgen n.Nodes.Add(tn)

    ' Weiter mit dem nchsten lnderspez. CultureInfo-Objekt Exit For End If NextNext

    Listing 2: Fllen einer TreeView mit den Namen der verfgbaren Kulturen (Forts.)

  • Informationen zu lnderspezifischen Einstellungen abrufen 43

    !"

    #

    "

    $%&

    '

    (

    DateTimeFormatInfo bzw. NumberFormatInfo, die viele weitere Details zu den jeweiligen Formatenbereitstellen. In Abbildung 2 sehen Sie zwei weitere Eigenschaftsfenster, die diese zustzlichenInformationen anzeigen. Die Informationen stehen jedoch nur zur Verfgung, wenn die ausge-whlte Kultur nicht neutral ist.

    Abbildung 2: Lnderspezifische Informationen abrufen und anzeigen

    Private Sub TVCultures_AfterSelect(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.TreeViewEventArgs) _ Handles TVCultures.AfterSelect

    ' Knoten expandieren e.Node.Expand()

    ' Eigenschaften des CultureInfo-Objektes anzeigen PGCultureInfo.SelectedObject = e.Node.Tag

    ' Wenn es sich nicht um ein neutrales CultureInfo-Objekt handelt, ' dann auch die Informationen zu Datums- und Zahlenformaten ' anzeigen Dim ncult As CultureInfo = DirectCast(e.Node.Tag, CultureInfo) If ncult.IsNeutralCulture Then PGDateTimeInfo.SelectedObject = Nothing PGNumberInfo.SelectedObject = Nothing

    Listing 3: Anzeigen weiterer Informationen bei Auswahl einer Kultur in der TreeView

  • 44 Basics

    Der auf der Buchseite zur Verfgung stehende Platz ist leider begrenzt, so dass die Spalten in derAbbildung nur eingeschrnkt sichtbar sind. Das vollstndige Programm steht Ihnen aber auf derBuch-CD zur Verfgung. Alle Steuerelemente sind durch Splitter-Controls voneinander getrennt,so dass Sie die Spaltenbreiten anpassen knnen.

    10 Grter und kleinster Wert eines numerischen Datentyps

    Jeder der numerischen Basistypen verfgt ber die konstanten Felder MinValue und MaxValue, dieAuskunft ber seinen Wertebereich geben. Wie in Listing 4 dargestellt, knnen Sie so zur Laufzeitdiese Werte ermitteln und nutzen. Der Code im Listing fllt eine ListView mit den abgefragtenWerten ().

    Else PGDateTimeInfo.SelectedObject = ncult.DateTimeFormat PGNumberInfo.SelectedObject = ncult.NumberFormat End If

    End Sub

    Dim lvi As ListViewItem

    ' Bytelvi = LVMinMax.Items.Add("Byte")lvi.SubItems.Add(Byte.MinValue.ToString())lvi.SubItems.Add(Byte.MaxValue.ToString())

    ' Shortlvi = LVMinMax.Items.Add("Short")lvi.SubItems.Add(Short.MinValue.ToString())lvi.SubItems.Add(Short.MaxValue.ToString())

    ' Integerlvi = LVMinMax.Items.Add("Integer")lvi.SubItems.Add(Integer.MinValue.ToString())lvi.SubItems.Add(Integer.MaxValue.ToString())

    ' Longlvi = LVMinMax.Items.Add("Long")lvi.SubItems.Add(Long.MinValue.ToString())lvi.SubItems.Add(Long.MaxValue.ToString())

    ' Singlelvi = LVMinMax.Items.Add("Single")lvi.SubItems.Add(Single.MinValue.ToString())lvi.SubItems.Add(Single.MaxValue.ToString())

    Listing 4: ListView mit Informationen zu den Wertebereichen der numerischen Datentypen fllen

    Listing 3: Anzeigen weiterer Informationen bei Auswahl einer Kultur in der TreeView (Forts.)

  • Berechnen der signifikanten Vorkommastellen 45

    !"

    #

    "

    $%&

    '

    (

    11 Berechnen der signifikanten VorkommastellenIn manchen Situationen ist es erforderlich, Zahlenformate dynamisch an vernderliche Wertebe-reiche anzupassen. Ein Beispiel hierfr ist der Aufbau der Koordinatenskalierung eines Dia-gramms. Fr Zahlen im Bereich von 0.0 bis 10.0 muss ein anderes Format eingestellt werden alsfr Zahlen im Bereich von -5000 bis +5000. Um ein solches Format zur Laufzeit festlegen zu kn-nen, muss die Anzahl der signifikanten Vorkommastellen ermittelt werden.

    Der Zehner-Logarithmus eines Wertes gibt einen ersten Anhaltspunkt fr die Anzahl der Vor-kommastellen (Dekade). Fr Zahlen, die keine Zehnerpotenz darstellen, liegt er immer unterhalbder gesuchten Dekade und immer oberhalb der nchstkleineren Dekade. In diesen Fllen gengtes, auf die nchste ganze Zahl aufzurunden, um die Anzahl der Stellen zu berechnen.

    Handelt es sich bei dem Wert um eine Zehnerpotenz, dann muss auf den Wert des Logarithmus 1aufaddiert werden (Beispiel: Log10(100) = 2, Anzahl Stellen = 3).

    ' Doublelvi = LVMinMax.Items.Add("Double")lvi.SubItems.Add(Double.MinValue.ToString())lvi.SubItems.Add(Double.MaxValue.ToString())

    ' Decimallvi = LVMinMax.Items.Add("Decimal")lvi.SubItems.Add(Decimal.MinValue.ToString())lvi.SubItems.Add(Decimal.MaxValue.ToString())

    ' DateTimelvi = LVMinMax.Items.Add("DateTime")lvi.SubItems.Add(DateTime.MinValue.ToString())lvi.SubItems.Add(DateTime.MaxValue.ToString())

    ' TimeSpanlvi = LVMinMax.Items.Add("TimeSpan")lvi.SubItems.Add(TimeSpan.MinValue.ToString())lvi.SubItems.Add(TimeSpan.MaxValue.ToString())

    Abbildung 3: Die Zahlenbereiche der numerischen Datentypen

    Listing 4: ListView mit Informationen zu den Wertebereichen der numerischen Datentypen fllen

  • 46 Basics

    Die vollstndige Implementierung der Funktion sehen Sie in Listing 5. Nach Entfernen des Vor-zeichens wird fr Werte, die kleiner sind als 10, der Wert 1 zurckgegeben. Fr alle anderen Wertewird der Logarithmus berechnet. Ist er identisch mit dem aufgerundeten Ergebnis, dann handeltes sich um eine glatte Zehnerpotenz, so dass der um 1 erhhte Wert zurckgegeben werden muss.Anderenfalls wird der aufgerundete Logarithmuswert zurckgegeben.

    Ein kleines Testbeispiel

    mit den folgenden Aufrufen

    Public Shared Function SignificantDigits(ByVal value As Double) _ As Integer

    ' Absolutwert bestimmen Dim val As Double = Math.Abs(value)

    ' Werte kleiner als 10 haben immer eine Vorkommastelle If val < 10.0 Then Return 1

    ' Logarithmus und Dekade berechnen Dim log As Double = Math.Log10(val) Dim decade As Double = Math.Ceiling(log)

    ' Glatte Werte (fr 10, 100, 1000 etc.) mssen um 1 erhht werden If decade = log Then Return CInt(decade + 1)

    ' Ansonsten passt es Return CInt(decade)

    End Function

    Listing 5: Berechnen der signifikanten Vorkommastellen eines Double-Wertes

    Private Sub Output(ByVal value As Double) ' Testausgabe formatieren Debug.WriteLine(String.Format( _ "{0} hat {1} signifikante Vorkommastellen", _ value, SignificantDigits(value)))End Sub

    Output(0.5)Output(7.9)Output(10.0)Output(99.9999)Output(100)Output(101.5)Output(123456789.0)Output(-987654321.1)

  • Lange einzeilige Texte umbrechen 47

    !"

    #

    "

    $%&

    '

    (

    erzeugt diese Ausgabe:

    Die beschriebene Implementierung funktioniert bis ca. 13 Stellen. Darber hinaus ergeben sichFehler aufgrund der Rechengenauigkeiten.