Sie sind auf Seite 1von 680

visual basic 6 referenz

visual basic 6 referenz


rudolf huttary

new technology
Markt+Technik Verlag

Die Deutsche Bibliothek CIP-Einheitsaufnahme Ein Titeldatensatz fr diese Publikation ist bei Der Deutschen Bibliothek erhltlich. 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, Herausgeber 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. Fast 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. Die Einschrumpffolie zum Schmutz vor Verschmutzung ist aus umweltvertrglichem und recyclingfhigem PE-Material.

10 9 8 7 6 5 4 3 2 1 03 02 01 00

ISBN 3-8272-5588-0

2000 by Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH, Martin-Kollar-Strae 1012, D 81829 Mnchen/Germany Alle Rechte vorbehalten Lektorat: Erik Franz, efranz@pearson.de Herstellung: Claudia Burle, cbaeurle@pearson.de Satz: reemers publishing services gmbh, Krefeld Druck und Verarbeitung: Media Print, Paderborn Printed in Germany

Inhaltsverzeichnis
Vorwort
Lesebuch und Nachschlagewerk Gut verwurzelt: traditionelles Basic vs. Visual Basic Zielgruppe

15
15 16 18

Teil I: Referenzteil
Grundlegendes
Programme und Module in Visual Basic Programm Modul Projekt Arten von Modulen in einem Projekt Literale und Konstanten Anweisungen Bezeichner und Namensraum Kontrollstrukturen Unbedingte und bedingte Verzweigung, Subroutinen Fallunterscheidung Schleifen Fehlerbehandlung

21
23
23 23 24 24 25 27 33 34 36 36 38 40 43

Datentypen und ihre Operationen


Elementare Datentypen Der Datentyp Variant Die Datentypen Integer, Long, Single und Double Die Datentypen Boolean und Byte Die Datentypen Currency und Date Der Datentyp Decimal Operatoren fr elementare Datentypen und logische Bedingungen Arrays Typumwandlung Benutzerdefinierte Datentypen Type-Datentypen Enum-Aufzhlungen Funktionen und Anweisungen fr Zeichenfolgen Asc-, AscB- und AscW-Funktion Chr-, ChrB- und ChrW-Funktion Filter-Funktion Format-Funktion FormatCurrency-Funktion FormatDateTime-Funktion FormatNumber-Funktion

49
49 50 51 52 52 53 54 55 57 60 61 62 63 66 67 68 69 73 74 75

Inhaltsverzeichnis

FormatPercent-Funktion 75 Hex-Funktion 76 InStr- und InStrB-Funktion 76 InStrRev-Funktion 77 Join-Funktion 78 LCase-Funktion 79 Left- und LeftB-Funktion 79 Len- und LenB-Funktion 79 LSet-Anweisung 80 LTrim-Funktion 81 Mid- und MidB-Funktion 81 Mid- und MidB-Anweisung 82 MonthName-Funktion 82 Oct-Funktion 82 Option Compare-Anweisung 83 Replace-Funktion 84 Partion-Funktion 85 Right- und RightB-Funktion 85 RSet-Anweisung 86 RTrim-Funktion 86 Space-Funktion 86 Split-Funktion 87 Str-Funktion 87 StrComp-Funktion 88 StrConv-Funktion 89 String-Funktion 90 StrReverse-Funktion 90 Trim-Funktion 90 UCase-Funktion 91 Val-Funktion 91 WeekdayName-Funktion 92 Mathematische und finanzmathematische Funktionen und Anweisungen 92 Abs-Funktion 94 Atn-Funktion 95 Cos-Funktion 95 DDB-Funktion 96 Exp-Funktion 97 Fix-Funktion 97 FV-Funktion 98 Int-Funktion 99 IPmt-Funktion 99 IRR-Funktion 100 Log-Funktion 101 MIRR-Funktion 102 NPer-Funktion 103 NPV-Funktion 104

Inhaltsverzeichnis

Pmt-Funktion PPmt-Funktion PV-Funktion Randomize-Anweisung Rate-Funktion Rnd-Funktion und Rnd-Anweisung Round-Funktion Sgn-Funktion Sin-Funktion SLN-Funktion Sqr-Funktion SYD-Funktion Tan-Funktion Funktionen und Anweisungen fr Datums-/Zeitwerte CDate-Funktion Date-Funktion und Date-Anweisung DateAdd-Funktion DateDiff-Funktion DatePart-Funktion DateSerial-Funktion DateValue-Funktion Day-Funktion FileDateTime-Funktion FormatDateTime-Funktion Hour-Funktion Minute-Funktion Month-Funktion MonthName-Funktion Now-Funktion Second-Funktion Time-Funktion und Time-Anweisung Timer-Funktion TimeSerial-Funktion TimeValue-Funktion Weekday-Funktion WeekdayName-Funktion Year-Funktion Dateiorientierte Funktionen und Anweisungen ChDir-Anweisung ChDrive-Anweisung Close-Anweisung CurDir-Funktion Dir-Funktion Environ-Funktion EOF-Funktion FileAttr-Funktion

105 106 106 107 108 109 110 110 112 112 113 113 114 114 116 116 116 117 118 119 120 121 121 121 121 121 122 122 122 122 123 124 124 125 125 126 126 126 131 132 133 134 135 136 137 138

Inhaltsverzeichnis

FileCopy-Anweisung FileDateTime-Funktion FileLen-Funktion FreeFile-Funktion Get-Anweisung GetAttr-Funktion Input- und InputB-Funktion Input #-Anweisung Kill-Anweisung Line Input #-Anweisung Loc-Funktion Lock-Anweisung LOF-Funktion LSet-Anweisung MkDir-Anweisung Name-Anweisung Open-Anweisung Print #-Anweisung Put-Anweisung Reset-Anweisung RmDir-Anweisung Seek-Anweisung und Seek-Funktion SetAttr-Anweisung Shell-Anweisung Unlock-Anweisung Write #-Anweisung

138 139 139 139 140 142 142 143 144 145 146 146 147 148 148 148 149 151 153 154 155 156 157 158 159 159

Variablen
Variablendeklaration Typkennzeichen und Bezeichnerbereiche fr Typen Variableninitialisierung Geltungsbereiche von Variablen

161
162 167 168 173

Funktionen und Prozeduren


Parameterbergabe an Funktionen und Prozeduren Funktionen selbst definieren Prozeduren selbst definieren Routinen aus DLLs und der Windows-API einsetzen

175
178 181 183 185

Objekte und Klassen


Klassen als Datentypen fr Objektvariablen Ereignisroutinen Standardereignisse Activate-Ereignis und Deactivate-Ereignis Change-Ereignis Click-Ereignis DblClick-Ereignis

195
196 204 207 212 214 215 217

Inhaltsverzeichnis

DragDrop-Ereignis DragOver-Ereignis GotFocus-Ereignis und LostFocus-Ereignis Initialize-Ereignis KeyDown-Ereignis und KeyUp-Ereignis KeyPress-Ereignis LinkClose-Ereignis LinkError-Ereignis LinkExecute-Ereignis LinkNotify-Ereignis LinkOpen-Ereignis Load-Ereignis MouseDown-Ereignis und MouseUp-Ereignis MouseMove-Ereignis OLECompleteDrag-Ereignis OLEDragDrop-Ereignis OLEDragOver-Ereignis OLEGiveFeedback-Ereignis OLESetData-Ereignis OLEStartDrag-Ereignis Paint-Ereignis QueryUnload-Ereignis Resize-Ereignis Terminate-Ereignis Unload-Ereignis Validate-Ereignis Global-Objekt App-Objekt CallByName-Methode Clipboard-Objekt Command-Methode CreateObject-Methode DeleteSetting-Methode DoEvents-Methode Err-Objekt Forms-Auflistung GetAllSettings-Methode GetObject-Methode GetSetting-Methode InputBox-Methode Load-Methode LoadPicture-Methode LoadResData-Methode, LoadResPicture-Methode, LoadResString-Methode Printer-Objekt Printers-Auflistung

218 221 222 224 225 228 230 231 232 233 233 236 237 239 241 242 245 247 248 250 253 256 257 258 259 260 261 264 269 270 273 273 275 276 277 279 279 280 281 281 282 283 284 284 297

Inhaltsverzeichnis

QBColor-Methode RGB-Methode SavePicture-Methode SaveSetting-Methode Screen-Objekt Sendkeys-Methode Unload-Methode Auflistungen und Collection-Objekte Formulare Form-Objekt (Basisobjekt fr Formulare) MDIForm-Objekt Selbst definierte Klassen ClassModul-Schnittstelle

298 299 299 300 300 302 303 304 306 307 313 318 320

Steuerelemente
Gemeinsame Eigenschaften Alignment-Eigenschaft Appearance-Eigenschaft AutoSize-Eigenschaft BackColor-Eigenschaft und ForeColor-Eigenschaft BackStyle-Eigenschaft BorderStyle-Eigenschaft Caption-Eigenschaft Container-Eigenschaft CausesValidation-Eigenschaft DataChanged-Eigenschaft DataField-Eigenschaft DataFormat-Eigenschaft DataMember-Eigenschaft DataSource-Eigenschaft DisabledPicture-Eigenschaft DownPicture-Eigenschaft DragIcon-Eigenschaft DragMode-Eigenschaft DrawMode-Eigenschaft DrawStyle-Eigenschaft Enabled-Eigenschaft FillColor-Eigenschaft FillStyle-Eigenschaft Font-Eigenschaft ForeColor-Eigenschaft HasDC-Eigenschaft hDC-Eigenschaft Height-Eigenschaft und Width-Eigenschaft HelpContextID-Eigenschaft und WhatsThisHelpID-Eigenschaft hWnd-Eigenschaft Image-Eigenschaft

321
323 327 328 329 330 331 332 334 335 335 336 336 338 339 339 341 341 342 343 344 346 347 348 349 349 350 350 351 351 353 354 354

10

Inhaltsverzeichnis

Index-Eigenschaft Left-Eigenschaft und Top-Eigenschaft MaskColor-Eigenschaft MouseIcon-Eigenschaft MousePointer-Eigenschaft MultiLine-Eigenschaft Name-Eigenschaft OLEDropAllowed- und OLETypeAllowed-Eigenschaften OLEDropMode-Eigenschaft Parent-Eigenschaft Picture-Eigenschaft RightToLeft-Eigenschaft ScaleLeft-Eigenschaft und ScaleTop-Eigenschaft ScaleHeight-Eigenschaft und ScaleWidth-Eigenschaft ScaleMode-Eigenschaft ShowTips-Eigenschaft Style-Eigenschaft TabIndex-Eigenschaft TabStop-Eigenschaft Tag-Eigenschaft ToolTipText-Eigenschaft UseMaskColor-Eigenschaft Visible-Eigenschaft WhatsThisHelp-Eigenschaft WhatsThisHelpID-Eigenschaft Width-Eigenschaft Gemeinsame Methoden Drag-Methode LinkExecute-Methode LinkPoke-Methode LinkRequest-Methode LinkSend-Methode Move-Methode OLEDrag-Methode Refresh-Methode SetFocus-Methode ShowWhatsThis-Methode ZOrder-Methode Standardsteuerelemente Anzeige-Steuerelement (Image) Befehlsschaltflche-Steuerelement (CommandButton) Bezeichnungsfeld-Steuerelement (Label) Bildfeld-Steuerelement (PictureBox) Bildlaufleisten-Steuerelemente (HScrollBar, VScrollBar) Dateilistenfeld-Steuerelement (FileListBox) Data-Datensteuerelement (Data)

356 357 358 359 360 361 361 362 363 364 365 366 366 368 369 371 372 375 376 376 377 377 378 378 378 379 379 379 380 381 382 382 383 383 384 385 386 386 387 390 392 393 395 398 400 402

11

Inhaltsverzeichnis

Figur-Steuerelement (Shape) Kombinationsfeld-Steuerelement (ComboBox) Kontrollkstchen-Steuerelement (CheckBox) Laufwerklistenfeld-Steuerelement (DriveListBox) Linie-Steuerelement (Line) Listenfeld-Steuerelement (ListBox) OLE-Container-Steuerelement (OLE) Optionsfeld-Steuerelement (OptionButton) Rahmen-Steuerelement (Frame) Textfeld-Steuerelement (TextBox) Verzeichnislistenfeld-Steuerelement (DirListBox) Zeitgeber-Steuerelement (Timer) ActiveX-Steuerelemente (OCX) Windows-Standardsteuerelemente Abbildungsliste-Steuerelement (ImageList) Weitere ActiveX-Steuerelemente Bildausschnitt-Steuerelement (PictureClip) Standarddialoge-Steuerelement (CommonDialog)

406 407 409 410 411 412 415 424 426 427 431 432 433 436 439 442 444

Teil II: Praxisteil


ltere Basic-Programme nach Visual Basic portieren
Wie importiert man den Quelltext? Einfache Programme Implementation einer eigenen Input-Routine Anspruchsvollere Programme Implementation von Inkey$ Implementation von LOCATE, POS, CSRLIN und COLOR Koordinatensystem und Grafikmodus Zusammenfassung der Emulation als Standardmodul Von WANKEL.BAS zur WankelAnimation Die portierte Fassung

451
453
454 454 456 457 459 460 461 463 468 472

Mathematik und Algorithmen


ApfelmannZoom eine Fahrt durch die Mandelbrotmenge Implementation des Apfelmnnchen-Algorithmus Optimierung Ereignisbehandlung mit DoEvents, ein komplexes Problemfeld Benutzerschnittstelle Der Stack Einzelbilder speichern

477
478 484 485 485 487 488 489

Formulare und Ansichten


Ereignisbehandlung Gummiband Bereiche interaktiv auswhlen DDE-Verbindungen OLE-Drag&Drop

491
491 492 495 501

12

Inhaltsverzeichnis

DiaProjektor SDI-Formulare synchronisieren Das Programmdesign Info-Dialog als gebundenes Formular aufrufen Ereignisse delegieren und Instanziierung durch One-Shot-Logik Programmstart und Auswahl der Bilddateien im Standarddialog ffnen Das Anzeigesystem Bilder einlesen und in maximaler Gre zeichnen Vollbildanzeige Men und Kontextmen Benutzerschnittstelle Bildlaufleisten fr Ansichten einsetzen und auf Grennderungen reagieren Bildlauf ein kleiner Betrachter fr groe Bilder HexView eine schnelle Textansicht fr groe Dateien Registrierung RegTest Sitzungen wieder aufnehmen

511 514 525 525 527 530 535 536 538 542 544 545 551 561 562

Objektorientiertes Basic
Klassen selbst definieren Ring eine einfache Klasse demonstriert Grundlegendes 3DAnimation Drahtgittermodelle frei im Raum gedreht Point3D ein Punkt im Raum Line3D eine Linie aus zwei Punkten ActiveX-Steuerelemente und Benutzersteuerelemente LongTimer der Timer mit Ausdauer Transparenz und Drag&Drop MemoryEdit das Textfeld mit Gedchtnis Kurzreferenz der Schlsselwrter mit Vergleich zu QBasic

567
567 568 577 582 586 599 599 606 615 642

Tabellenindex

659

13

Vorwort
Wer heute nicht tglich mit einem bestimmten Produkt, etwa einem Entwicklungssystem wie Visual Basic, einer Tabellenkalkulation oder einer Textverarbeitung arbeitet, sondern eher sporadisch, dem bleibt nichts anderes brig, als erst einmal erhebliche Mengen an wertvoller Zeit schlicht damit zu vergeuden, sich und sein System immer wieder auf den neuesten Stand des jeweiligen Produkts zu bringen. Der Effizienzvorsprung, den der neueste Stand des Produkts verspricht, muss oft sehr teuer mit Lernaufwand und der Umgestaltung bestehender Lsungen erkauft werden. Die Hersteller wollen nicht nur, dass ein Produkt in der neuen Version uerlich anders erscheint, die zustzlichen Features sowie die Anpassung an eine sich stndig ndernde Umgebung (Benutzeroberflche, Betriebssystem, Entwicklungsplattform, Vernetzung, verwandte Produkte) erzwingen in den meisten Fllen auch nderungen des inneren Aufbaus, eingefhrter Daten- und Kommunikationsstrukturen und nicht zuletzt auch erhebliche nderungen in der Dokumentation. Damit wren wir bereits beim Thema.

Lesebuch und Nachschlagewerk


Dieses Buch reiht sich mit seinem Titel in die 1999 neu ins Leben gerufene Referenzreihe des Markt+Technik-Verlags ein. Mageblich fr das Erscheinen dieser neuen Reihe war der Wunsch vieler semi- wie professioneller Programmierer nach verdichteten Referenzinformationen mit ineinander greifender theoretischer und praktischer Aufarbeitung, mit anderen Worten, der schnelle und gleichzeitig kompetente berblick ber ein Sprachprodukt mit nichttrivialen praktischen Anregungen als Nachschlagewerk fr den Einstieg, Umstieg sowie die Auffrischung fr die konkrete Arbeit mit dem Produkt. Die Titel in dieser Reihe geben Antwort auf die Fragen Was ist das? und Wie geht das? und dies in einer fr den Einzelnen noch berschaubaren Weise. Das Buch soll dem Kufer als Lesebuch und als Nachschlagewerk dienen, es soll ihm also das ntige Know-how fr seine Programmierttigkeit vermitteln und ihm gleichzeitig Anregungen und Lsungen anbieten, die er in seine Programmierarbeit einflieen lassen kann. Schaltstelle und Garant fr die gute gegenseitige Durchdringung der Themen im Referenz- und Praxisteil ist der zentrale Tabellenindex im Anhang, dessen themen- und sachbezogene Eintrge berwiegend in beiden Teilen Fundstellen ausweisen. Heutige Online-Hilfen zu Produkten knnen dies aus verschiedenen Grnden eher schlecht als recht bzw. immer hufiger gar nicht mehr leisten. So, weil sie sich ber die Versionen hinweg immer weiter aufgeblasen haben, ohne strukturell berarbeitet worden zu sein, weil sie aufgrund schlechter und unvollstndiger Aufarbeitungen teilweise bereits in sich widersprchlich geworden sind, weil sie aufgrund erbrmlicher Indizes nur sehr zeitraubend zu handhaben sind und nicht zuletzt, weil sie in ihrem enzyklopdischen Charakter keinerlei Gewichtung der Informationen nach Kriterien der Brauchbarkeit und dem Wissensstand des Lesers mehr enthalten. Ein wirklich pathologisches Beispiel einer solchen Online-Hilfe ist die MSDN Library fr Visual Studio 6.0. Der monumentale Fundus dieses in seinem Format inzwischen auf den Internet Explorer zugeschnittenen Hilfesystems ist auf zwei CDs verteilt und stellt einen Rundschlag an Informationen ber die wichtigeren Sprachprodukte von Microsoft dar darunter zu Visual Basic, Visual C++, Visual J++, Visual FoxPro sowie die SDK- und die DDK-Dokumentation. Die Benutzbarkeit des Systems lsst jedoch extrem zu wnschen brig. Erstens wurden Text und Index teilweise eingedeutscht, was fr den Index eine echte Katastrophe darstellt, teilweise im amerikanischen Original belassen, und zweitens wurde bei der indexikalischen Suche schlicht vergessen, die Produktzugehrigkeit der einzelnen Themen mit anzugeben. Die Volltextsuche leistet dies zwar, erschlgt einen aber schier mit der Flle der Fundstellen. Wer dieser Hilfe in annehmbarer Zeit etwas halbwegs Vernnftiges ber Visual Basic entlocken will, tut

#

Gut verw urzelt:

traditionel les

Bas ic

vs.

V isual Basic

Gut verwurzelt: traditionelles Basic vs. Visual Basic

gut daran, sich ber das Men ANSICHT/UNTERMENGE DEFINIEREN als Erstes eine Quellenauswahl in Form einer Untermenge zusammenzustellen und diese fr die weitere Arbeit als Filter zu benutzen. Eine gedruckte Referenz zu Visual Basic im Umfang des vorliegenden Buches kann es sich nicht leisten, ausgiebigst auf allen Hochzeiten zu tanzen das sei der Online-Hilfe vorbehalten. Vielmehr stellt sich die gedruckte Referenz der Aufgabe, die Ecken und Kanten abzuschleifen, die ein Verstndnis der Sprache oder spezifische Problemlsungen erschweren, indem sie Zusammenhngendes als solches aufzeigt, begreiflich darstellt und in seinen relevanten Dimensionen exemplarisch erlutert. Entscheidend ist dabei die Auswahl und Verdichtung der behandelten Thematiken, die zwar nicht in jedem Fall, so doch aber in der Mehrzahl der Flle eine Vertiefung der eher lax gehaltenen Online-Hilfe zu Visual Basic erreicht. Der vorliegende Band enthlt eine umfassende Darstellung der Konzepte, Funktionen und Objekte von Visual Basic als Programmiersprache und Entwicklungsplattform, beschrnkt sich aber in seiner Themenauswahl auf die Innensicht der Sprache, ohne sich allzu weit in der Welt des ActiveX, der Automatisierung, der Datenbankprogrammierung sowie generell des COM (bzw. DCOM) zu verlieren. Grob gesehen deckt der Band das gesamte Instrumentarium von Visual Basic inklusive aller Standardsteuerelemente sowie ausgewhlter Windows-Standardsteuerelemente und die Programmierung eigener Benutzersteuerelemente ab.

Gut verwurzelt: traditionelles Basic vs. Visual Basic


Keiner anderen Programmiersprache haftet so stark das Etikett an, in Hunderte verschiedener Dialekte zerfallen zu sein, wie Basic. Das liegt zum einen daran, dass Basic ber lange Zeit hinweg, insbesondere fr die ersten in ihren Mglichkeiten massiv beschrnkten Mikrocomputer und spter fr den PC die mit dem Betriebssystem ausgelieferte Standardsprache darstellte wenn es nicht gar, wie etwa fr den Commodore C64 zur Kommandosprache fr das Betriebssystem selbst avanciert war. Zum anderen liegt es aber auch daran, dass die Sprache in ihrer Entwicklung einer weniger rigiden Kontrolle durch Standardisierungskomitees und -gremien ausgesetzt war als die anderen vielleicht wegen des Buchstabens B im Akronym, der ja bekanntlich fr Beginners steht. Unterschwellig mag dabei freilich auch noch das Vorurteil mitgeschwungen haben, Basic werde aufgrund seiner Begrenztheit als Entwicklungssprache fr ernst zu nehmende Anwendungen sowieso nie taugen. Ein groes Vernderungspotential geht aber auch mit einem groen Entwicklungspotential und der Fhigkeit zur schnellen Adaption einher. In der Tat haben im letzten Jahrzehnt die Philosophien fr Benutzeroberflchen und Betriebssysteme einen massiven Wandel durchgemacht. Das gilt in besonders krasser Weise fr den PC. Da ist es nicht verwunderlich, wenn sich auch die Anforderungen verlagert haben, denen eine Programmiersprache bei der Anwendungsentwicklung fr moderne Benutzeroberflchen gengen muss. Eine wichtige Rolle spielen heute Objektorientierung, Modularisierung und Prozesskommunikation. Mit anderen Worten, das monolithische Programm, das isoliert von anderen Anwendungen den ihm zugedachten Aufgaben nachkommt, indem es seine eigenen Datenformate und Algorithmen strickt, seine eigene Benutzerschnittstelle parat hlt und vielleicht noch so tut, als gehre ihm die Maschine alleine, hat unwiderruflich ausgedient. Gefragt sind berschaubare, mglichst allgemein einsetzbare Komponenten, die im Dienste der Allgemeinheit das Ihre zum Groen Ganzen beitragen. Dieser neue Zeitgeist hrt auf den Namen COM (Component Object Model), eine sprachbergreifende Spezifikation, die die Implementation und das Miteinander von Objekten in dieser Welt regelt. Microsoft hat seinen Beitrag an der technologischen Umsetzung dieser Konzeption (mit Blick auf die Internet-Programmierung) unter der Bezeichnung ActiveX zusammengefasst. Einer Anwendung, gleich in welcher Sprache sie realisiert wird, stehen damit vonseiten des Betriebssystems komplexe, allgemein gehaltene Bausteine in Form von Komponenten (Steuerelemente,

16

Gut verw urzel t:

traditionell es

Basic

vs.

V isual Basic

Schnittstellen, Player, Filter etc.) mit verkapselter Funktionalitt und Implementation zur Verfgung, derer sie sich nach Belieben und ohne groes Brimborium bedienen kann. Angesichts dieser Entwicklungen scheint es etwa bei Betrachtung der Linie von BasicA ber QuickBasic/QBasic nach Visual Basic beinahe schon verblffend, wie treu sich die Sprache in ihren Wurzeln doch geblieben ist und wie viel sie von ihren ursprnglichen Konzepten in die neue Objekt-dominierte Welt retten konnte. Mehr noch, die Adaption ist so erstaunlich gut gelungen, dass sich der mit Visual Basic vorliegende Basic-Dialekt mit Fug und Recht inzwischen zu den ernst zu nehmenden Sprachen fr die Anwendungsentwicklung zhlen darf. Aber auch damit noch nicht genug. Microsoft hat Visual Basic vielmehr die Rolle des Flagschiffs zugedacht: In Form von VBA (Visual Basic fr Anwendungen) stellt das neue Basic zudem die Automatisierungssprache fr die wichtigsten Anwendungen der Microsoft Office Suite, und in der stark eingeschrnkten Form von VBScript ist das neue Basic auch gleich noch zur neuen Kommandosprache des Betriebssystems Windows avanciert. Wer nun darauf beharrt, Visual Basic habe nicht mehr viel mit dem traditionellen Basic zu tun, dem kann natrlich genauso wenig widersprochen werden. Die objektorientierte Fassung von C ist C++ und von Pascal ist Modula oder Delphi, und keiner wird Letztere als Dialekte Ersterer bezeichnen wollen, obwohl die Kenntnis von C bzw. Pascal doch sehr beim Verstndnis ihrer objektorientierten Nachfolger von Vorteil ist. Nehmen Sie es so: Basic war schon immer mehr ein Oberbegriff, denn ein kohrentes Gebilde, und als Oberbegriff ist es durchaus in der Lage, auch den bergang in die objektorientierte Programmierung unter sich zu subsumieren. Die wesentlichen in Visual Basic zu findenden Neuerungen sind:
q

Gut verwurzelt: traditionelles Basic vs. Visual Basic

Module der Modulbegriff deckt sich nicht mehr mit dem Programmbegriff, sondern erweitert die Strukturierungsfhigkeit der Sprache nach oben hin. Die Sprache vermag damit insbesondere Bibliotheken (Klassen- und Komponentenbibliotheken) konzeptuell zu integrieren Objekte der Objektbegriff ist inzwischen sprachlich-syntaktisch verwurzelt. Neben den einfachen Datentypen stehen nun auch komplexe, verkapselte Datentypen samt zugehriger Operationen zur Disposition. Der Sprache erffnet sich damit unter anderem die vollstndige Anbindung an alle Dienste des Betriebsystems inklusive der grafisch orientierten Benutzerschnittstelle, des gesamten Dateiwesens, der Kommunikationseinrichtungen und der Datenbankschnittstellen. Ereignisse die Sprache adaptiert das Modell der ereignisgesteuerten Anwendungsprogrammierung von Windows ber den Objektbegriff. So gestatten vordefinierte Klassen und interaktiv definierte Objekte dieser Klassen eine umfassende Repr sentation der Benutzerschnittstelle mit all ihren Elementen (Fenster, Mens, Symbol- und Statusleisten, Steuerelemente, Komponenten) und Aktionen. ActiveX die vom COM geforderte Codeabstraktion ermglicht es der Sprache nicht nur, von existierenden Komponenten zu profitieren, sondern auch selbst Komponenten beizusteuern, von denen wiederum andere Anwendungen profitieren knnen.

Erst mit Integration dieser Konzepte besitzt Visual Basic das ntige Rstzeug, um in der Welt der modernen Windows-Programmierung Schritt halten zu knnen. Das gilt mit gleichem Vorzeichen fr den Programmierer: Wer auch nur halbwegs ernst zu nehmende Anwendungen mit Visual Basic zu Stande bringen will, dem bleibt nichts anderes brig, als sein Basic-Repertoire (und sein Denken) auf den Stand dieser Neuerungen zu bringen. Dabei spielt in erster Linie der Objektbegriff eine zentrale Rolle. Wer den Objektbegriff einmal soweit verinnerlicht hat, dass er nicht mehr ber die Nahtstelle zwischen dem alten Basic und dem Basic mit Objekten stolpert, dem wird auch die modulare Programmierung mit Code- und Klassenbibliotheken, ActiveX-Komponenten keine allzu groen Rtsel mehr aufgeben. Damit wren wir bereits bei der Zielgruppe dieses Buchs.

17

Zielgruppe

Zielgruppe
Was das Vorwissen des Lesers betrifft, so wurde bei der Gestaltung der einzelnen Themen grter Wert auf eine Steigerung vom Einfachen zum Komplexen und vom Allgemeinen zum Speziellen gelegt. Der Eine liest so weit, wie er kommt, der Andere beginnt da zu lesen, wo es fr ihn interessant wird. Damit ist, wie fr eine Referenz blich, die Zielgruppe dieses Buchs naturgem recht breit anzusetzen. Sie umfasst:
q

den unerfahrenen Programmierer, der die ersten Schritte und Hrden der Visual-BasicProgrammierung zwar hinter sich gebracht hat, aber weder den inneren Zusammenhang der Sprache so recht durchdrungen hat, noch eine Vorstellung von der Flle ihrer Mglichkeiten bei der Bewltigung praktischer Problemfelder besitzt. Programmierer dieser Gruppe finden in diesem Buch nicht nur einen bersichtlichen Grundlagenteil, der auf die Elemente und Konzepte der Sprache genauer eingeht und gleichermaen eine Vertiefung des Objektbegriffs vermittelt, sondern auch Anregungen fr die eigene Programmierttigkeit in Form einfacher Programmbeispiele, die Lsungen zu typischen Fragestellungen vorstellen. den Alten Hasen, der Basic seit langem kennt, die Sprache aber vernachlssigt hat und mit Visual Basic den schnellen Wiedereinstieg in die heutige objektorientierte Basic-Programmierung sucht. Programmierer dieser Gruppe werden in der Referenz ntzliche Gegenberstellungen und Anmerkungen finden, die gerade auf die Vernderung der Sprache im Vergleich zu QBasic abzielen. den ambitionierten Anwendungsentwickler, der sein Repertoire erweitern will, nach Anstzen fr neue Lsungen sucht und sich vom Griff zur Referenz nicht nur Auskunft, sondern auch Inspiration erwartet. Als Referenz bem ht sich das Buch, Licht in mglichst viele Winkel der Visual-Basic-Programmierung zu bringen. Programmierer dieser Gruppe werden daher in der Flle der vorgestellten Programmiertechniken und Problemlsungen schnell Ansatzpunkte fr die Lsung der eigenen Fragestellungen finden. den versierten Programmierer, der in vielen Programmiersprachen zu Hause ist und gezielte Hilfestellung in der einen oder anderen Fragestellung sucht. Die problemrelevante Auswahl der Einzelthemen und die Anwendungen unterschiedlicher Schwierigkeitsgrade und Komplexit t umfassende Beispielsammlung drfte das Buch fr diesen Programmierertyp zu einer Fundgrube bei der Suche nach speziellen Lsungen werden lassen. den Entwickler spezifischer Datenbanklsungen, der Visual Basic unter anderem als Plattform fr die Front-End-Programmierung benutzt

Zielgruppe
18

Auch wenn im Text vielfach nur Visual Basic zu lesen ist, ist der Inhalt des Buches vor dem Hintergrund der bei Drucklegung aktuellsten Version von Visual Basic zu interpretieren. Die in diesem Buch aufgefhrten Thematiken und Beispiele wurden daher unter Visual Basic 6.0 (SP3) sowie der dazu von Microsoft bereitgestellten Dokumentation sorgfltig ausgearbeitet und auch getestet. Da Microsoft die Entwicklungszyklen seiner Produkte inzwischen scheinbar zunehmend auf Release-Versionen ausdehnt und eine weitgehende Fehlerfreiheit meist erst mit dem zweiten oder dritten Service-Pack erreicht wird, bietet diese Version eine hinreichend stabile Plattform fr die Anwendungsentwicklung.

Die CD zum Buch


Dem Buch ist eine CD beigelegt, auf der Sie die im Text explizit als Projekte bezeichneten Beispiele in je eigenen Unterverzeichnissen der Verzeichnisse Referenz und Praxis vorfinden. Zur einfacheren Orientierung tragen die Unterverzeichnisse die Namen der Projekte. Um die nicht

Zielgruppe

kompilierten Programme auszufhren, ffnen Sie die jeweilige VBP-Projektdatei oder VBG-Projektgruppendatei in der Visual-Basic-Entwicklungsumgebung und starten die Ausfhrung mittels der Taste (F5). Fr Kommentare, Verbesserungen und Anregungen mit Bezug auf den Inhalt dieses Buchs bin ich jederzeit dankbar. Richten Sie Zuschriften bitte an:
R.Huttary@digitaldocument.de

Mnchen im August, 2000

Rudolf Huttary

Zielgruppe
19

Teil 1: Referenzteil

Grundlegendes
Bei der prozeduralen Programmierung erfolgt die Strukturierung des Quellcodes traditionell durch Kontrollstrukturen, Funktionen/Prozeduren und Module. Whrend Kontrollstrukturen als Muss fr jede Programmiersprache schon immer zum Kern von Basic zhlten, hielten der Funktions- und Prozedurbegriff und das damit verbundene Konzept des Namensraums nur sehr zgerlich Einzug in die Sprache. Der Modulbegriff war als solcher zwar schon immer vorhanden, er implizierte bis zur Entwicklung von Visual Basic jedoch nicht mehr als die schiere Mglichkeit, von einem ersten Programm aus die Kontrolle zusammen mit gegebenenfalls speziell fr den Export deklarierten Werten an ein zweites Programm abzugeben. Da das erste Programm dadurch beendet wurde und seine gesamte Umgebung verlorenging, war dieses Konzept als zustzliche Strukturebene wenig geeignet. Brauchbare Adaptionen fr Funktionen/Prozeduren gibt es seit QuickBasic und QBasic, wenngleich die etwas seltsam anmutenden Regeln fr den Namensraum aus heutiger Sicht den Eindruck erwecken, als seien den Funktionen/Prozeduren Teile eines Modulkonzepts untergemischt worden. Erst die mit Visual Basic vollzogene ffnung zur objektorientierten Programmierung brachte der Sprache ein ausgewogenes Verhltnis dieser drei Strukturebenen, wie es heute in allen modernen Programmiersprachen zu finden ist: Kontrollstrukturen sind (unverndert) bedingte Verzweigungen und Schleifen, die eine Steuerung der Programmausfhrung ermglichen. Prozeduren/Funktionen fassen als Unterprogramme umfangreiche Anweisungsfolgen zu kompakten Einheiten zusammen, wobei Funktionen aufgrund des Funktionswerts, den sie verkrpern, noch der spezielle Aspekt der Auswertung komplexer Ausdrcke zufllt. Module haben Bibliothekscharakter und kombinieren Code und Datenstrukturen zu eigenstndigen Programmeinheiten. Damit erfllen sie die strukturelle Voraussetzung fr die Implementation von Objektdatentypen (Klassen).

Programme und Module in Visual Basic


Dieser Abschnitt diskutiert den Programm- und Modulbegriff von Visual Basic und stellt die verschiedenen Ausprgungen vor.

Programm
Ein Programm ist eine Folge von Befehlen, die auf einem Computer ausfhrbar ist und im weitesten Sinne eine spezifische Anleitung fr die spezifische Verarbeitung spezifischer Daten darstellt. Das hier etwas strapazierte Wort spezifisch soll deutlich machen, dass bei der Datenverarbeitung die Reprsentation eine enorme Rolle spielt und Programm nicht gleich Programm ist, selbst wenn es das Gleiche tut. Basic war ursprnglich als Interpretersprache konzipiert, was nichts anderes heit, als dass zur Ausfhrung eines Basic-Programms ein Interpreter (also ein weiteres Programm) erforderlich war, das vergleichbar einem Dolmetscher die Basic-Befehle nacheinander in Maschinenbefehle bersetzte. Darber hinaus musste der Interpreter whrend des bersetzens auch noch darauf achten, dass der Programmtext keine Fehler syntaktischer oder sonstiger Natur enthielt. Das hatte zwar den Vorteil, dass die Programmentwicklung sehr einfach weil vollstndig interaktiv vonstatten gehen konnte, aber auch den Nachteil, dass die Ausfhrungsgeschwindigkeit zu wnschen brig lie. Basic hatte daher immer schon den Ruf, nicht gerade der schnellsten einer zu sein. Im Gegensatz zu Basic sind andere Sprachen wie C oder Pascal von vornherein als Compilersprachen konzipiert, das heit, Programmtexte werden einmalig (sowie nach jeder nderung) von einem Compiler (bersetzungsprogramm) auf syntaktische und sonstige Fehler hin untersucht und dann in eine ausfhrbare Version bersetzt, die aus nichts weiter als aus Maschinenbefehlen besteht und vom Prozessor direkt verarbeitet werden kann. (In der Praxis muss der vom Compiler gelieferte Code allerdings zur Aufl-

Programme und Module in Visual Basic

Programme und Module in Visual Basic

sung von Bibliotheksverweisen noch einem Bindevorgang unterzogen werden dafr ist der so genannte Linker zustndig). Der Geschwindigkeitsvorteil liegt dabei natrlich auf der Hand. Visual Basic vereint heute die Vorteile einer Interpretersprache mit der einer Compilersprache. Fr die interaktive Programmentwicklung stellt die Entwicklungsumgebung von Visual Basic einen Interpreter (genau genommen handelt es sich dabei um einen inkrementellen Compiler) mit integriertem Debugger bereit, und zur Fertigstellung einen Compiler, der direkt ausfhrbaren Code erzeugen kann. Dieser Code ist allerdings noch auf eine oder mehrere zu Visual Basic gehrende Laufzeitbibliotheken angewiesen, die in Form von DLLs bereitstehen. Neben der bersetzung in Maschinencode bietet Visual Basic auch die bersetzung in den so genannten PCode an, ein im Schnitt etwa um 40 Prozent kompakterer und syntaktisch fehlerfreier Zwischencode. In P-Code vorliegende Programme besitzen einen kleinen ca. 9 KB umfassenden Maschinencode-Anteil, den so genannten P-Code-Interpreter, der ein primitives Laufzeitsystem darstellt und den P-Code (mit weitaus geringeren Geschwindigkeitsverlusten als ein Basic-Interpreter) in Maschinencode entfaltet.

Modul
Ein Blick auf die Entwicklung von Basic zeigt weiterhin, dass sich die Sprache von einer schwach strukturierenden Sprache, deren einzige Strukturelemente Kontrollstrukturen und (inzwischen vllig verpnte) Subroutinen bildeten, zu einer stark strukturierenden Sprache gemausert hat, die sich dem Vorwurf, sie wrde Spagetti-Code frdern, nicht mehr gefallen lassen muss. So baut sich die Funktionseinheit Programm heute nicht mehr als schlichte Folge von Anweisungen, Verzweigungen und Sprngen auf, sondern als Sammelsurium sich gegenseitig in streng hierarchischer Organisation aufrufender Funktionen und Prozeduren, also in sich abgeschlossener und gekapselter Untereinheiten mit eng begrenzten und berschaubaren Funktionalitten. Damit aber nicht genug. Um als Programmiersprache in einer zunehmend objektorientiert gestalteten Systemumgebung noch mitmischen zu knnen, muss auch die Mglichkeit einer Strukturierung nach oben hin gegeben sein. Dies bringt den Begriff des Moduls ins Spiel. Ein Modul vereinigt im Wesentlichen das unter sich, was traditionell als Basic-Programm begriffen wurde: einen als Datei vorliegenden Programmtext, der vom Basic-Laufzeitsystem als eigenstndige Programmeinheit behandelt wird. Charakteristikum des Moduls ist, dass es einen eigenen Namensraum darstellt, mithin also Variablen bereitstellen kann, die global in allen Prozeduren des Moduls bekannt sind (Deklaration mit Dim oder Private). Darber hinaus ist auch ein Export globaler Variablen und Prozeduren an andere Module (Deklaration mit Public) mglich. Auf diese Weise lsst sich in Visual Basic die Gesamtfunktionalitt eines Programms als Ansammlung kleinerer Programme bzw. Module mit definierten Schnittstellen begreifen. Das einzelne Modul kann im Zusammenspiel mit anderen Modulen einem hheren Zwecke dienen, aber auch fr sich genommen ein vollstndiges Programm sein. Mit Blick auf die Objektorientierung hat das Modul in Visual Basic eine noch weitere sehr wichtige Funktion: Es kann als eigenstndiger komplexer Datentyp (Klasse) auftreten und stellt dafr die Implementation. Eine ausfhrliche Diskussion dieses Aspekts finden Sie im Teil Objekte und Klassen (S. 195).

Projekt
Der Visual-Basic-Programmierer legt fr jedes neue Programm ein Projekt an, welches als organisatorischer Rahmen fr die verschiedenen Module seines Programms fungiert. Damit das Programm fr sich lauffhig ist, muss eines (und nur eines) dieser Module ein Startobjekt bereitstellen, das unter PROJEKTEIGENSCHAFTEN auf der Seite ALLGEMEIN anzugeben ist. Der Name Objekt ist hier ein wenig unglcklich gewhlt, weil nicht nur Objekte mit eigenstndiger Nachrichtenbehandlung (wie Formulare), sondern auch eine Prozedur mit dem speziellen Bezeichner Main zur Auswahl stehen. Ist fr ein Projekt kein Startobjekt definiert, kann der resultierende Code nur als Bibliothek fr andere Programme oder Bibliotheken fungieren. (Eine

24

Arten von Modulen in einem Projekt

Bibliothek kann allerdings gleichfalls ein Startobjekt bentigen, wenn noch vor dem Aufruf der ersten Bibliotheksroutine gegebenenfalls notwendige Initialisierungen durchzufhren sind.) So ergibt sich, dass in Visual Basic geschriebene Programme aus unterschiedlichen Teilen zusammengesetzt sind, die jeweils unterschiedliche Gestalten haben bzw. annehmen knnen:
q

Quelltext oder Interpretercode liegt im ASCII-Format vor und kann die Dateierweiterungen .frm (Formular und MDI-Formular), .bas (Programmmodul), .ctl (ActiveXSteuerelement) oder .cls (Klassenmodul, ActiveX-Komponente) haben. Zur Ausfhrung des Quelltextes im Visual-Basic-Interpreter sind darber hinaus je Quelltext eine Projektdatei (.vbp) und bei Gruppierung mehrerer Projekte zu einem Ganzen eine Gruppierungsdatei (.vbg) vonnten. Compilercode liegt als ausfhrbarer Maschinencode oder P-Code vor und kann die Dateierweiterungen .exe (Ausfhrbare Datei oder prozessexterne ActiveX-Komponente), .dll (dynamische Bibliothek oder prozessinterne ActiveX-Komponente) oder .ocx (ActiveX-Steuerelement) tragen.

Programme und Module in Visual Basic

Arten von Modulen in einem Projekt


Visual Basic unterscheidet mehrere Arten von Modulen. Um einem bestehenden Projekt ein weiteres Modul hinzuzufgen, finden sich im Men PROJEKT der Entwicklungsumgebung entsprechende Eintrge. Mit Ausnahme von Standardmodulen des Typs Modul sowie allgemeinen Klassenmodulen setzt sich ein Modul aus einer Codekomponente und einer Objektkomponente (lies: sichtbare Reprsentation) zusammen. Die Bearbeitung der Codekomponente erfolgt im ASCII-Editor und die Bearbeitung der Objektkomponente im Designerfenster der integrierten Entwicklungsumgebung Visual Studio. Standardmiges Modul fr die Programmierung kleiner Anwendungen mit Ein- und Ausgabefunktionalitt ist das Formular. Sein Charakteristikum ist, dass seine Funktionalitt im Wesentlichen auf ein einzelnes Fenster ausgerichtet ist, das ihm als Eingabe- und Ausgabemedium dient. Nachdem ein Formularmodul zur Laufzeit durch ein Formularobjekt mit eigenstndiger Nachrichtenbehandlung reprsentiert wird, kann jedes Formularmodul formal zum Startobjekt erklrt werden. (Natrlich muss dann auch das Design sowie die Logik des Formulars auf diese Eigenschaft zugeschnitten sein.) Somit kann ein aus einem einzelnen Formularmodul bestehendes Projekt bereits als vollstndiges, interaktives Visual-Basic-Programm auftreten. Sie erhalten ein solches Minimalprojekt (mit geeignet definiertem Startobjekt), wenn Sie ein Projekt des Typs Standard-EXE anlegen. Mit dieser Konstellation kommt das Formularmodul dem traditionellen Basic-Programm am weitesten entgegen, auch wenn die Programmiertechniken fr die Ein- und Ausgabe unter Windows doch erheblich anders aussehen als vergleichsweise noch unter DOS. Eine Anleitung, wie ltere, noch mit QBasic geschriebene Basic-Programme unter Visual Basic zum Laufen gebracht werden, findet sich zu Anfang des Praxisteils. Eine andere, gleichfalls auf die Arbeit mit Fenstern ausgerichtete Modulart ist das MDI-Formular. Es unterscheidet sich vom gewhnlichen Formularmodul darin, dass es das Rstzeug fr die Programmierung mit einem Hauptfenster und beliebig vielen weiteren, ersterem untergeordneten Fenstern sozusagen bereits mitbringt. MDI-Formularmodule kommen dementsprechend dann zum Einsatz, wenn es um die Darstellung und Verwaltung mehrerer Dokumente (Formularmodule) unter einem gemeinsamen Dach (MDI-Formularmodul) geht. Weitere Informationen hierzu im Abschnitt Selbst definierte Klassen auf Seite 318. Die schlichte Bezeichnung Modul fr die dritte Modulart verrt bereits, dass es sich hierbei um ein unspezifisches Standardmodul handelt. Ein solches Modul kann beispielsweise die Logik fr die Koordination weiterer Module enthalten oder schlicht als Bibliothek fr von allen Modulen eines Projekts gemeinsam genutzte Funktionen, Prozeduren, Variablen, Typen und Konstanten fungieren.

25

Programme und Module in Visual Basic

Geheimnisvoller ist die Bezeichnung Klasse fr die vierte Modulart. Sie ist dafr gedacht, die neu mit Visual Basic hinzugekommene Seite der objektorientierten Programmierung aktiv zu bedienen, sprich, eigene Objekte zu implementieren. Sieht man ein Objekt als Kombination aus einem benutzerdefinierten Datentyp und den zugehrigen Operationen ber diesem Datentyp an, wird die Rolle des Klassenmoduls schnell deutlich. Es beherbergt die Beschreibung des Objektdatentyps hinsichtlich seiner Reprsentation und seiner Methoden (lies: Funktionen und Prozeduren). Weitere Informationen hierzu im Abschnitt Selbst definierte Klassen auf Seite 318. Die Modulart Benutzersteuerelement ist dem Bereich der ActiveX-Programmierung zuzurechnen. Sie erlaubt die Bereitstellung eigener Steuerelemente im OCX-Format, deren Funktionalitt im (allerdings recht reichhaltigen) Angebot der unter Windows allgemein verfgbaren Steuerelemente nicht enthalten ist. Anders als ein Formular ist ein Benutzersteuerelement im Allgemeinen nicht dazu da, ein komplettes Fenster darzustellen, sondern wie der Name schon sagt nur ein Steuerelement, das sich auf einem Formular platzieren lsst. Aus diesem Grund besitzt ein Benutzersteuerelement fr gewhnlich weder Menleisten, Symbolleisten und andere Dinge, die bei Formularen anzutreffen sind, noch ein feste Gre. Vergleichbar mit den Standardsteuerelementen, werden die sichtbaren Abmessungen eines Benutzersteuerelements erst bei Platzierung des fertigen Steuerelements im Verlauf des Formularentwurfs oder programmgesteuert festgelegt. Das Benutzersteuerelementmodul enthlt die gesamte Logik eines Benutzersteuerelements sowie die Schnittstellendefinition fr den Datenaustausch (Eigenschaften). Wie das Formular Minimalbestandteil des Projekttyps Standard-EXE ist, so ist das Benutzersteuerelement Minimalbestandteil des Projekttyps ActiveX-Steuerelement. Auch die Modulart Eigenschaftsseite fllt in den Bereich der ActiveX-Programmierung. ActiveX-Steuerelemente haben oft komplexe Eigenschaften (so etwa zusammengesetzte Datentypen oder Objekte), deren Darstellung im standardmigen Fenster Eigenschaften der Entwicklungsoberflche nicht mehr erfolgen kann. Fr diesen Fall besteht die Mglichkeit, eine oder mehrere Eigenschaftsseiten fr die Eingabe der Eigenschaften bereitzustellen. Da ein ActiveX-Steuerelement, das beim Entwurf eines Formulars, eines anderen Steuerelements oder einer anderen Komponente in den Entwurfbereich gezogen wird, standardmig (als Entwurfsinstanz) zur Ausfhrung kommt, steht insbesondere auch der hinter einer Eigenschaftsseite steckende Code zur Verfgung. Eine Eigenschaftsseite lsst sich wie ein Formular unter Verwendung von Steuerelementen im Designerfenster der Entwicklungsumgebung zusammenstellen und im Code-Editor mit der entsprechenden Logik fr den Datenaustausch mit einem ActiveX-Steuerelement, aber auch mit mehreren ActiveX-Steuerelementen (bei Mehrfachauswahl von ActiveXSteuerelementen im Designerfenster, denen die gleiche Eigenschaftsseite zugeordnet ist) versehen. Die letzte Modulart, Designer, ist mehr oder weniger ein Sammelbecken fr die verschiedensten Objekte. Visual Basic hlt fr jedes dieser Objekte ein Designer-Werkzeug bereit, das hnlich dem Formulardesigner die interaktive visuelle Gestaltung der Objektkomponente ermglicht. Wie beim Formular wird in der Codekomponente eines solchen Objekts seine spezifische Reaktion auf bestimmte Ereignisse festgelegt. Unter den Werkzeugen finden sich der DHTML-Designer fr den Entwurf und die Programmierung dynamischer HTML-Seiten, der Data-ReportDesigner fr den Entwurf und die Programmierung von Datenberichten, der Data-Environment-Designer fr die interaktive Gestaltung und das Management der Datenumgebung fr Datenbankverbindungen mit programmgesteuerten Datenzugriffen sowie der WebClass-Designer fr die Bereitstellung von Active Server Pages (.asp-Dateien) im Zusammenhang mit verteilten Anwendungen im Internet oder Intranet und dem Internet Information Server.
Tipp

Programme und Module in Visual Basic

................................................... 6EFF

Module sind ein sehr geeignetes Mittel fr die Strukturierung von Programmcode hinsichtlich seiner Wiederverwendbarkeit. Die Vielfalt der unter Visual Basic vorhandenen Modularten fr-

26

Literale und Konstanten

dert zwar bereits von sich aus die modulare Programmierung, ersetzt aber verstndlicherweise nicht die bewusste Aufteilung des Codes in spezifische und allgemein verwendbare Programmtexte. Wer sich beizeiten vernnftige Bibliotheken anlegt, kann spter um so mehr davon profitieren.
Beispiele

................................................... Beis piele

Das einfache Projekt Modultest besteht aus zwei Modulen, einem gewhnlichen Modul Module1 und einem Formularmodul Form1. Module1 enthlt eine Startprozedur namens Main, die im Dialog PROJEKTEIGENSCHAFTEN als Startobjekt spezifiziert ist. Form1 enthlt dagegen nichts weiter als eine Schaltflche Beenden zum Beenden des Formulars. In diesem Programm ruft Main als Startobjekt Form1 zweimal hintereinander als gebundenes Formular auf und passt dazu den Fenstertitel entsprechend an. Whlt man Form1 als Startobjekt, erfolgt nur ein Aufruf des Formulars, whrend das Modul Module1 gar nicht erst zur Ausfhrung kommt:
' Projekt: Modultest ' vollstndiger Code von Module1 Sub Main() ' Main ist Startobjekt des Projekts Dim f As New Form1 f.Caption = "Erster Aufruf" ' Ldt Formular Form1 in Hauptspeicher f.Show 1 ' Zeigt Formular an und wartet, bis dieses endet f.Caption = "Zweiter Aufruf" f.Show 1 ' Zeigt Formular an und wartet, bis dieses endet End Sub ' vollstndiger Code von Form1 ' Formular enthlt Schaltflche "Beenden" Private Sub Beenden_Click() Unload Me End Sub

Literale und Konstanten

Das in den folgenden beiden Abbildungen gezeigte Projekt EuroDMTestprojekt besteht aus zwei Modulen, einem einfachen Formularmodul und einem Benutzersteuerelementmodul. Das Programm testet ein Benutzersteuerelement namens EuroDM, welches die Ein- und Ausgabe von Geldbetrgen wahlweise in DM oder Euro gestattet. Der Einfachheit halber wurde auf eine Rundung und eine Korrektur der Punkt-/Komma-Problematik verzichtet. Das aus zwei Textund zwei Bezeichnungsfeldern bestehende Benutzersteuerelement rechnet Eingaben in der einen Whrung automatisch in die andere um und erlaubt die Definition und Abfrage seiner beiden Textfelder ber die Eigenschaften Euro und DM. Da die Textfelder eine gegenseitige Wertnderung im Rahmen ihrer Change-Behandlung vornehmen, sind ein wenig Logik und die globale Zustandsvariable Changing ntig, um eine Endlosschleife zu verhindern.

Literale und Konstanten


[Public | Private] Const ConstName [As Typ] = Literal [Public | Private] Const ConstName [As Typ] = LiteralerAusdruck

27

Literale und Konstanten

Literale und Konstanten


Testprojekt fr das Benutzersteuerelement EuroDM im Entwurfsmodus Das Benutzersteuerelement EuroDM im Einsatz
Beschreibung

................................................... Bes c hreibung

Die elementarste Unterscheidung bei der Datenverarbeitung, an der selbst einfachste Taschenrechner nicht vorbeikommen, ist die zwischen Daten und Befehlen. Als Datum bezeichnet man die Reprsentation eines Werts in einem spezifischen Datenformat (Datentyp). Ein Datum kann als Literal, als Konstante oder als Variable vorliegen. Im Falle des Literals steht der Wert fr sich selbst, etwa wie 42 fr die Zahl Zweiundvierzig oder Rudolf fr den Vornamen des Autors dieses Buches. Im Falle der Konstanten hat man es genau genommen gleichfalls mit einem Literal zu tun, da der Interpreter bzw. Compiler jedes Vorkommen einer Konstanten im Quelltext automatisch durch ihren literalen Wert ersetzt. Variablen sind dagegen auf ein bestimmtes Datenformat (Datentyp) zugeschnittene Behlter, die einen Bezeichner (lies: einen Namen) tragen und einen (in dem bestimmten Datenformat gehaltenen) Wert enthalten. Whrend sich der Wert eines Literals oder einer Konstanten im Programmverlauf nicht ndern kann, weil wenn man so will Bezeichner und Wert identisch sind, kann eine Variable (im

28

Literale und Konstanten

Rahmen ihres Datenformats) unter Beibehaltung ihres Namens jederzeit ihren Wert ndern. Anders gesagt: Ein Literal ist ein Wert, eine Konstante steht fr einen Wert und eine Variable enthlt einen Wert. Ein Befehl ist eine allgemeine Vorschrift fr die Manipulation von Daten im weitesten Sinne und wird in Visual Basic hufig mit der so genannten Anweisung gleichgesetzt (vgl. Anweisungen, S. 33). So ist beispielsweise die Zuweisung eines Werts an eine Variable, die so genannte Zuweisungsoperation mit = ebenso ein Befehl wie die Ausgabe einer Grafik mit automatischer Grenanpassung in ein Bildfeld, das auf einem Formular gelegen ist. Als Operationen bezeichnet man dagegen eine besondere Art von Befehlen, bei der ein Operator (lies: Rechenvorschrift) auf einen oder mehrere Operanden (lies: Werte einer bestimmten Art) angewendet wird und einen neuen Wert (gleicher Art) produziert so etwa die Bildung der Summe zweier Zahlen, die Verkettung von Zeichenfolgen, die Restwertdivision (Modulo-Rechnung) oder, wie gesagt, die Zuweisung eines Werts an eine Variable. Ist ein Wert so notiert, dass er erst durch Anwendung von Operatoren auf Operanden berechnet werden muss, spricht man von einem Ausdruck. Sind die Operanden als Literale notiert, spricht man genauer von einem literalen Ausdruck.
Anwendung

Literale und Konstanten

................................................... Anwendung

Ein Literal kann berall dort stehen, wo ein Wert erforderlich ist so bei Zuweisungen als Rechtswert (lies: rechts von Gleichheitszeichen), in Ausdrcken als Operand, bei Funktionsund Prozeduraufrufen als Argument fr einen Parameter. Fr die Notation literaler Gren gibt es feste Regeln, die sich auch von Datentyp zu Datentyp unterscheiden knnen. So sind Zeichenfolgenliterale in doppelte Anfhrungszeichen einzuschlieen, und damit es zu keiner Verwechslung zwischen dem doppelten Anfhrungszeichen als Zeichen und dem Zeichenfolgenende kommt, muss das Anfhrungszeichen doppelt notiert werden, wenn es als Zeichen auftritt.
strMyName = "Rudolf Huttary" Position$ = "Das Schiff liegt 2 3' und 42"" Ost"

Zahlenliterale knnen Sie in dezimaler Schreibweise, wie gewohnt:


Const cMaxSize = 255

in hexadezimaler Schreibweise durch Voranstellen von &H:


Const cMaxSize = &HFF ' dezimaler Wert 255

oder in oktaler Schreibweise durch Voranstellen von &O notieren:


Const cMaxSize = &O377 ' dezimaler Wert 255

Die dezimale Notation von Zahlenliteralen mit Nachkommastellen erfolgt mit Dezimalpunkt. (Achtung: In Zeichenfolgen, die spter implizit oder mittels einer Funktion wie Val umgewandelt werden, gelten jedoch die Lndereinstellungen, so dass hier auf einem deutschen System ein Komma zu notieren ist.) Etwaige Zehnerpotenzen sind, durch ein E abgetrennt, an die Dezimaldarstellung anzuhngen. Positive Vorzeichen knnen Sie weglassen; negative Vorzeichen stellen Sie jeweils dem Wert voran, fr den sie gelten.
Const delta = -2.14E-27 ' Minus 2 Komma 14 mal 10 hoch Minus 27

29

Literale und Konstanten

Der standardmige Datentyp von Zahlenliteralen ist Integer bzw. bei vorhandenen Nachkommastellen Single. Um einen anderen Datentyp zu erzwingen, knnen Sie dem literalen Wert ein Typkennzeichen anhngen.
Const cAlpha = 100& Const cBeta = 100! Const cGamma = 100# ' cAlpha ist vom Typ Long ' cBeta ist vom Typ Single ' cGamma ist vom Typ Double

Literale und Konstanten

Nicht ganz so eingngig sind die Regeln fr die Notation von Datumsliteralen. Werte dieses Typs reprsentiert Visual Basic als 64-Bit-Gleitkommazahlen (8 Bytes) nach IEEE und kann somit Datumsangaben im Bereich zwischen dem 1. Januar 100 und dem 31. Dezember 9999 sowie Uhrzeiten im Bereich von 0:00:00 bis 23:59:59 unterscheiden. Datumsliterale knnen Datumsangaben und Zeitangaben kombinieren, aber auch je einzeln ausdrcken. Der Notation literaler Datums- und Zeitangaben liegt das amerikanische Format zugrunde, das heit, in Datumsangaben wird der Monat vor dem Tag notiert und die Abtrennung erfolgt durch das Zeichen /, und Zeitangaben sind in 12-Stunden-Darstellung gefolgt von PM oder AM zu treffen. Zudem ist die Darstellung durch ein fhrendes und abschlieendes Zeichen # einzuschlieen. (Der Editor erkennt brigens auch andere Darstellungen, so etwa #1 Feb 99#, und korrigiert diese beflissen in das erwnschte Format.)
Dim a = b = c = a As Date, b As Date, c As Date #2/1/1996 1:12:01 PM# #12:01:00 PM# #2/1/1996#

Konstanten lassen sich wie Literale berall dort einsetzen, wo ein Wert erforderlich ist. Gegenber Literalen bieten sie den Vorteil, dass der Wert, fr den sie stehen, an zentraler Stelle definiert und fortan formal durch Angabe des Konstantenbezeichners notiert werden kann. Die Definition einer Konstanten erfolgt zur Entwurfszeit im Rahmen einer Const-Anweisung durch Zuweisung eines Literals oder eines literalen Ausdrucks an einen Konstantenbezeichner. Bei der Wahl des Konstantenbezeichners gelten die blichen Vorschriften fr die Bezeichnerwahl (vgl. Bezeichner und Namensraum, S. 34). Es ist legitim, bei der Definition von Konstanten, andere, bereits definierte Konstanten als Rechtswerte oder als Operanden in Ausdrcken zu verwenden.
Const MinSize = 8 Const MaxSize = MinSize + 2741
Warnung

' MinSize steht fr den Wert 8 ' MaxSize steht fr den Wert 2749

................................................... Warnung

Wer denkt, dass die Konstantendeklarationen


Const a = 65535

und
Const b = &HFFFF

identisch sind, der irrt. a steht fr die Zahl 65535 (wie notiert), b jedoch fr -1. Das liegt daran, dass Visual Basic a implizit den Datentyp Long und b den Datentyp Integer zuordnet und der Wert -1 aufgrund der Reprsentation negativer Zahlen durch Zweierkomplementbildung die hexadezimale Darstellung &HFFFF hat. Damit beide Konstanten den gleichen Wert erhalten, ist die hexadezimale Darstellung so zu notieren:
Const b = &H0FFFF

30

Literale und Konstanten

In Basic existiert nur formal ein Unterschied zwischen der bitweisen Operation und der logischen Operation, da die Reprsentation logischer Werte genau so gewhlt ist, dass eine bitweise Operation die jeweilige logische Operation hervorbringt.
Const a = Not 2 ' a steht fr -3 (Zweierkomplement)

und
s% = -3 And 42 Or 1 ' s% erhlt den Wert 41

Die von Visual Basic verwendete interne Reprsentation fr Datumswerte kann mit folgender Kapriole aufwarten: Der 30. Dezember 1899 ist nicht darstellbar. Visual Basic interpretiert diesen Tag vielmehr als reine Zeitangabe #12:00:00 AM#.
Tipps

Literale und Konstanten

................................................... Tipps
Vermeiden Sie im Programmtext nach Mglichkeit die Verwendung von Literalen und arbeiten Sie mit Konstanten, die Sie jeweils zu Anfang des Moduls im Bereich ALLGEMEIN (seltener: zu Anfang einer Prozedur) definieren. Auf diese Weise knnen Sie den Wert eines Literals an zentraler Stelle mit globaler Wirkung fr den gesamten Programmtext ndern.
Const cMaxSize = 255 ... For x = 0 to cMaxSize

Um fr Konstanten einen bestimmten Typ zu erzwingen, erklren Sie diesen entweder durch die Angabe eines Typkennzeichens oder durch eine explizite Typdeklaration.
Const cMaxSize As Integer = 255

Bildet ein literaler Wert die Grundlage fr einen weiteren literalen Wert, so empfiehlt es sich, den zweiten Wert als Ausdruck zu schreiben, der auf den ersten aufbaut, oder anstelle des zweiten Literals eine Variable einzusetzen und deren Wert rechnerisch aus dem ersten Literal zu ermitteln.
Const cMinSize = 100 ' Const cMaxSize = 199 Const cMaxSize = 2 * cMinSize 1 Const cVerschlsseltesKennWort = "2XVf5uhf" ' Const KennwortLnge = 8 ... Dim KennwortLnge As Integer KennwortLnge = Len(cVerschlsseltesKennwort) ' falsch ' richtig

' falsch

' richtig

Visual Basic besitzt eine sehr reichhaltige Flle an vordefinierten Konstanten (auch Objektkonstanten), deren Einsatz nicht nur ein Garant fr Kompatibilitt ist, sondern auch (gerade im Zusammenhang mit Objektkonstanten) zu Laufzeitverbesserungen fhrt. Einen berblick ber diese Konstanten gibt der Objektkatalog (aufzurufen ber ANSICHT/OBJEKTKATALOG oder (F2)).
Beispiel

................................................... Beis piel

Das folgende vollstndige Programm Apfelmann, eine stark vereinfachte Version des mehrfach in diesem Buch diskutierten Apfelmnnchens, demonstriert den Umgang mit literalen Werten. Da das Programm whrend der Berechnung keine Aktualisierung der Anzeige vornimmt, erscheint das Bild erst nach Abschluss aller Berechnungen es sei denn, man fgt einen ShowAufruf in die Load-Routine ein und setzt die AutoRedraw-Eigenschaft des Formulars auf False.

31

Literale und Konstanten

' Bereich Allgemein Const cx1 As Double = -2.1 Const cy1 As Double = -1.2 Const cx2 As Double = 0.7 Const cy2 As Double = 1.2 Const cFenster_x = 4000 Const cFenster_y = 3600 Const cMaxIterat As Integer = 200 Const cGrenze As Double = 100

' Bildausschnitt des Apfelmnnchens

' Fensterabmessungen nicht zu gro ' sonst dauert es zu lange

Literale und Konstanten

Private Sub Apfel(m_x1, m_x2, m_y1, m_y2, step_x, step_y) Dim r1 As Double, re As Double, im As Double Dim zr As Double, zi As Double, it As Integer For zr = m_x1 To m_x2 Step step_x ' alle Spalten in x-Richtung For zi = m_y1 To m_y2 Step step_y ' alle Punkte in Spalte zr re = 0 ' Realteil initialisieren im = 0 ' Imaginrteil initialisieren For it = 0 To cMaxIterat ' Iteration fr Punkt r1 = re * re im * im + zr im = 2 * re * im + zi re = r1 If re < -cGrenze Or re > cGrenze Or _ im < -cGrenze Or im > cGrenze Then PSet (zr, zi), it * 16 ' Punkt ausgeben Exit For End If Next it Next zi Next zr End Sub Private Sub Form_Load() Dim step_x As Double, step_y As Double Width = cFenster_x ' Fensterabmessungen anpassen Height = cFenster_y ' AutoRedraw = False ' Show ScaleMode = vbPixels ' Ab jetzt Bildpunkte als Einheit step_x = (cx2 cx1) / ScaleWidth ' Breite eines Bildpunkts step_y = (cy2 cy1) / ScaleHeight ' Hhe eines Bildpunkts Scale (cx1, cy1)-(cx2, cy2) ' Koordinatensystem vorgeben Apfel cx1, cx2, cy1, cy2, step_x, step_y ' Apfelmnnchen berechnen End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Dim, Public, Private, ReDim


Verwandte Themen

Datentypen und ihre Operationen (S. 49); Operatoren fr elementare Datentypen und logische Bedingungen (S. 54); Anweisungen (S. 33); Bezeichner und Namensraum (S. 34)

32

Anweisungen

Anweisungen
_ (Operator fr bertrag in nchste Zeile) : (Operator fr Aneinanderreihung von Anweisungen) [Let] Var = Wert Rem Kommentar ' Kommentar #If Ausdruck Then Anweisungsfolge1 [#Else | ElseIf AusdruckN AnweisungsfolgeN #End If
Beschreibung

Anweisungen

................................................... Bes c hreibung

Der Quelltext eines Visual-Basic-Moduls setzt sich aus einer Folge von Anweisungen zusammen. Unter einer Anweisung versteht man in Visual Basic alles, was einen Befehl darstellt, ohne selbst einen Wert zu verkrpern. Man unterscheidet zwischen einfachen Anweisungen, die in einer einzelnen Zeile stehen knnen, und Kontrollstrukturen, die als zusammengesetzte Anweisungen ihrerseits Anweisungsfolgen strukturieren und auf hherer Ebene zu einer logischen Einheit zusammenfassen. Eine besondere Anweisungsform stellen Compileranweisungen dar, denen das Zeichen # vorangeht (#If Then...#Else...#End If). Sie werden nicht erst zur Laufzeit, sondern bereits zur bersetzungszeit interpretiert und fhren dazu, dass bestimmte Teile des Codes gar nicht erst bersetzt werden. Ausdrcke in solchen Anweisungen drfen nur aus Literalen und Konstanten zusammengesetzt sein. Visual Basic definiert in diesem Zusammenhang die Boolean-Konstanten Win16 und Win32, deren (jeweils gegenstzlicher) Wahrheitswert ausdrckt, ob die bersetzung auf einer 16-Bit- oder 32-Bit-Plattform erfolgt.
Anwendung

................................................... Anwendung

Zu den einfachen Anweisungen zhlen Zuweisungsoperationen (Let, Set, LSet, RSet Mid), Prozeduren (vordefinierte und benutzerdefinierte), Deklarationen (Const, Dim, Private, Public, Declare) und Definitionen (Function, Sub) aller Art. Alles, was Visual Basic als einfache Anweisungen betrachtet, kann als eigenstndige Programmzeile stehen. berlange einfache Anweisungen lassen sich mittels des bertragsoperators _ (Unterstrich) in zwei oder mehrere Zeilen aufteilen. Dabei muss der bertragsoperator durch ein Leerzeichen getrennt als letztes Zeichen in der Zeile notiert sein und darf insbesondere keine Zeichenfolgenliterale trennen. Mehrere Anweisungen lassen sich in eine Zeile stellen, wenn zwischen den Anweisungen der Aneinanderreihungsoperator : (Doppelpunkt) notiert ist. Eine Kontrollstruktur ist eine zusammengesetzte Anweisung, die sich ber mehrere Zeilen hinweg erstrecken kann und eine Rahmung untergeordneter Anweisungsfolgen mittels Schlsselwrtern vorsieht, entsprechend den die Kontrollstruktur geltenden syntaktischen Regeln. Im Falle der If-Anweisung akzeptiert Visual Basic sowohl die kompakte Zeilenform als auch eine mehrzeilige Form. Rem-Anweisungen sind nur aus formaler Sicht Anweisungen. Eigentlich stellen sie Kommentare dar, da sie der Compiler bei der bersetzung ebenso ignoriert wie Kommentare, die durch ein Hochkomma ' eingeleitet sind.

33

Bezeichner und Namensraum

Bezeichner und Namensraum


Bezeichner, Namensraum, Schlsselwrter
Private, Public, Dim
Beschreibung

................................................... Bes c hreibung

Bezeichner und Namensraum

Bezeichner fungieren in Visual Basic als formale Namen fr verschiedenen Gren: Konstanten, Variablen und Objekte, Funktionen und Prozeduren (Methoden) sowie Module. Bei der Wahl eines Bezeichners fr eine bestimmte Gre geniet der Programmierer weitestgehende Freiheiten. Er muss lediglich die formalen Regeln zur Bezeichnerbildung einhalten und auf Eindeutigkeit im jeweiligen Namensraum achten. Zudem verbietet sich die Verwendung der von Visual Basic reservierten Schlsselwrter, die von der Sprache selbst mit einer festen Bedeutung belegt sind. Die formalen Regeln fr die Bezeichnerbildung in Visual Basic sind:
q q

Bezeichner drfen zwischen ein und 255 Zeichen lang sein Bezeichner mssen mit einem Buchstaben beginnen, wobei auch deutsche Umlaute und Sonderzeichen (genau genommen sogar alle ANSI-Zeichen mit einem Code zwischen 128 und 255) erlaubt sind. Fr alle weiteren Zeichen sind darber hinaus auch die Ziffern 0 bis 9 und der Unterstrich _ erlaubt. Visual Basic unterscheidet in der Notation von Bezeichnern nicht zwischen Gro- und Kleinschreibung. MyVar und Myvar bezeichnen somit dasselbe. (Der Editor der integrierten Entwicklungsumgebung setzt allerdings auf Modulebene eine konsistente Schreibweise durch, indem er jeweils die bei der Deklaration eines Bezeichners verwendete Schreibweise erzwingt und bei implizit deklarierten Bezeichnern jeweils die zuletzt verwendete Schreibweise fr alle Vorkommen des Bezeichners bernimmt.)

Als Namensraum eines Bezeichners wird der Bereich bezeichnet, innerhalb dessen ein Bezeichner bekannt ist. Der grte Namensraum ist der so genannte globale Namensraum oder die Programmebene. Bezeichner, die diesem Namensraum angehren, sind in allen Modulen eines Programms bekannt und somit global ansprechbar. Jeweils kleinere Namensrume sind die Modulebene und Prozedurebene. Bezeichner, deren Namensraum auf die Modulebene beschrnkt ist, sind nur innerhalb des Moduls bekannt, in dem sie deklariert wurden, und Bezeichner, deren Namensraum auf die Prozedurebene beschrnkt ist, sind nur innerhalb der Prozedur (bzw. Funktion) bekannt, in dem sie deklariert wurden. Bei Bezeichnerkonflikten, die durch die Wahl gleicher Bezeichner fr unterschiedliche Gren in berlappenden Namensrumen unterschiedlicher Stufe entstehen, ist im kleineren Namensraum immer nur der in diesem Namensraum deklarierte Bezeichner sichtbar.
Anwendung

................................................... Anwendung

Whrend Modulbezeichner von vornherein dem globalen Namensraum angehren, mssen Prozeduren, Funktionen und Methoden explizit mit dem Zusatz Public deklariert werden, damit ihr Bezeichner im globalen Namensraum sichtbar wird. Geschieht die Deklaration dagegen mit dem Zusatz Private oder ohne Zusatz, ist ihr Bezeichner jeweils immer nur innerhalb des Moduls bekannt, das den Quelltext enthlt. Die vielfltigsten Mglichkeiten fr die Gestaltung des Namensraums bieten Konstanten, Variablen und Objekte. Bei impliziter oder expliziter Deklaration in einem Prozedur- oder Funktionskrper erstreckt sich der Namensraum des Bezeichners ab Deklaration bis zum Endes des Krpers. Findet die Deklaration dagegen auf Modulebene (im Bereich ALLGEMEIN) ohne Zusatz oder unter Angabe von Dim oder Private statt, ist der Bezeichner fortan im restlichen Teil des Modulkrpers bekannt und insbesondere

34

Bezeichner und Namensraum

auch in allen Funktionen und Prozeduren (bzw. Methoden) sichtbar. Whrend sich der Namensraum einer Konstanten grundstzlich nicht ber mehrere Module erstrecken kann, sondern maximal auf die Modulebene beschrnkt bleibt, unterliegen Variablen und Objekte dieser Einschrnkung nicht. Damit eine Variable oder ein Objekt im globalen Namensraum bekannt wird, muss eine Public-Deklaration auf Modulebene erfolgen.
Warnung

................................................... Wa rnung

Visual Basic betrachtet es nicht als Fehler, wenn Sie ein und denselben Bezeichner in verschiedenen Namensrumen vergeben. Solange die Namensrume nichts miteinander zu tun haben, wird dies keine allzu groe Verwirrung stiften, ja, vielfach sogar Vorteile bringen. Problematisch wird es allerdings, wenn ein Namensraum den anderen umfasst, wie etwa die Modulebene eine Prozedurebene. In diesem Fall wird die auf Modulebene deklarierte Variable in der Prozedurebene unsichtbar, weil ihr Bezeichner durch die lokal in der Prozedur deklarierte Variable verdeckt ist. Dies ist meist zu verschmerzen, oft sogar auch gewollt. Fehlertrchtig wird es allerdings, wenn der Programmierer auf eine implizite Deklaration auf Prozedurebene setzt und unwissentlich oder fahrlssig den Bezeichner einer global deklarierten Variable erwischt. So fhrt beispielsweise der folgende Code zu unangenehmen Nebeneffekten:
Dim x As Single, y As Single ... Sub BerechneMatrix(a(), b()) ... For x = 1 To 100 For y = 1 To 200 ... Next x, y End Sub

Bezeichner und Namensraum

Die Variablen x und y werden hier leichtfertig und im Vertrauen auf die implizite Deklaration als Zhlvariablen eingesetzt. Eine solche findet aber nicht statt, da unter diesen Bezeichnern globale Variablen bekannt sind. Diese verlieren durch die Schleifen leider ihren Wert, was an vllig anderer Stelle seltsame Nebeneffekte hervorbringen kann. Deshalb immer fleiig deklarieren und auf globaler Ebene keine nichtssagenden 08/15-Bezeichner vergeben.
Tipp

................................................... Tipp

Wer die Wahl hat, hat die Qual. Dieser Spruch bewahrheitet sich insbesondere, wenn es darum geht, sich immer wieder neue Bezeichner auszudenken. Eine gute Hilfe ist es, sich dabei von formalen Kriterien leiten zu lassen und bei der Auswahl darauf zu achten, dass ein Bezeichner mglichst viel ber die Gre aussagt, fr die er steht. Um Konstanten, Variablen und Prozeduren besser auseinander halten zu knnen, folgen viele Programmierer daher bei der Bildung von Bezeichnern bestimmten Konventionen. So hat es sich beispielsweise bewhrt, Konstanten immer in Groschreibung zu notieren, Variablen mit einem Kleinbuchstaben beginnen zu lassen und Prozeduren mit einem Grobuchstaben. Sehr verbreitet ist zudem die so genannte ungarische Notation, die durch Bezeichnerprfixe den zu einem Bezeichner gehrigen Datentyp zum Ausdruck bringt. Variablen vom Typ Integer wrden mit einem i beginnen, Variablen vom Typ String mit einem s oder str usw. Der restliche Teil des Bezeichners kann dann noch in gemischter Gro- und Kleinschreibung notiert werden, um seine Funktion mnemonisch besser zum Ausdruck zu bringen. (Diese Schreibweise wird inzwischen der frher weit verbreiteten Zusammensetzung mit Unterstrichen _ vorgezogen.) Bei sehr enger Verwandtschaft zweier Gren leistet oft auch die Abzhlung durch Anhngen von Ziffern als Suffix gute Dienste.

35

Kontrollstrukturen

Beispiel

................................................... Beis piel

' Unterscheidung der Notation durch Klein und Groschreibung Const MAXSIZE = 10 ' Konstanten in Groschreibung Private anzahl As Integer ' Variable in Kleinschreibung Private ergebnis As Single, werte(MAXSIZE) As Single Function StandardAbweichung(a() As Single) As Single ' Ungarische Notation Const cMaxSize = 10 ' Prfix "c" fr Konstante Private iElemAnzahl As Integer ' Prfix "i" fr Integer Private bChanging As Boolean ' Prfix "b" fr Boolean Private frmAnmeldung As Form1 ' Prfix "frm" fr Formular Private sErgebnis1 As Single ' Prfix "s" fr Single, Abzhlung Private sErgebnis2 As Single ' Prfix "s" fr Single, Abzhlung Function sStandardAbweichung(a() As Single) As Single
Verwandte Befehle

Kontrollstrukturen

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

DefType
Verwandte Themen

Datentypen und ihre Operationen (S. 49); Typkennzeichen und Bezeichnerbereiche fr Typen (S. 167); Geltungsbereiche von Variablen (S. 173)

Kontrollstrukturen
Aufgabe einer Kontrollstruktur ist die Steuerung der Programmausfhrung in Abweichung von der im Quelltext notierten Anweisungsfolge.

Unbedingte und bedingte Verzweigung, Subroutinen


GoTo {Marke | Zeile} ... Marke: GoSub SubRoutine ... SubRoutine: ... Return If Bedingung Then Anweisung [Else Anweisung] If Bedingung Then [ThenAnweisungsBlock] [ElseIf Bedingung1 [ElseIfAnweisungsBlock]] ... [Else [ElseAnweisungsBlock]] End If

36

Unbedingte und bedingte V erzw eigung,

Subroutinen

Beschreibung

................................................... Bes c hreibung

Die einfachste (inzwischen aber verpnte) Mglichkeit, die Kontrolle einem anderen Programmteil weiterzugeben, ist der unbedingte Sprung mittels GoTo zu einer Sprungmarke oder Zeilennummer. Die Anweisung GoSub ermglicht den Aufruf eines Unterprogramms (auch verschachtelt), das an der Sprungmarke oder Zeilennummer SubRoutine beginnt und bis zur nchsten Return-Anweisung (auf gleicher Ebene) reicht. Sprungmarken und Zeilennummern mssen jeweils innerhalb der gleichen Funktion/Prozedur liegen und am Zeilenanfang stehen. Eine Sprungmarke ist ein beliebiger Bezeichner gefolgt von einem Doppelpunkt. Die wichtigste Kontrollstruktur zur Steuerung des Programmablaufs ist die bedingte Verzweigung in Form der If-Anweisung, fr die zwei unterschiedliche Notationen zulssig sind. In der krzeren Schreibweise (Zeilenform) muss die Anweisung gegebenenfalls samt Else-Teil in einer Zeile und ohne abschlieendes End If notiert sein. In der mehrzeiligen Schreibweise ist dagegen das abschlieende End If unerlsslich. Die Syntax erlaubt in dieser Form zudem ElseIf-Fallunterscheidungen. Die If-Anweisung fhrt den im Then-Zweig gelegenen ThenAnweisungsblock aus, wenn die meist als logischer Ausdruck formulierte Bedingung Bedingung einen Wert ungleich 0 ergibt. Ist der Wert 0, kommt der ElseAnweisungsblock des Else-Zweiges zur Ausfhrung. Der Else-Zweig kann durch Einfgung von ElseIf-Zweigen weiter aufgespreizt sein, wobei ein ElseIf-Zweig nichts anderes als die optimierte Form einer verschachtelten If-Anweisung im Else-Zweig ist. Ergibt sich fr die Bedingung eines ElseIf-Zweiges ein Wert ungleich 0, kommt der ElseIfAnweisungsblock zur Ausfhrung. Bei vorhandenen ElseIfZweigen kommt ein ElseAnweisungsblock nur zur Ausfhrung, wenn alle bis dahin geprften Bedingungen den Wert 0 ergeben haben.
Anwendung

Kontrollstrukturen

................................................... Anwendung

Der unbedingte Sprung mit GoTo, aber auch die GoSub-Unterprogramme, zhlen zu den Erblasten von Basic, denen die Sprache in ihrer Anfangszeit das Attribut Spagetti-Code zu verdanken hatte. In der modernen, strukturierten Programmierung findet in seltenen Fllen nur noch die GoTo-Anweisung Anwendung, nmlich im Zusammenhang mit der Fehlerbehandlung, wo der Befehl im Zusammenspiel mit On Error gezielte Sprnge zu Fehlerbehandlungsroutinen ermglicht. Anstelle von GoSub-Unterprogrammen benutzt man heute ausschlielich benutzerdefinierte Funktionen und Prozeduren. Anders die If-Anweisung. Sie hat an Wichtigkeit im Laufe der Zeit nichts eingebt. In der mehrzeiligen Form eignet sie sich bei Verwendung von ElseIf-Zweigen fr umfangreichere Fallunterscheidungen, auch wenn die Select-Anweisung hier oft die bessere Wahl darstellt. IfAnweisungen knnen natrlich auch vollstndig verschachtelt werden, von der Laufzeit her sind ElseIf-Formulierungen jedoch berlegen.
Warnung

................................................... Wa rnung

Aufrufe parameterloser Prozeduren und schlichte Sprungmarken kann Visual Basic von der Notation her nicht unterscheiden, wenn der Doppelpunkt-Operator zur Anreihung mehrerer Anweisungen in einer Programmzeile ins Spiel kommt. Visual Basic zieht in diesem Fall die Interpretation Sprungmarke der anderen vor. Setzen Sie parameterlose Prozeduraufrufe daher besser in eigene Zeilen (ohne nachfolgenden Doppelpunkt) oder benutzen Sie die CallAnweisung fr den Aufruf.
Beispiel

................................................... Beis piel

Die folgenden Zeilen zeigen, wie die Logik fr die Berechnung der Sgn-Funktion aussieht:

37

Kontrollstrukturen

If a > 0 Then a = 1 ElseIf a < 0 Then a = -1 End If ' fr den Fall a = 0 hat a bereits den richtigen Wert!
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

On Error, Select, On ... GoSub


Verwandte Themen

Kontrollstrukturen

Operatoren fr elementare Datentypen und logische Bedingungen (S. 54); Fallunterscheidung (S. 38); Fehlerbehandlung (S. 43)

Fallunterscheidung
Select Case TestAusdruck [Case Fall1 [AnweisungsBlock1]] ... [Case FallN [AnweisungsBlockN]] [Case Else [ElseAnweisungsBlock]] End Select Function Switch(Ausdruck1, Wert1,[Ausdruck2, Wert2[, ...]]) As Variant Function Choose(Index As Integer, Wert1[, Wert2[,... WertN]]) As Variant On Ausdruck GoSub SprungzielListe On Ausdruck GoTo Sprungzielliste Function IIf(Kriterium As Boolean, ThenWert, ElseWert) As Variant
Beschreibung

................................................... Bes c hreibung

Die Select Case-Kontrollstruktur fhrt eine Fallunterscheidung auf Basis des Werts von TestAusdruck durch. Fr jeden zu unterscheidenden Fall ist ein Case-Zweig mit der Anweisungsfolge AnweisungsblockN zustndig. Der Case-Ausdruck Fall kann als Konstante/Literal, Is-Vergleich (offener Bereich), To-Bereich (geschlossener Bereich) oder als Fall-Aufzhlung formuliert sein: Fall Fall Fall Fall = = = = Zahl | Zeichenfolge Is VglOperator VglWert Fall1 To FallN Fall1, ..., FallN

In einer Select-Struktur kommt maximal ein, bei vorhandenem Else-Zweig genau ein Zweig zur Ausfhrung. Die Switch-Funktion fhrt eine Fallunterscheidung auf Basis ihrer in Paaren zu je einem Ausdruck und einem potentiellen Funktionswert organisierten Parameterliste durch. Den Funktionswert WertN eines solchen Paares gibt die Funktion zurck, wenn der Ausdruck AusdruckN von links beginnend der erste Ausdruck ist, der einen von 0 verschiedenen Wert hat, also den Wahrheitswert True besitzt. Falls keiner der Ausdrcke ungleich 0 ist, liefert die Funktion den Wert Null.

38

Fallunterscheidung

Die Choose-Funktion liefert den an der Position Index in der Werteliste stehenden Wert der Wert 1 whlt Wert1, der Wert 2 whlt Wert2 usw. Die On-Kontrollstruktur ermglicht eine Fallunterscheidung durch Auswahl eines Sprungziels aus der Liste SprungzielListe in Abhngigkeit von Ausdruck. Der Wert von Ausdruck darf zwischen 0 und 255 liegen. Ist er 0 oder grer als die Anzahl der Sprungziele in der Liste, findet kein Sprung bzw. Unterprogrammaufruf statt, ansonsten benennt er die Listenposition des anzusteuernden Sprungziels. Als Sprungziele knnen wahlweise Zeilennummern oder Sprungmarken genannt sein, die in der gleichen Funktion/Prozedur definiert sind. Eine Fallunterscheidung der besonderen Art stellt die Funktion IIf dar. Sie wird mit drei Parametern aufgerufen und liefert in Abhngigkeit vom Wahrheitswert des ersten Parameters den zweiten Parameter (erster Parameter ist True) oder dritten Parameter (erster Parameter ist False) als Funktionsergebnis.
Anwendung

Kontrollstrukturen

................................................... Anwendung

Obwohl sich Fallunterscheidungen prinzipiell gesehen genauso gut ber If-Anweisungen (verschachtelt oder mit ElseIf-Zweigen) formulieren lassen, sind Select Case-Formulierungen im Allgemeinen eleganter und bersichtlicher vor allem, wenn viele Flle zu unterscheiden sind. Die Syntax fr die Formulierung der einzelnen Flle ist reichhaltig. Der Compiler nimmt allerdings keine berprfung auf berlappung vor, so dass auf eine disjunkte Formulierung der Fall-Ausdrcke geachtet werden sollte. In einfachen Fllen, wenn sich die Fallunterscheidung (wie bei Arrays) auf die indexorientierte Auswahl eines Werts aus einer Werteliste zurckfhren lsst, sollte die Choose-Funktion das Mittel der Wahl sein. Dieselbe Funktionalitt lsst sich allerdings mittels der Array-Funktion erzielen, wie das Beispiel am Ende des Abschnitts zeigt. Fr Fallunterscheidungen, die auf die Auswahl eines Werts in Abhngigkeit verschiedener Bedingungen hinauslaufen, ist die Switch-Funktion meist das eleganteste Mittel. Die Anwendung der Funktion widerspricht aber in gewisser Hinsicht der Intuition, da es grundstzlich zur Auswertung aller Ausdrcke kommt. In der Praxis hat das zwei Auswirkungen: Erstens muss jeder Ausdruck fr jeden Fall wohldefiniert sein (kein berlauf, keine Division durch 0 etc.), sonst kommt es zu einem Laufzeitfehler, und zweitens hat die Funktion unabhngig vom unterschiedenen Fall immer die gleichen Seiteneffekte. Von einem Gebrauch der On-Anweisung (jenseits von On Error) ist abzuraten, weil GoTo-Sprnge und GoSub-Unterprogramme angesichts der reichhaltigen Ausstattung von Visual Basic fr die strukturierte Programmierung nicht mehr zeitgem sind. Diese Befehle werden nur noch fr die Abwrtskompatibilitt untersttzt.
Warnung

................................................... Wa rnung

Da in Select-Strukturen immer nur ein Case-Zweig zur Ausfhrung kommt, ist im Falle der berlappung von Case-Ausdrcken die Reihenfolge der Case-Aufzhlung relevant. Visual Basic wertet bei Abarbeitung der Switch-Funktion immer alle Ausdrcke aus, so dass eventuelle Seiteneffekte vom Funktionswert unabhngig bleiben.
Beispiel

................................................... Beis piel

Der folgende Code zeigt die eine Select-Fallunterscheidung fr den von einem Textfeld gemeldeten Tastaturcode:
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyDelete, vbKeyBack ' wg. berschreibmodus Case vbKeyUp, vbKeyDown ' Nchste Zeile in Textfeld AktualisiereZeile(sZeile) ' nderungen zurckschreiben

39

Kontrollstrukturen

Kontrollstrukturen

Case vbKeyEscape List1_Click ' Ursprngliche Fassung holen Case vbKeyEnd Start = LineLen 1 Case vbKeyLeft Start = LinePos 1 Case vbKeyRight Start = LinePos + 1 Case vbKeyHome Start = 0 Case Else ' Sonstige Tasten VerarbeiteTaste(KeyCode, sZeile) End Select Text1.SelStart = Start ' Position in Puffer aktualisieren Text1.SelLength = 1 ' berschreibmodus End Sub

Hier verschiedene Formulierungen fr die Zuordnung eines numerischen Werts zu einer Zeichenfolge:
sZahl = Choose(a + 1, "Null", "Eins", "Zwei", "Drei", "Vier", "Fnf") sZahl = Switch(a = 0, "Null", a = 1, "Eins", a = 2, "Zwei", a = 3, _ "Drei", a = 4, "Vier", a = 5, "Fnf") sZahl = Array("Null", "Eins", "Zwei", "Drei", "Vier", "Fnf")(a)

IIf macht die Min-/Max-Berechnung leicht:


Min = IIF(a < b, a, b) Max = IIF(a > b, a, b)
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

If, GoTo, GoSub


Verwandte Themen

Unbedingte und bedingte Verzweigung, Subroutinen (S. 36)

Schleifen
For CountVar = StartVal To EndVal [Step StepVal] [Anweisungsfolge] [Exit For] [Anweisungsfolge] Next [CountVar[, CountVar1]] For Each IteratVar In Liste [Anweisungsfolge] [Exit For] [Anweisungsfolge] Next [IteratVar[, IteratVar1 ...]] While Bedingung [Anweisungsfolge] [Exit While]

40

Schleifen

[Anweisungsfolge] Wend Do [{While | Until} Bedingung] [Anweisungsfolge] [Exit Do] [Anweisungsfolge] Loop Do [Anweisungsfolge] [Exit Do] [Anweisungsfolge] Loop [{While | Until} Bedingung]
Beschreibung

Kontrollstrukturen

................................................... Bes c hreibung

Schleifen sind Kontrollstrukturen, die es gestatten, einen Anweisungsblock oder Schleifenkrper in Abhngigkeit eines Kriteriums einer logischen Bedingung oder dem Wert einer Zhlvariablen mehrmals zu durchlaufen. Das klassische Programmiermodell unterscheidet zwischen abweisenden Schleifen, die das Schleifenkriterium im Schleifenkopf vor dem ersten Durchlaufen des Schleifenkrpers prfen (und selbst die einmalige Ausfhrung des Schleifenkrpers unterbinden knnen), und nicht abweisenden Schleifen, die ihr Kriterium nach Abarbeitung des Schleifenkrpers prfen. Visual Basic weicht diese Unterscheidung allerdings auf, indem es sprachliche Mittel fr den Schleifenabbruch an beliebiger Stelle vorsieht. Darber hinaus lsst sich zwischen Schleifen unterscheiden, bei denen eine Berechnung der bentigten Schleifendurchlufe noch vor dem ersten Eintritt in die Schleife mglich ist (Zhlschleifen), und solchen, bei denen diese Berechnung nicht mglich ist (Schleifen mit implizitem Abbruchkriterium). Schleifen, deren Kriterium sich nie erfllt, heien Endlosschleifen. Falls der Schleifenkrper einer Schleife eine weitere Schleife enthlt, spricht man von verschachtelten Schleifen.
Anwendung

................................................... Anwendung

Der Einsatzbereich von Schleifen ist derartig breit, dass es wohl nur wenige auch nur halbwegs anspruchsvolle Programme geben wird, die ohne dieses Mittel auskommen. Abweisende Schleifen werden in Visual Basic als For-, While- oder Do-Schleifen und nicht abweisende Schleifen ausschlielich als Do-Schleifen formuliert. Als Zhlschleife ist die starre Form der For-Schleife am besten geeignet. Schleifen lassen sich beliebig verschachteln, solange gewhrleistet ist, dass eine uere Schleife den Schleifenkrper einer inneren Schleife jeweils vollstndig enthlt.

Die For...Next- Schleife


Eine For-Schleife kann in einer von zwei Formen benutzt werden. In der ersten Form verlangt sie die Bekanntgabe einer Zhlvariablen (CountVar) eines beliebigen numerischen Typs, eines Startwerts (StarVal), eines Endwerts (EndVal) und gegebenenfalls einer Schrittweite, wenn diese von der standardmigen Schrittweite 1 abweicht. Der Ablauf ist: 1. Beim ersten Eintritt der Programmausfhrung in den Schleifenkopf initialisiert die ForSchleife die Zhlvariable mit dem Startwert. 2. Unmittelbar vor jedem Durchlaufen des Schleifenkrpers prft die Schleife, ob die Zhlvariable den Endwert bereits berschritten hat. Falls ja, endet die Schleife, und die Ausfhrung berspringt den Schleifenkrper. 3. Nach jedem Durchlaufen des Schleifenkrpers erfolgt automatisch die Aktualisierung der Zhlvariablen unter Beachtung der geltenden Schrittweite.

41

Kontrollstrukturen

Beachten Sie, dass Sie zwar den Wert der Zhlvariablen jederzeit ndern und somit das Verhalten der Schleife von innerhalb des Schleifenkrpers manipulieren knnen, nicht jedoch den geltenden Endwert oder die Schrittweite. Von einer solchen Manipulation ist aber generell eher abzuraten, da der Code dann nicht mehr bersichtlich ist. Um eine For-Schleife verfrht abzubrechen, bedienen Sie sich besser des Befehls Exit For. Als Datentyp fr die Zhlvariable kommen ganzzahlige Typen wie Integer oder Long in Betracht, ebenso aber auch Fliekommatypen wie Single oder Double. Das beste Laufzeitverhalten hat eine Schleife, wenn die Zhlvariable vom Typ Long ist. Um eine Schleife zum Rckwrtszhlen zu bewegen, geben Sie StepVal mit einer negativen Schrittweite an sowie einen Endwert, der kleiner als der Startwert ist.

Kontrollstrukturen

Dim i As Long For i = 10 to 2 Step -2 Print i, i+1 Next i

In Form der For Each-Schleife ermglicht die For-Schleife das Durchlaufen aller Elemente einer Auflistung Liste. An die Stelle der Zhlvariable tritt die Aufzhlvariable IterateVar, die bei jedem Schleifendurchlauf den Wert des jeweils nchsten Elements von Liste annimmt, bis das Ende der Auflistung erreicht ist. Eine Modifikation der Aufzhlvariable innerhalb des Schleifenkrpers hat keine Auswirkung auf die Aufzhlung. Einzig der vorzeitige Abbruch mittels Exit For ist mglich. Als Voraussetzungen fr die Anwendung dieser Form sind zu beachten: Liste muss eine Auflistung (Collection-Objekt) oder ein Array sein, und IterateVar muss den Datentyp Variant oder einen Objektdatentyp tragen.
Dim a(20) As Integer Dim i As Variant For Each i In a i = 2 Next i

' Array elementweise initialisieren

Die Nennung der Zhl- bzw. Aufzhlvariablen nach dem Schlsselwort Next ist optional. Als Abschluss verschachtelter For-Schleifen ist auch die Nennung mehrerer Zhl- bzw. Aufzhlvariablen nach dem Schlsselwort Next zulssig.

Die W hile...W end- Schleife


Als Standardlsung fr abweisende Schleifen bietet sich die While-Schleife an. Schleifen dieser Art prfen unmittelbar vor jedem Eintritt in den Schleifenkrper, ob das Kriterium Bedingung einen Wert ungleich 0 hat. Falls dem so ist, bricht die Schleife ab und die Ausfhrung berspringt den Schleifenkrper. While-Schleifen lassen sich jederzeit auch von innerhalb des Schleifenkrpers mittels einer Exit While-Anweisung abbrechen.
While Not EOF(1) Line Input #1, a MyList.AddItem a Wend ' Zeilen aus Datei in Auflistung einlesen

Die Do...Loop- Schleife


Am meisten Flexibilitt bietet die Do-Schleife. Sie lsst sich als abweisende, als nicht abweisende Schleife und als Endlosschleife formulieren. In der abweisenden Form wird das Schleifenkriterium mit einem While- oder Until-Zusatz hinter das Schlsselwort Do, in der nicht abweisenden Form hinter das Schlsselwort Loop gesetzt. Ein While-Kriterium bricht die Schleife ab, wenn es den Wert 0 hat, whrend ein Until-Kriterium mit einem Wert ungleich 0 den Abbruch bedingt. Wie die anderen Schleifen lsst sich auch die Do-Schleife jederzeit von innerhalb des Schleifen-

42

Fehlerbehandlung

krpers mittels einer Exit Do-Anweisung abbrechen. Endlosschleifen sind in Wirklichkeit halbabweisende Schleifen, da sie mittels Exit Do irgendwo mitten im Schleifenkrper abgebrochen werden mssen.
Do Line Input #1, a Loop While a = "" MyList.AddItem a
Warnung

' Leerzeilen berlesen

' Zeile in Auflistung einfgen

................................................... Wa rnung

Da Schleifen die Reaktionen eines Windows-Programms auf Benutzereingaben sehr beeintrchtigen knnen, empfiehlt es sich, in Schleifen mit zeitaufwndigen Berechnungen etwa jede Zehntelsekunde die Anweisung DoEvents aufzurufen. Beachten Sie jedoch, dass es zur Rekursion kommt, wenn bei der Ereignisverarbeitung die so unterbrochene Funktion/Prozedur erneut aufgerufen wird. Achtung! Endlosschleifen entstehen hufig auch ungewollt durch Ereignisse, die sich gegenseitig oder selbst auslsen. Ereignisfluten dieser Art knnen das System destabilisieren.
Tipps

Kontrollstrukturen

................................................... Tipps
Als Faustregel lsst sich sagen, dass Schleifen in einem Programm ca. zwischen 80 und 99 Prozent der Ausfhrungszeit absorbieren. Es lohnt sich daher, wenn es um die Einsparung von Laufzeit geht, insbesondere innere Schleifen zu optimieren, die besonders oft durchlaufen werden. Rekursive Aufrufe von Funktionen/Prozeduren lassen sich in der Regel ohne groe Schwierigkeiten mittels Schleifen in iterative Aufrufe berfhren. Iterative Fassungen dienen insbesondere der Vermeidung des Fehlers 28, Nicht gengend Stapelspeicher und sind von der Laufzeit her meist berlegen. Endlosschleifen nicht kompilierter Programme lassen sich innerhalb der Entwicklungsumgebung mittels (Strg)+(Untbr) abbrechen. Schwieriger ist der Abbruch von endlosen Ereignisschleifen unter Windows 9x. Aber auch hierzu gibt es einen Trick, den unter Windows 9x allflligen Reset zu vermeiden. Das Problem ist, dass der Task-Scheduler von Windows 9x der aus dem Rahmen fallenden Anwendung nach gewisser Zeit nahezu die gesamte Rechenzeit zur Verfgung stellt, weil die Nachrichtenflut die Prioritt so weit hochschraubt, dass keine Hintergrundanwendung mehr Nachrichten zugestellt bekommt (noch nicht einmal der Task-Switcher). Der Trick: Man muss die Visual-Basic-Anwendung durch den impliziten Start einer Vordergrundanwendung in den Hintergrund verbannen. Fr einen solchen impliziten Start reicht bereits das Einlegen einer CD (gegebenenfalls mit Autorun-Anwendung) oder der Empfang eines Faxes. Windows NT ist gegen endlose Ereignisschleifen unempfindlich, da die Ereigniswarteschlange in diesem Betriebssystem anders implementiert ist.
Beispiele

................................................... Beis piele

Fr die For-Anweisung vgl. das Beispiel zu Literale und Konstanten (S. 23). Fr die Do-Anweisung vgl. das Beispiel zu InStrRev-Funktion (S. 79). Fr die While-Anweisung vgl. die Beispiele zu Dir-Funktion (S. 148). Komplexer ist das Beispiel des Bubble-Sort-Algorithmus im Abschnitt Prozeduren selbst definieren (S. 204).

Fehlerbehandlung
Sub Error(lFehlerNr As Long)

43

Kontrollstrukturen

Sub Err.Raise(Number As Long[, Source As String, _ Description As String, Helpfile As String, _ Helpcontext As String]) Function Error(lFehlerNr As Long) As String On Error Resume Next On Error GoTo Marke ... [On Error GoTo 0] ... Exit {Function | Sub} Marke: ... Resume [Next] Function CVErr(FehlerNummer As Long) As Error Funktion IsError(VarWert) As Boolean
Beschreibung

Kontrollstrukturen

................................................... Bes c hreibung

Die Vielfalt der mglichen Ursachen fr das Fehlverhalten eines Systems steigt mit der Komplexitt des Systems. Es ist nicht nur aus theoretischen Grnden unmglich, die Logik eines Programms so zu gestalten, dass dieses vor jedem Schritt jede Fehlermglichkeit ausschliet schlielich knnte sich eine Fehlerbedingung im zeitlichen Verlauf auch erst unmittelbar nach der Prfung einstellen , auch aus praktischen Erwgungen heraus ist es unsinnig, Laufzeit fr die berprfung selbst halbwegs wahrscheinlicher Fehlerbedingungen aufzuwenden. Anstatt umfangreicher und letztlich doch unzulnglicher Fehlerprfungen setzt sich daher in den Programmiersprachen zunehmend das Konzept der Ausnahmebehandlung bzw. der Behandlung von Laufzeitfehlern durch. Zu einem Laufzeitfehler kommt es, wenn eine Routine ihrer Aufgabe aufgrund einer Fehlerbedingung nicht nachkommen kann und dies als Laufzeitfehler mit einer bestimmten Nummer signalisiert. Das Signal fr einen Laufzeitfehler kann von einer Routine des Betriebssystems, einer Komponente oder einem sonstigen Objekt gesetzt werden (die entsprechenden Fehlernummern sind im Hilfesystem dokumentiert), aber auch von einer Visual-Basic-Routine selbst, wenn diese die Anweisung Error unter Angabe einer Fehlernummer, lFehlerNr, oder die RaiseMethode des vordefinierten Err-Objekts ausfhrt. Die Funktion Error liefert die zu einer Fehlernummer gehrige textuelle Fehlermeldung. Zur Behandlung eines Laufzeitfehlers gleich welcher Natur dieser ist lsst sich mittels einer On Error GoTo-Anweisung eine vorbereitete Fehlerbehandlungsroutine auf Funktions-/Prozedurebene installieren. Die Anweisung On Error Resume Next installiert dagegen eine standardmige Fehlerbehandlungsroutine fr die Inline-Fehlerbehandlung, deren Strategie darin besteht, den fr den Laufzeitfehler verantwortlichen Befehl zu berspringen und die Fehlerbehandlung unmittelbar im Anschluss an den Befehl durch Auswertung der Fehlernummer durchzufhren. Fr die De-installation einer Fehlerbehandlungsroutine sorgt On Error GoTo 0. Ein anderes Konzept fr die Signalisierung von Fehlern erffnet die Funktion CVErr. Sie liefert einen Wert von Typ Variant mit dem Untertyp Error zurck und ermglicht die Implementation von Funktionen/Prozeduren, die als Ergebniswert auch eine Fehlernummer zurckgeben knnen. Ob ein Variant-Wert den Untertyp Error hat, lsst sich mittels der IsError-Funktion in Erfahrung bringen. Aufgerufen mit einem Variant-Wert, liefert Sie den Wert True, wenn dieser eine Fehlernummer reprsentiert.

44

Fehlerbehandlung

Anwendung

................................................... Anwendung

Die Anweisungen Error bzw. Err.Raise werden im Allgemeinen zur Simulation von Fehlern eingesetzt, um den Code fr die Behandlung von Laufzeitfehlern zu testen. Darber hinaus eignen sich die Befehle auch fr die Realisierung programminterner Fehlerbehandlungsmechanismen. (Einzelheiten ber den Einsatz des Fehlerobjekts fr die Signalisierung von Laufzeitfehlern finden Sie im Abschnitt Err-Objekt, S. 277). Die Fehlernummer 0 sowie Fehlernummern grer als 65535 sind nicht zulssig, sondern fhren ihrerseits zu einem Laufzeitfehler 5, Ungltiger Prozeduraufruf oder ungltiges Argument. Die Fehlernummern zwischen 1 und 1000 sind fr das Laufzeitsystem von Visual Basic reserviert, wenn auch derzeit noch nicht alle mit einer Bedeutung versehen sind. Die anderen Fehlernummern sind frei verfgbar und lassen sich fr programmspezifische Zwecke nutzen. Fr die reservierten Fehlernummern von Visual Basic stehen textuelle Fehlermeldungen zur Verfgung, die sich mittels der Funktion Error jeweils auf den letzten Fehler bezogen abfragen lassen. Bei Einsatz des Err-Objekts lsst sich diese Fehlermeldung fr jede Fehlernummer Number frei gestalten, da Error nichts weiter als den Wert der Description-Eigenschaft dieses Objekts liefert. Wenn der Vorgabetext des Systems fr die Signalisierung programmspezifischer Fehler nicht angemessen ist, ist nur der Wert dieser Eigenschaft anzupassen bzw. der Text als Wert bei Aufruf der Raise-Methode fr den zweiten Parameter anzugeben. Um Laufzeitfehler abzufangen und darauf reagieren zu knnen, installiert man mittels On Error GoTo Marke eine Fehlerbehandlungsroutine, wobei Marke (am Zeilenanfang gefolgt von einem Doppelpunkt zu notieren) eine innerhalb derselben Routine befindliche Sprungmarke darstellt, die den Beginn des Fehlerbehandlungscodes kennzeichnet. Die fr die genauere Analyse des Fehlers erforderliche Fehlernummer liefert die Eigenschaft Err.Number des vordefinierten Fehlerobjekts. Nachdem es sich dabei um die Standardeigenschaft des Objekts handelt, ergibt sich der Wert bereits durch schlichte Nennung des Objektbezeichners was insbesondere die Kompatibilitt mit lterem Basic-Code sicherstellt. Der zur Fehlernummer gehrige Fehlertext liefert die Error-Funktion oder die Eigenschaft Err.Description. Der Befehl Resume beendet die Fehlerroutine nach erfolgreicher Behandlung des Fehlers mit einem Rcksprung und bewirkt die erneute Ausfhrung jenes Befehls, der den Laufzeitfehler ausgelst hatte. Falls eine Wiederholung dieses Befehls nicht in Frage kommt, lsst sich die Ausfhrung mit Resume Next beim nchstfolgenden Befehl wieder aufnehmen. Bei Fehlern, die sich nicht erfolgreich behandeln lassen oder fr die die Fehlerroutine nicht ausgelegt ist, bleibt der Routine nur der Ausweg, ihrerseits einen Fehler auszulsen, der dann auf der Ebene des Aufrufers behandelt wird und somit den gleichen Weg nimmt wie ein Fehler, fr den keine Fehlerbehandlung auf aktueller Aufrufebene eingerichtet ist. Anders herum: Kommt whrend der Behandlung eines Fehlers eine Funktion/Prozedur zum Aufruf, die eine eigene Fehlerbehandlung vornimmt, ist deren Fehlerbehandlungsroutine fr alle auf dieser Ebene ausgelsten Fehler zustndig. Hat die Funktion/Prozedur keine eigene Fehlerbehandlung, fllt die Fehlerbehandlung der Fehlerbehandlungsroutine des Aufrufers zu. Damit besteht die Mglichkeit, dass eine Fehlerbehandlungsroutine whrend der Behandlung eines Fehlers erneut zum Aufruf kommt, was von der Sache her nicht unbedingt mit Schwierigkeiten verbunden sein wird, logisch aber ein wenig verzwickt sein kann. Wenn ein Laufzeitfehler bereits durch berspringen des jeweiligen Befehls behoben ist, kann die Fehlerbehandlungsroutine auch inline mittels On Error Resume Next installiert werden. In diesem Fall ist kein weiterer Code erforderlich. Die Zustndigkeit der jeweils aktuellen Fehlerbehandlungsroutine in einer Funktion/Prozedur erlischt mit dem Befehl On Error GoTo 0. Fehlt dieser Befehl, endet Zustndigkeit mit der Rckgabe der Kontrolle an den Aufrufer.

Kontrollstrukturen

45

Kontrollstrukturen

Bei Signalisierung eines Fehlers ermittelt das Laufzeitsystem jeweils die nchste zustndige Fehlerbehandlungsroutine. Eine auf gleicher Ebene (Prozedurebene) gelegene Fehlerbehandlungsroutine kommt als Erstes zum Zuge, ansonsten wandert der Fehler in umgekehrter Aufruffolge von Aufrufer zu Aufrufer, bis sich eine zustndige Fehlerbehandlungsroutine findet oder das Laufzeitsystem schlielich eine standardmige Behandlung vornimmt.
Warnung

................................................... Wa rnung

Die Logik von Fehlerbehandlungsroutinen ist meist komplizierter als man denkt. So ist erstens davon auszugehen, dass jeder zwischen einer On Error GoTo Marke-Anweisung und einer On Error GoTo 0-Anweisung auftretende Laufzeitfehler zum Aufruf der Routine fhren kann: falsche Argumente bei Prozedur-/Funktionsaufrufen ebenso wie Laufzeitfehler, die von einer aufgerufenen Prozedur oder Funktion signalisiert werden, weil sie dort keine Behandlung erfahren oder eine Behandlung nicht mglich ist. Zweitens ist aber auch davon auszugehen, dass ein Fehler immer wieder auftritt, weil er nicht korrekt behoben ist. Der unbedachte Einsatz von Resume ohne den Zusatz Next kann dann zu lstigen Endlosschleifen fhren, die sich in der Entwicklungsumgebung nur noch mittels (Strg)+(Untbr) oder in der kompilierten Fassung des Programms nur noch ber den Task-Manager abbrechen lassen. Ein hufiger Fehler im Zusammenhang mit Fehlerbehandlungsroutinen ergibt sich aus einer Nachlssigkeit: Die Ausfhrung durchluft die Routine auch ohne Vorliegen eines Laufzeitfehlers, weil diese nicht durch den Befehl Exit Sub oder Exit Function vom gewhnlichen Code abgesetzt ist.
Tipp

Kontrollstrukturen

................................................... Tipp

Testen Sie jede Fehlerbehandlungsroutine auf Herz und Nieren, indem Sie Testcode einsetzen, der alle Fehler also auch solche, die die Routine nicht behandeln kann mittels Error-Anweisungen oder Aufrufen der Methode Err.Raise simuliert.
Beispiel

................................................... Beis piel

Das folgende Codebeispiel demonstriert die Fehlerbehandlung, wenn das ffnen einer Datei mit vorangehender Abfrage des Dateinamens fehlschlgt. Da es keinen Sinn macht, die OpenAnweisung ohne erneute Eingabe des Dateinamens (hier ber ein Standarddialoge-Objekt CommonDialog1 gelst) zu wiederholen, ist der betreffende Code in einer eigenen Funktion zusammengefasst, der die Dateinummer zurckliefert. Die in der aufrufenden Routine installierte Fehlerbehandlungsroutine bietet dem Benutzer die Wahl zwischen der Wiederholung des gesamten Funktionsaufrufs oder einem Abbruch der aktuellen Routine. Der Abbruch wird seinerseits durch Auslsung eines Laufzeitfehlers bewerkstelligt. (Hinweis: Der FreeFile-Aufruf liefert nach einem Fehlschlag wieder die gleiche Dateinummer, da Open keine Reservierung der angebotenen Dateinummer vornimmt.)
... Dim Handle As Integer Dim Meldung As String ... On Error GoTo OpenFehler ' Routine installieren Handle = OpenBinary ' Funktion aufrufen On Error GoTo 0 ' Routine de-installieren ... Exit Sub ' Hier nicht weiter! OpenFehler: Meldung = "Fehler" + Str(Err) + ": " + Error(Err)

46

Fehlerbehandlung

If MsgBox(Meldung, vbRetryCancel) = vbRetry Then Resume ' Funktionsaufruf wiederholen Else ' Fehler an Aufrufer weitermelden Err.Raise(1001, "Binrdatei lsst sich nicht ffnen") End If ... Function OpenBinary() As Integer OpenBinary = FreeFile ' freie Dateinummer ermitteln CommonDialog1.ShowOpen Open CommonDialog1.FileName For Binary As FreeFile End Function

Kontrollstrukturen

Vgl. auch das Beispiel zu Open-Anweisung (S. 166).


Verwandte Themen

................................................... Verwa ndte Them en

Dateiorientierte Funktionen und Anweisungen (S. 126); Err-Objekt (S. 277); Standarddialoge-Steuerelement (CommonDialog) (S. 444)

47

Datentypen und ihre Operationen


Wie alle Programmiersprachen, deren Wurzeln in der prozeduralen Programmierung liegen, verfgt Basic ber ein Typkonzept, das im Laufe der Sprachentwicklung zunehmend reichhaltiger geworden ist. Das ursprngliche Typsystem von Basic war geschlossen. Es gab vier numerische Datentypen mit unterschiedlichen Wertebereichen, ber denen sich Ganzzahl- und Fliekommaarithmetik und ein wenig Boolsche Algebra betreiben lie, sowie einen Zeichenfolgendatentyp mit vielen komfortablen Funktionen. QuickBasic und QBasic brachten der Sprache eine Pascalisierung, die sich nicht nur in einem verallgemeinerten Prozedur- und Funktionsbegriff bemerkbar machte, sondern auch in der ffnung des Typsystems fr benutzerdefinierte Datentypen. Darber hinaus erhielt die Sprache auch einen flexiblen Datentyp, der jeden elementaren Datentyp (nicht jedoch benutzerdefinierte Datentypen) vertreten konnte und aufgrund impliziter Typumwandlungen eine gewisse Typtoleranz mit sich brachte. Seit die Sprache mit Visual Basic in den Bereich der objektorientierten Programmierung vorgedrungen ist, hat das Typsystem der Sprache in Form der in Typbibliotheken vorliegenden Objektdatentypen eine explosive Verbreiterung erfahren.

Elementare Datentypen
Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object, String, Variant True, False, Empty, Nothing, Null, Error Function IsEmpty(Var) As Boolean Function IsError(Var) As Boolean Function IsNull(Var) As Boolean Function IsNumeric(Var) As Boolean Function IsObject(Var) As Boolean
Beschreibung

................................................... Bes c hreibung

Elementare Datentypen sind die Grundelemente einer Sprache fr die Darstellung und Interpretation von Informationen. Die einzelnen Datentypen unterscheiden sich hinsichtlich ihrer Darstellung, ihrer Wertebereiche und der fr sie definierten grundlegenden Operationen. Visual Basic kennt elementare Datentypen fr die Reprsentation logischer Werte (Boolean), binrer Werte (Byte), numerischer Ganzzahlwerte (Integer und Long), numerischer Fliekommawerte (Single und Double), Datumsgaben (Date), Zeichenfolgen (String) und die Referenz auf Objekte (Object).
Anwendung

................................................... Anwendung

Mit Hilfe der elementaren Datentypen lassen sich Konstanten und Variablen fr die Handhabung der in Programmen anfallenden Daten deklarieren. Jeder dieser Datentypen mit Ausnahme von Variant steht fr eine ganz bestimmte Art der Reprsentation und Interpretation von Information. Die folgende Tabelle gibt einen berblick ber ihre Wertebereiche.

"'

Elementare Datentypen

Datentyp Byte Boolean Integer Long Single

Bytes 1 2 2 4 4

Beschreibung und Wertebereich Kurze vorzeichenlose Ganzzahl zwischen 0 bis 255 Logischer Wert, True oder False Ganzzahl zwischen 32.768 bis 32.767 Lange Ganzzahl zwischen 2.147.483.648 und 2.147.483.647 Gleitkommazahl einfacher Genauigkeit von 3,402823E38 bis 1,401298E45 fr negative Werte und von 1,401298E-45 bis 3,402823E38 fr positive Werte Gleitkommazahl mit doppelter Genauigkeit: 1,79769313486232E308 bis 4,94065645841247E-324 fr negative Werte und 4,94065645841247E324 bis 1,79769313486232E308 fr positive Werte Ganzzahl mit Skalierung in 10.000stel zwischen 922.337.203.685.477,5808 und 922.337.203.685.477,5807 29stellige Dezimalzahl ohne Exponent, als Ganzzahl zwischen 79.228.162.514.264.337.593.543.950.335 mit Abstand 1, als Zahl mit 28 Nachkommastellen zwischen 7,9228162514264337593543950335 mit Abstand 0,0000000000000000000000000001 Datum zwischen 1. Januar 100 und 31. Dezember 9999 Referenz auf ein Objekt, eine gltige Adresse oder Nothing

Elementare Datentypen

Double

Currency Decimal

8 14

Date Object String

8 4

10 + Lnge Zeichenfolge mit variabler Lnge. 0 bis theoretisch 231-1 Zeichen. In der Praxis ist je nach Speicherausbau des Systems aber bereits bei einer Lnge von ca. 100 Millionen Zeichen Schluss, wegen berlauf des Zeichenfolgenspeichers Lnge 16 Zeichenfolge mit fester Lnge zwischen 1 und 65.535 (216-1) Standardtyp, bei numerischem Untertyp wie der Datentyp Double

String * Variant Variant

22 + Lnge Standardtyp, bei Zeichenfolge als Untertyp, wie Datentyp String mit variabler Lnge

Die elementaren Datentypen von Visual Basic

Der Datentyp Variant


Der Typ Variant bildet eine Hlle fr alle anderen Datentypen und kann alle durch elementare Datentypen darstellbaren Werte reprsentieren (auer Zeichenfolgen fester Lnge) sowie die Werte Empty, Nothing, Null und Error. Variablen vom Typ Variant mssen nicht eigens deklariert werden, da Visual Basic diesen Datentyp als Standardtyp fr alle nicht explizit oder via Typkennzeichen deklarierten Variablen einsetzt. Es ist aber kein Fehler (ja sogar guter Programmierstil), Variablen vom Typ Variant explizit zu deklarieren. In diesem Fall erhlt die Variable Empty als Initialisierungswert. Man kann einer Variant-Variablen auch den Wert Null zuweisen, was blicherweise signalisiert, dass die Variable absichtlich keinen gltigen Wert enthlt. Bei Zuweisung eines typgebundenen Werts speichert die Variable nicht nur den Wert an sich, sondern auch seinen Typ. Man spricht in diesem Zusammenhang vom Untertyp eines

50

Die Datentypen I nteger,

Long,

Single und Double

Variant-Werts. Um die Sonderwerte abzufragen, lassen sich die eigens dafr definierten Boolean-Funktionen IsEmpty, IsError und IsNull verwenden ein expliziter Vergleich mit den Werten Empty, Nothing, Null und Error tut es natrlich auch. Bei der Operation mit typgebundenen Werten kann es passieren, dass der Wertebereich des aktuellen Untertyps einer Variant-Variablen fr die Darstellung eines Wert nicht mehr ausreicht. In diesem Fall nimmt Visual Basic eine implizite Typumwandlung im Sinne einer Wertebereichserweiterung vor. Implizite Typumwandlungen finden auch statt, wenn ein VariantWert mit numerischem Untertyp einer String-Variable oder ein Variant-Wert mit Untertyp String einer Variable mit numerischem Typ zugewiesen werden soll. Im ersten Fall wandelt Visual Basic den Variant-Wert in eine adquate Zeichendarstellung um und im zweiten Fall in eine adquate numerische Darstellung. Der Sonderwert Error in einer Variablen vom Datentyp Variant ist dafr vorgesehen, in Prozeduren erkannte Fehlerbedingungen anzuzeigen, wenn keine On Error-Fehlerbehandlung durch die Anwendung stattfindet. In diesem Fall muss die rufende Prozedur selbst den Fehler auswerten und ntige Manahmen ergreifen. Gesetzt wird der Sonderwert gewhnlich mittels der Funktion CVErr, die eine Fehlernummer entgegennimmt und einen entsprechenden Error-Wert vom Typ Variant liefert. Trgt ein Variant-Wert den Untertyp Object, drckt der Wert Nothing aus, dass auf kein Objekt referiert wird. Um in Erfahrung zu bringen, ob ein Variant-Wert den Untertyp Object trgt, lsst sich die Boolean-Funktion IsObject verwenden. Nach all dem drfte offensichtlich sein, welch enorme Flexibilitt der Datentyp Variant mit sich bringt und wie sehr er die Programmierung vereinfachen kann, indem er die Typenvielfalt auf einen einzigen Datentyp zurckfhrt. Allerdings verhlt es sich bei der Programmierung mit diesem Datentyp anders als im richtigen Leben: Hier sollten die einfachen Dinge eher den Profis vorbehalten bleiben. Ungebten Programmierern mit einem noch nicht vollstndig ausgeprgten Verstndnis fr die elementaren Datentypen spielt das verborgene Wirken von Visual Basic gerne mal den einen oder anderen Streich.

Elementare Datentypen

Die Datentypen Integer, Long, Single und Double


Die Datentypen Integer und Long setzt man blicherweise fr Zhlvariablen, Indizierungen oder Berechnungen im Bereich der Ganzzahlarithmetik ein. Sie unterscheiden sich von einander allein durch ihren Wertebereich. Single und Double eignen sich dagegen speziell fr die Darstellung gebrochen-rationaler Werte (lies: Dezimalzahlen mit Nachkommaanteil). Die zugehrige Gleitkommaarithmetik entspricht der blichen Dezimalrechnung mit Rundung auf eine feste Anzahl von Dezimalstellen. Das bedingt, dass benachbarte Werte in den jeweiligen Wertebereichen keinen festen Abstand zueinander aufweisen (der bei den Datentypen Integer und Long ja 1 ist), sondern ihren Abstand mit wachsendem Betrag vergrern (bzw. gegen 0 hin verkleinern). Double weist gegenber Single die doppelte Genauigkeit sowie einen erheblich greren Wertebereich auf. Visual Basic initialisiert diese Datentypen mit dem Wert 0 bzw. 0,0.
' Vollstndige Deklaration Const cDelta As Double = 2.71364234E-123 Dim iGanzzahl As Integer Dim lGanzzahl As Long Dim sFlKommazahl As Single Dim dFlKommazahl As Double ' Deklaration mit Typkennzeichen Const ci# = 1.2 Dim i% Dim l&

51

Elementare Datentypen

Dim s! Dim d# For n% = 1 to 100

' Deklaration mit Typkennzeichen durch Nennung

Die Datentypen Boolean und Byte


Der mit Visual Basic neu zu Basic hinzugekommene Datentyp Boolean weist einen sehr kleinen Wertebereich auf, nmlich nur die als Konstanten vordefinierten Wahrheitswerte True und False. In Basic entspricht der Wahrheitswert True traditionell dem Wert -1 und False dem Wert 0. Bei Typumwandlungen in den Datentyp Boolean wird jeder Wert ungleich 0 als True interpretiert und nur der Wert 0 als False. Boolean leistet vornehmlich in Kontrollstrukturen fr die Programmsteuerung sowie bei der Berechnung logischer Funktionen auf Grundlage der Booleschen Algebra gute Dienste. Visual Basic initialisiert Variablen vom Typ Boolean mit False.
Dim bLogValue As Boolean bLogValue = True ... If bLogValue Then ... End If

Elementare Datentypen

Gleichfalls ein neues Mitglied im Club ist der Datentyp Byte. Er dient insbesondere dem Umgang mit binren Inhalten, denen keine feste Interpretation zukommt. (Traditionell wurden fr Inhalte dieser Art Zeichenfolgen benutzt.) Dieser Datentyp wird zwar noch als numerischer Datentyp gehandelt, das heit, er wird mit 0 initialisiert, und man kann mit ihm ganz normal rechnen, solange der Wertebereich nicht berschritten wird. Er ist aber als einziger vorzeichenlos.
Dim MyByte(256) As Byte ... For i = 0 to 255 Print #1, MyByte(i); Next i

Die Datentypen Currency und Date


Der eng mit den ganzzahligen Typen Integer und Long verwandte Datentyp Currency wurde speziell zur Erleichterung finanzmathematischer Berechnungen mit in die elementaren Datentypen aufgenommen. Die Werte in seinem Wertebereich sind ein ganzzahliges Vielfaches von 0,0001. Damit stellt der Datentyp noch vier Stellen hinter dem Komma dar und seine Arithmetik entspricht der blichen Dezimalrechnung mit Kaufmannsrundung an der vierten Stelle hinter dem Komma. Visual Basic initialisiert Currency-Variablen mit 0,0000. Interessanter ist der gleichfalls neue Datentyp Date, der nicht zuletzt im Schatten des Jahr-2000Problems eine ebenso zweifelhafte wie steile Karriere hinter sich hat. Visual Basic reprsentiert Werte dieses Typs als 64-Bit-Gleitkommazahlen (8 Bytes) nach IEEE und kann somit Datumsangaben im Bereich zwischen dem 1. Januar 100 und dem 31. Dezember 9999 sowie Uhrzeiten im Bereich von 0:00:00 bis 23:59:59 unterscheiden. Sie knnen mit diesem Datentyp Datumsangaben und Zeitangaben in Kombination, aber auch einzeln als Werte darstellen. Der Notation literaler Datums- und Zeitangaben liegt das amerikanische Format zugrunde, das heit, in Datumsangaben wird der Monat vor dem Tag notiert und die Abtrennung erfolgt durch das Zeichen /, whrend Zeitangaben in 12-Stunden-Darstellung gefolgt von PM oder AM zu treffen sind. Zudem ist die Darstellung durch ein fhrendes und abschlieendes Zeichen # einzuschlieen. (Der Editor erkennt brigens auch andere Darstellungen, so etwa #1 Feb 99#, und korrigiert diese beflissen in das erwnschte Format.)

52

Der Datentyp Decimal

Dim a = b = c =

a As Date, b As Date, c As Date #2/1/1996 1:12:01 PM# #12:01:00 PM# #2/1/1996#

Beim Umwandeln anderer numerischer Datentypen in Werte des Datentyps Date reprsentieren die Vorkommastellen das Datum und die Nachkommastellen die Uhrzeit. Mitternacht entspricht dem Wert 0,0 und 12 Uhr Mittags dem Wert 0,5. Negative ganze Zahlen reprsentieren ein Datum vor dem 30. Dezember 1899, positive ein Datum nach dem 30. Dezember 1899. Den 30. Dezember 1899 selbst kennt Visual Basic dagegen berhaupt nicht, sondern interpretiert ihn als #12:00:00 AM#.

Elementare Datentypen

Der Datentyp Decimal


Der gleichfalls neue Datentyp Decimal ist kein eigenstndiger Datentyp, sondern kann nur als Untertyp eines Variant-Werts auftreten. Um einen Wert dieses Typs zu erzeugen, bedarf es der Typumwandlungsfunktion CDec.
Dim vDez1 vDez1 = CDec(100.00000021) ' aus Double erzeugt

Werte vom Typ Decimal haben eine 29-stellige dezimale Reprsentation mit Komma ohne Exponent im BCD-Code. Den Typen Single und Double liegt dagegen eine binre Reprsentation zugrunde, die nicht mehr als 8 bzw. 15 dezimale Stellen erfasst. Um Decimal-Werte mit mehr als 15 Stellen (mehr erlaubt der Datentyp Double nicht) noch direkt definieren zu knnen, ist der Funktion CDec eine entsprechende Zeichenfolgendarstellung des Werts zu bergeben. Beachten Sie, dass dabei die auf dem jeweiligen System geltenden Lndereinstellungen eine Rolle spielen. So legt die Einstellung Deutsch (Standard) als Dezimalzeichen ein Komma fest.
Dim vDez2 vDez2 = CDec("100,000000000000000021")
Warnung

' aus String erzeugt

................................................... Wa rnung

Visual Basic vereinbart jede Variable standardmig als Variant, wenn sie nicht explizit im Rahmen einer Variablendeklaration oder implizit durch eine DefType-Anweisung bzw. durch eines der traditionellen Typkennzeichen von Basic ($, %, &, !, #) eine feste Typzuweisung erfhrt.
Tipp

................................................... Tipp

Beobachten Sie bei der Fehlersuche in Programmen besonders Werte vom Typ Variant, insbesondere wenn Seltsames und Absurdes mit im Spiel zu sein scheint. Entlaufene Variant-Werte waren schon Ursache so manchen bels. Vereinbaren Sie Variablen besser explizit, um einen bestimmten Datentypen zu erzwingen, das verbessert die bersicht. Wenn Sie das Tippen lnglicher Typdeklarationen scheuen, verwenden Sie doch DefType oder die Typkennzeichen ($, %, &, !, #). Oft entlarvt eine Option Explicit-Anweisung den beltter bereits.
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Dim, Public, Private, Function, DefType


Verwandte Themen

Literale und Konstanten (S. 27); Typumwandlung (S. 57); Typkennzeichen und Bezeichnerbereiche fr Typen (S. 167); Variablendeklaration (S. 162)

53

Operatoren fr elementare Datentypen und logische Bedingungen

Operatoren fr elementare Datentypen und logische Bedingungen


+, , *, /, \, MOD, ^, Not, And, Or, Xor, Eqv, Imp, <, >, =, >=, <=, <>, Is, TypeOf
Beschreibung

................................................... Bes c hreibung

Operatoren fr elementare Datentypen und logische Bedingungen

Operatoren dienen der Bildung von Ausdrcken. Die Menge der Operatoren, die Visual Basic fr die elementaren Datentypen kennt, unterteilt sich in die Gruppe der logischen Operatoren (And, Or, Xor, Eqv, Imp, Not) die in Visual Basic aufgrund der besonderen Wahl der Reprsentation der Wahrheitswerte mit den bitweisen Operatoren bereinstimmen , die Gruppe der arithmetischen Operatoren (+, , *, /. \, Mod, ^), die Gruppe der Vergleichsoperatoren (<, >, =, <=, >=, <>, Is) und die Gruppe der Zeichenfolgenoperatoren (die derzeit nur die Verkettungsoperatoren + und & umfasst). Eine Art Doppelrolle spielt traditionell der Zuweisungsoperator =, der fr alle elementaren Datentypen definiert ist und gegebenenfalls auch fr die implizite Typumwandlung zwischen verwandten Typen sorgt. Er darf nicht mit dem gleich notierten Vergleichsoperator verwechselt werden. Ein Vergleichsoperator der besonderen Art ist der Is-Operator fr den Vergleich zweier Objektvariablen. Er liefert den Wert True, wenn die beiden Operanden auf dasselbe Objekt verweisen, ansonsten False. Er kommt insbesondere hufig im Zusammenhang mit dem TypeOf-Schlsselwort zur Anwendung, wenn abgefragt werden soll, ob eine Objektvariable auf einen bestimmten Objekttyp verweist.
If TypeOf MeineVar Is Form1
Anwendung

................................................... Anwendung
Operator + & + * / \ Mod ^ And Or Not Notation a + b a & b a + b a b -a a * b a / b a \ b a Mod b a ^ b a And b a Or b Not a Operation Verkettung Summenbildung Differenzbildung Vorzeichenumkehr Multiplikation Division Division mit ganzzahligem Ergebnis Restwertdivision (Modulo-Operation) Potenz Logisches und bitweises UND Logische und bitweise Negation Operanden Zeichenfolgen Numerische Werte Numerische Werte Numerische Werte Numerische Werte Numerische Werte Numerische Werte Numerische Werte Numerische Werte Numerische Werte, logische Werte Numerische Werte, logische Werte

Logisches und bitweises ODER Numerische Werte, logische Werte

Operationen der elementaren Datentypen

54

)HH=OI

Operator Xor Eqv Imp = <

Notation a Xor b a Eqv b a Imp b a = b a < b

Operation

Operanden

Logisches und bitweises Exklu- Numerische Werte, logische Werte siv-ODER Logische und bitweise quiva- Numerische Werte, logische Werte lenz Logische und bitweise Implika- Numerische Werte, logische Werte tion Logische Bedingung: Gleichheit (vgl. auch Eqv) Logische Bedingung: kleiner als (bei Zeichenfolgen von Option Compare abhngig) Logische Bedingung: grer als (bei Zeichenfolgen von Option Compare abhngig) Numerische Werte, logische Werte, Zeichenfolgen, Datums-/Zeitwerte Numerische Werte, logische Werte, Zeichenfolgen, Datums-/Zeitwerte Numerische Werte, logische Werte, Zeichenfolgen, Datums-/Zeitwerte

Arrays

>

a > b

<=

a <= b

Logische Bedingung: kleiner Numerische Werte, logische Werte, gleich (bei Zeichenfolgen: von Zeichenfolgen, Datums-/Zeitwerte Option Compare abhngig) Logische Bedingung: grer Numerische Werte, logische Werte, gleich (bei Zeichenfolgen: von Zeichenfolgen, Datums-/Zeitwerte Option Compare abhngig) Logische Bedingung: ungleich Testet, ob Operanden auf gleiches Objekt verweisen bzw. gleichen Objekttyp tragen Numerische Werte, logische Werte, Zeichenfolgen, Datums-/Zeitwerte Objektvariablen

>=

a >= b

<> Is TypeOf

a <> b a Is b TypeOf a Is b

Operationen der elementaren Datentypen

Arrays
Dim StatArray({iDimension1 | Untergrenze1 To Obergrenze1}[, _ {Dimension2 | Untergrenze2 To Obergrenze2}[, _ ... {DimensionN | Untergrenze2 To Obergrenze2}]]) _ [As Typ] Dim DynArray() [As Typ] ReDim [Preserve] DynArray [As Typ] Function Array([Wert1[, Wert2[, ... WertN]]]) As Variant Function UBound(Array[, iDimension As Integer = 1]) As Long Function LBound(Array[, iDimension As Integer = 1]) As Long Function IsArray(Var) As Boolean Option Base {0 | 1}

##

)HH=OI

Beschreibung

................................................... Bes c hreibung

Ein Array stellt eine ein- oder mehrdimensionale Struktur dar, die eine Menge von Werten gleichen Typs unter einem gemeinsamen Variablenbezeichner zusammenfasst. Visual Basic unterscheidet zwischen statischen und dynamischen Arrays. Die (endgltige) Deklaration statischer Arrays erfolgt im Rahmen einer Dim-Anweisung. Fr die Deklaration sind neben dem Array-Bezeichner StatArray auch ein oder mehrere Indexbereiche anzugeben je nachdem, wie viele Dimensionen das Array besitzt sowie optional ein Elementtyp Typ. Wird ein Indexbereich durch Nennung einer Obergrenze iDimensionN angegeben, beginnt die Zhlung der Array-Elemente standardmig bei 0 (Option Base 0 ist die Voreinstellung von Visual Basic), es sei denn, das betreffende Modul enthlt die Anweisung Option Base 1. Es lassen sich aber auch Indexbereiche mit beliebigen Grenzen durch explizite Nennung unterer und oberer Grenzen (UntergrenzeN To ObergrenzeN) vereinbaren. Die formale Deklaration eines dynamischen Arrays kann durch Vereinbarung einer Array-Variablen im Rahmen einer Dim-Anweisung geschehen, muss aber nicht. Dabei notiert man den Bezeichner DynArray gefolgt von einem leeren Klammerpaar und vereinbart optional einen Elementdatentyp. Die konkrete Definition kann dann an passender Stelle vermittels der ReDimAnweisung unter Angabe von Dimensionen und Array-Grenzen geschehen auch mehrmals mit unterschiedlichen Grenzen und Dimensionen, aber gleichem Datentyp. ReDim eignet sich auch zur Vergrerung eines bereits definierten dynamischen Arrays unter Beibehaltung der Dimensionen und Elementwerte. In diesem Fall muss das Schlsselwort Preserve angegeben werden. Der Zugriff auf den Wert eines Array-Elements erfolgt durch Angabe des Array-Bezeichners gefolgt von einem Index oder einer Indexliste (bei mehrdimensionalen) Arrays in Klammern).
Anwendung

Arrays

................................................... Anwendung

Arrays eignen sich hervorragend zur Verwaltung groer Mengen von gleichartigen, aber auch ungleichartigen (wenn als Datentyp Variant vereinbart wird) Daten, auf die ein effizienter indexsequenzieller Zugriff erfolgen soll. Seien es Matrixelemente bei der numerischen Vektorrechnung, Messwerte, Adressenstmme, Datenstze oder auch Ansammlungen gleichartiger Steuerelemente, die Array-Struktur bietet sich hervorragend fr die einfache und schnelle Handhabung von variablen Werten an. Als Elementtyp fr Arrays sind alle elementaren und komplexen Datentypen erlaubt, insbesondere auch benutzerdefinierte Datentypen, Objekte und der Typ Variant. Da ein Wert vom Typ Variant seinerseits ein Array sein kann, sind also auch implizit verschachtelte Arrays mit individueller Tiefe je Element mglich. Eine Array-Variable lsst sich wie eine gewhnliche Variable verwenden sie erhlt ihren Wert durch Zuweisung oder durch (partielle) Initialisierung im Zuge einer ReDim-Anweisung. Im Gegensatz zu anderen Programmiersprachen (vgl. C/C++) beschrnkt sich Visual Basic bei der Zuweisung eines Arrays an eine Array-Variable nicht auf eine reine Adresszuweisung, sondern erstellt eine physikalische Kopie des gesamten Arrays, wie folgender Code beweist:
Dim a(0), b() a(0) = 10 b = a a(0) = 11 Print b(0), a(0)

' Ausgabe: 10

11

Diese Aussage ist allerdings mit Vorsicht zu genieen, sie gilt nmlich nur, wenn die Elemente einfache Datentypen tragen. Von Objekten fertigt Visual Basic keine Kopien an. Das liegt daran, dass der Wert einer Objektvariablen einen Verweis auf das tatschliche Objekt darstellt und die einfache Zuweisungsoperation (im Gegensatz zur Set-Anweisung) sich auf eine Kopie des Verweises beschrnkt, wie folgender Code zeigt:

#$

Typumwandlung

Dim a(0) As Object, b() As Object Set a(0) = Me ' Formular wird zugewiesen b = a b(0).Caption = "Dieser " a(0).Caption = "oder jener?" Print b(0).Caption ' Ausgabe: "oder jener?"

Array- Funktionen
Visual Basic untersttzt Array-Konstanten ebenso wenig wie literale Arrays. Whrend bei statischen Arrays die Wertzuweisung elementweise erfolgen muss, kann im Falle von dynamischen Arrays eine Zuweisung auch auf Array-Ebene erfolgen. Das macht ein kompakte Initialisierung mittels der Array-Funktion mglich, die ihre als Aufrufparameter bergebene Werteliste als Array zurckliefert. Um die obere bzw. untere Indexgrenze eines Arrays in Erfahrung zu bringen, gibt es die Funktionen UBound bzw. LBound. Falls das Array mehr als eine Dimension besitzt, lsst sich die Dimension als Wert iDimension spezifizieren (die Zhlung beginnt bei 1). Variablen des Typs Variant knnen bekanntlich Werte verschiedenster Datentypen annehmen, darunter auch Arrays. Die Funktion IsArray liefert eine Aussage in Form eines Wahrheitswerts darber, ob es sich bei einer Variablen um eine Array-Variable handelt oder nicht. Leider kennt Visual Basic keine Funktion, die den kompletten Speicherbedarf fr das Speichern eines Arrays ermittelt. Dieser Wert muss vielmehr aus dem Elementdatentyp, der Dimensionenzahl, der Dimensionsgrenzen und gegebenenfalls mitzuspeichernder Deskriptoren zu Fu errechnet werden (vgl. Get-Anweisung, S. 140), da Arrays in den unterschiedlichen Dateimodi unterschiedlich reprsentiert werden.
Beispiel

Typumwandlung

................................................... Beis piel

Dim StatArray(-10 To 10, -10 To 10) As Integer ' statisch, zweidim. Dim DynArray() As String ' dynam. deklarieren ... Redim DynArray(10) As String ' dynam. definieren ... Redim Preserve DynArray(UBound(DynArray) + 1) As String 'erweitern
Verwandte Themen

................................................... Verwandte Them en

Auflistungen und Collection-Objekte (S. 304); Get-Anweisung (S. 140); Elementare Datentypen (S. 49)

Typumwandlung
Function CBool(Ausdruck) As Boolean Function CByte(Ausdruck) As Byte Function CCur(Ausdruck) As Currency Function CDate(Ausdruck) As Date Function CDbl(Ausdruck) As Double Function CDec(Ausdruck) As Decimal Function CInt(Ausdruck) As Integer

57

Typumwandlung

Function CLng(Ausdruck) As Long Function CSng(Ausdruck) As Single Function CVar(Ausdruck) As Variant Function CVDate(Ausdruck) As Variant Function CStr(Ausdruck) As String Function IsDate(Ausdruck) As Variant Function IsNumeric (Ausdruck) As Boolean

Typumwandlung

Beschreibung

................................................... Bes c hreibung

Die explizite Typumwandlung wird bei Visual Basic zwar nicht so gro geschrieben wie bei manch anderer Programmiersprache, da der Visual Basic Compiler von sich aus implizite Typanpassungen nach Bedarf vornimmt, vermeidbar ist sie aber nicht in allen Fllen. Die folgende Tabelle gibt einen berblick ber die auf die einzelnen Datentypen zugeschnittenen Konvertierungs- und Typumwandlungsfunktionen. Funktion CBool Beschreibung Konvertiert Ausdruck nach Mglichkeit (bei Zeichenfolgen ohne Unterscheidung der Groschreibung) in einen Wert vom Typ Boolean; Interpretiert die Zeichenfolgen "Wahr", "True" sowie numerische Werte ungleich 0 als True und die Zeichenfolgen "Falsch", "False" sowie den Wert 0 als False. Bei anderen Zeichenfolgen liefert die Funktion einen Laufzeitfehler. Liefert Ausdruck als Wert vom Typ Byte. Fliekommawerte mit einem Nachkommaanteil von exakt 0,5 werden zur nchsten geraden Zahl hin gerundet (0,5 wird zu 0 und 1,5 zu 2), ansonsten gilt die Kaufmannsrundung. Liegt der Wert von Ausdruck nicht im Bereich zwischen 0 und 255 oder ist Ausdruck von Typ String, lst die Funktion einen Laufzeitfehler aus. Liefert Ausdruck als Wert vom Typ Currency. Rundet numerische Werte auf vier Stellen hinter dem Komma und interpretiert Zeichenfolgen im gebietsspezifischen Whrungsformat. Fr das Gebietsschema Deutsch (Standard) gilt: Komma ist Dezimalzeichen, Punkt ist Tausendertrennzeichen, DM als fhrendes oder nachgestelltes Whrungssymbol ist erlaubt, sonstige nicht zur Notation von Zahlenliteralen gehrende Zeichen fhren zu einem Laufzeitfehler. Der zulssige Wertebereich fr Ausdruck geht von -922.337.203.685.477,5808 bis 922.337.203.685.477,5807. Liefert Ausdruck als Wert vom Typ Date. Interpretiert numerische Werte und Zeichenfolgen als Zeit-/Datumswert. Bei numerischen Werten ist ein Vorkommaanteil zwischen -657.434 und 2.958.465 zulssig er wird als Tage-Offset bezogen auf das Datum 1.1.1899 interpretiert und ein Nachkommaanteil von nicht mehr als sechs Stellen er wird als Sekunden-Offset bezogen auf das Datum interpretiert. Bei der Interpretation von Zeichenfolgen erkennt die Funktion das kurze, mittlere oder lange gebietsspezifische Datumsformat (das lange Datumsformat jedoch nur, wenn kein Wochentag notiert ist). Die Funktion IsDate erlaubt eine Vorabprfung, ob ein gegebener Wert in einen Zeit-/Datumswert wandelbar ist.

CByte

CCur

CDate

Konvertierungs- und Typumwandlungsfunktionen

58

Typumwandlung

Funktion CDbl

Beschreibung Liefert Ausdruck als Wert vom Typ Double. Bei der Konvertierung aus Decimal und Currency werden nicht darstellbare Stellen gegebenenfalls gerundet, alle anderen numerischen Datentypen lassen sich ohne Genauigkeitsverlust berfhren. Bei der Konvertierung von Zeichenfolgen erwartet die Funktion das gebietsspezifische Zahlenformat. Fr das Gebietsschema Deutsch (Standard) gilt: Komma ist Dezimalzeichen, Punkt ist Tausendertrennzeichen. Der Wertebereich geht von -1,79769313486232E308 bis -4,94065645841247E-324 fr negative Werte und von 4,94065645841247E-324 bis 1,79769313486232E308 fr positive Werte. Liefert Ausdruck als Wert vom Typ Decimal, der jedoch (ohne erneute Typumwandlung) nur Variablen des Typs Variant zugewiesen werden kann. Bei der Konvertierung von Zeichenfolgen erwartet die Funktion das gebietsspezifische Zahlenformat. Fr das Gebietsschema Deutsch (Standard) gilt: Komma ist Dezimalzeichen, Punkt ist Tausendertrennzeichen. Der Wert selbst darf im Bereich 79.228.162.514.264.337.593.543.950.335 liegen, wobei das Komma flieen darf. Liefert Ausdruck als Ganzzahlwert vom Typ Integer. Fliekommawerte mit einem Nachkommaanteil von exakt 0,5 werden zur nchsten geraden Zahl hin gerundet (0,5 wird zu 0 und 1,5 zu 2) ansonsten gilt die Kaufmannsrundung. Der Wertebereich geht von -32.768 bis 32.767. Liefert Ausdruck als Ganzzahlwert vom Typ Long. Fliekommawerte mit einem Nachkommaanteil von exakt 0,5 werden zur nchsten geraden Zahl hin gerundet (0,5 wird zu 0 und 1,5 zu 2), ansonsten gilt die Kaufmannsrundung. Der Wertebereich geht von -2.147.483.648 bis 2.147.483.647. Liefert Ausdruck als Wert vom Typ Single. Bei der Konvertierung aus Double, Decimal und Currency werden nicht darstellbare Stellen gegebenenfalls gerundet, alle anderen numerischen Datentypen lassen sich ohne Genauigkeitsverlust berfhren. Bei der Konvertierung von Zeichenfolgen erwartet die Funktion das gebietsspezifische Zahlenformat. Fr das Gebietsschema Deutsch (Standard) gilt: Komma ist Dezimalzeichen, Punkt ist Tausendertrennzeichen. Der Wertebereich geht von -1,79769313486232E308 bis -4,94065645841247E-324 fr negative Werte und von 4,94065645841247E-324 bis 1,79769313486232E308 fr positive Werte. Konvertiert numerische Werte in den Untertyp Double (vgl. CDbl) und alle anderen in den Untertyp String Konvertiert einen numerischen Wert oder eine Zeichenfolge Ausdruck in das von lteren Visual-Basic-Versionen benutzte Datumsformat Variant mit Untertyp Date. Da Date inzwischen als elementarer Datentyp verfgbar ist, dient diese Funktion nur noch dem Erhalt der Kompatibilitt mit lteren Programmen. Dieselbe Funktionalitt ergibt sich auch implizit, wenn der Funktionswert eines CDate-Aufrufs einer Variablen vom Typ Variant zugewiesen wird. Umgekehrt lsst sich aufgrund der impliziten Typanpassung des Compilers auch der Funktionswert eines CVDate-Aufrufs einer Variablen vom Typ Date zuweisen, so dass zwischen CDate und CVDate praktisch gesehen kein Unterschied besteht.

Typumwandlung

CDec

CInt

CLng

CSng

CVar CVDate

Konvertierungs- und Typumwandlungsfunktionen

59

Benutzerdefinierte Datentypen

Funktion CStr

Beschreibung Liefert literale Darstellung von Ausdruck als Zeichenfolge im gebietsspezifischen Format. Wahrheitswerte erscheinen als "Wahr" und "Falsch", numerische Werte ohne Tausendertrennzeichen jedoch mit Komma als Dezimalzeichen und erforderlichenfalls in Fliekommanotation mit Exponentenanteil. Der Wert Empty entspricht der leeren Zeichenfolge, whrend Null einen Laufzeitfehler auslst. Datumswerte erhalten das fr das Gebietsschema geltende kurze Datumsformat. Die literale Darstellung eines Objekts ist die seiner Standardeigenschaft so liefert CStr(Err) die zuletzt gesetzte Fehlernummer Err.Number.

Benutzerdefinierte Datentypen

Konvertierungs- und Typumwandlungsfunktionen


Anwendung

................................................... Anwendung

Wer viel mit dem flexiblen Datentyp Variant arbeitet oder von einer streng typisierenden Programmiersprache her kommt, wird in so manchem Fall die Typumwandlungsfunktionen von Visual Basic zu schtzen wissen. Obwohl der Visual-Basic-Compiler weitgehend tolerant ist, was die implizite Typanpassung bei der Zuweisung, der Parameterbergabe und der Ausdrucksberechnung betrifft, lsst sich die Flexibilitt im Miteinander von Datentypen durch explizite Typumwandlungen noch weiter verbessern, insbesondere wenn die lnderspezifische Darstellung entlang des in der Systemsteuerung eingestellten Gebietsschemas bei der Umwandlung aus Zeichenfolgen ins Spiel kommt. So ist beispielsweise die explizite Typumwandlung in Visual Basic 6.0 der einzige Weg, um Werte des nur als Untertyp von Variant existierenden Datentyps Decimal zu generieren, denn eine Deklaration mit diesem vergleichsweise neuen Datentyp ist in der Version 6.0 noch nicht mglich. Auch greift der Compiler nur dann zum Mittel der impliziten Typumwandlung, wenn eine Verengung oder Erweiterung des gegebenen Typs unvermeidbar ist.
Tipps

................................................... Tipps
Um festzustellen, ob ein Wert als Zahl ausgewertet werden kann, steht die Boolean-Funktion IsNumeric zur Verfgung. Die Typumwandlung von einem benutzerdefinierten Typ in einen elementaren Typ ist nicht so ohne Weiteres mglich. Einen Schleichweg erffnet jedoch die LSet-Anweisung (vgl. S. 80).
Verwandte Befehle

................................................... Verwa ndte Befehle

Asc, Chr, ChrB, Date, DateSerial, Fix, Format, FormatCurrency, FormatDateTime, FormatNumber, FormatPercent, Int, Round, Str, StrConv Time, TimeSerial, Val
Verwandte Themen

................................................... Verwandte Them en

Elementare Datentypen (S. 49)

Benutzerdefinierte Datentypen
Visual Basic kennt drei verschiedene Arten von benutzerdefinierten Datentypen: in TypeKonstrukten vereinbarte Datenstrukturen; in Enum-Konstrukten vereinbarte Aufzhlungsdatentypen; in Klassenmodulen definierte Klassen (Objektdatentypen). Letztere werden ausfhrlicher im objektorientierten Teil vorgestellt, wenn es um Selbst definierte Klassen (S. 318) geht. Ein Vergleich zwischen Type-Datentypen und Objektdatentypen findet sich in der Tabelle auf Seite 197.

60

Type- Datentypen

Type- Datentypen
{Private | [Public]} Type BDT ElementName [([Indizes])] As Typ [ElementName1 [([Indizes])] As Typ] ... End Type With bdtVar .ElementName = Wert End With

Benutzerdefinierte Datentypen

Beschreibung

................................................... Bes c hreibung

Die Type-Struktur ermglicht die Definition eines eigenen Datentyps BDT, der aus Elementen ElementName bereits bekannter Datentypen zusammengesetzt ist. Die Private-Vereinbarung des Datentyps ist fr beliebige Modularten auf Modulebene mglich und beschrnkt den Geltungsbereich der Definition auf das jeweilige Modul. Fehlt der Spezifizierer Private, behandelt der Compiler die Definition als Public-Vereinbarung, die jedoch nur in einem Standardmodul zulssig ist. Ein Public-Datentyp ist in allen Modulen des gegebenen Projekts sowie in allen Projekten einer gegebenenfalls existierenden Projektgruppierung bekannt.
Anwendung

................................................... Anwendung

Im Gegensatz zu lteren Basic-Versionen sind in Visual Basic statische und dynamische Arrays als Feldelemente fr benutzerdefinierte Datentypen ebenso zulssig wie Objektvariablen. Auch einer Verschachtelung benutzerdefinierter Datentypen durch Verwendung bereits definierter Datentypen als Feldtyp steht nichts im Wege. Die Vereinbarung eines benutzerdefinierten Datentyps BDT fr eine Variable weist formal keine Besonderheiten gegenber der Vereinbarung eines elementaren Datentyps auf. Der einzige Unterschied zu den vordefinierten Datentypen von Visual Basic besteht darin, dass die PublicVereinbarung von Variablen benutzerdefinierter Typen nur in einem Standardmodul erfolgen darf, whrend in allen anderen Modularten eine Private-Deklaration erforderlich ist. An Operationen fr benutzerdefinierte Datentypen gibt es nur den Punktoperator und den Zuweisungsoperator. Der Punktoperator ermglicht den Zugriff auf die einzelnen Felder des benutzerdefinierten Datentyps fr die Arbeit mit einzelnen Feldwerten nach dem Schema Var.Feld. Der Zuweisungsoperator ermglicht die Zuweisung eines Werts mit einem benutzerdefinierten Datentyp an eine Variable gleichen Typs. Dabei kopiert Visual Basic alle Feldwerte en bloc, selbst wenn Arrays mit im Spiel sind. Zur Vereinfachung der Notation beim Zugriff auf Elementwerte eines benutzerdefinierten Datentyps (aber auch auf Eigenschaften und Methoden von Objekten, mit Ausnahme von Print, Circle und Line) kann die With-Struktur benutzt werden. Dabei fhrt die With-Anweisung den genannten Bezeichner als Qualifizierungskontext ein. Innerhalb eines Moduls benutzt Visual Basic von sich den Modulbezeichner als Qualifizierungskontext. Mit jeder With-Anweisung (Verschachtelung ist erlaubt) verengt sich der bestehende Qualifizierungskontext.
Warnung

................................................... Wa rnung

Vom Prinzip her besteht zwar die Mglichkeit, LSet-Zuweisungen zwischen benutzerdefinierten Datentypen mit unterschiedlichen Strukturen vorzunehmen, von einem Gebrauch dieses Hintertrchens ist aber generell eher abzuraten, da dabei unvorhergesehene Effekte auftreten knnen (vgl. LSet-Anweisung, S. 80).

61

Benutzerdefinierte Datentypen

Tipp

................................................... Tipp

Anstelle benutzerdefinierter Datentypen knnen Sie eigene Datentypen auch ber Klassenmodule implementieren. Der dahinter stehende objektorientierte Ansatz verschmilzt das Konzept des benutzerdefinierten Datentyps mit den zu dem Datentyp gehrigen Manipulationsoperationen und bietet somit den Vorteil der Datenabstraktion.
Beispiel

................................................... Beis piel

Benutzerdefinierte Datentypen

' Bereich (Allgemein) eines Moduls Private Type BDT lFeld As Long sFeld As String lDynArray() As Long sStatArray(10) As String End Type ... Dim bdtVar1 As BDT, bdtVar1 As BDT ... bdtVar1.lFeld = 10 ' numerischen Wert zuweisen bdtVar1.sFeld = "Wert des String-Feldes" ' Zeichenfolge zuweisen ReDim bdtVar1.lDynArray(10) As Long ' dyn. Array dimensionieren bdtVar2 = bdtVar1 ' Struktur en bloc zuweisen ' Schreibweise bei Qualifizierung mit With With bdtVar1 .lFeld = 10 ' numerischen Wert zuweisen .sFeld = "Wert des String-Feldes" ' Zeichenfolge zuweisen ReDim .lDynArray(10) As Long ' dyn. Array dimensionieren End With bdtVar2 = bdtVar1 ' Struktur en bloc zuweisen
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

LSet
Verwandte Themen

Elementare Datentypen (S. 49); Routinen aus DLLs und der Windows-API einsetzen (S. 185); Objekte und Klassen (S. 195); Klassen als Datentypen fr Objektvariablen (S. 196)

Enum- Aufzhlungen
{Private | [Public]} Enum MeineAufzhlung Element1 = LiteralerWert1 [Element2 = LiteralerWert2] ... End Enum
Beschreibung

................................................... Bes c hreibung

Eine Enum-Aufzhlung ist eine Sammlung von Konstanten des Typs Long, die formal in einem Aufzhlungsdatentyp zusammengefasst sind. Die einzelnen Konstanten sind jedoch auch jede fr sich im Rahmen des jeweiligen Geltungsbereichs bekannt. Ein Aufzhlungsdatentyp lsst

62

Funktionen und Anw eisungen fr Zeichenfolgen

sich wie jeder andere Datentyp fr die Vereinbarung von Variablen, Parametern und Funktionswerten heranziehen, eine berprfung auf Einhaltung des ber die Aufzhlung definierten Wertebereichs findet jedoch nicht statt; auch unterscheidet der Compiler nicht zwischen unterschiedlichen Aufzhlungsdatentypen, vielmehr behandelt er jeden Aufzhlungsdatentyp als Long.
Anwendung

................................................... Anwendung

Obwohl es mglich ist, Variablen zu vereinbaren, die einen Aufzhlungsdatentyp tragen, und der Editor der Entwicklungsumgebung bei der Notation von Rechtswerten dieses Typs eine Liste mit den vereinbarten Konstanten einblendet, sind Aufzhlungsdatentypen faktisch nichts weiter als eine Umbenennung des Datentyps Long und somit reine Fassade. Sie verwenden Aufzhlungsdatentypen, um Konstanten zu gruppieren und Symbolvorrte formal als endliche Wertebereiche ausdrcken zu knnen. Ein Blick in den Objektkatalog (Taste (F2)) zeigt, dass Visual Basic in seinen Bibliotheken massiv von diesem Konzept Gebrauch macht.
Beispiel

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Beis piel

Public Enum VbTest vbA1 = &H11111111 vbA2 = 101 vbA3 = 105 vbA4 = 103 vbA5 = 104 End Enum ... ' innerhalb einer Prozedur/Funktion Dim a As VbTest a = vbA3 Print TypeName(a) ' Ausgabe: "Long"

Funktionen und Anweisungen fr Zeichenfolgen


Der unkomplizierte Umgang mit Zeichenfolgen war schon immer die ureigenste Domne der Programmiersprache Basic. Darber hinaus hat sich die Ausstattung fr die Manipulation von Zeichenfolgen mit jeder Neuauflage von Basic noch einmal verbessert, so dass dem Programmierer unter Visual Basic 6.0 ein ausgesprochen reichhaltiges Angebot an vordefinierten Funktionen und Anweisungen fr die Arbeit mit Zeichenfolgen zur Verfgung steht. Whrend in frheren Versionen von Visual Basic so manche Zeichenfolgenfunktion in zwei Varianten implementiert war eine mit $-Suffix und eine ohne , von denen diejenige mit $-Suffix echte Zeichenfolgen lieferte und diejenige ohne $-Suffix Werte des Typs Variant, untersttzt Visual Basic 6.0 die Varianten mit $-Suffix zwar noch zur Wahrung der Kompatibilitt, kommt aber grundstzlich ohne sie aus.
Beschreibung

................................................... Bes c hreibung

Seit Einfhrung der 32-Bit-Version mit Visual Basic 4.0 legt Visual Basic intern allen Zeichenfolgen die Unicode-Darstellung zugrunde. Im Gegensatz zu dem bis dahin verwendeten ANSICode, der zur Reprsentation eines Zeichens gerade mal ein Byte vorsieht (und somit nicht mehr als 256 Zeichen unterscheiden kann), umfasst die Reprsentation eines Zeichens im Unicode zwei Bytes. In Unicode gibt es daher bis zu 65.535 unterschiedliche Zeichen, die von der

63

Funktionen und Anweisungen fr Zeichenfolgen

Funktionen und Anweisungen fr Zeichenfolgen

ISO international festgelegt wurden. Zeichen mit Unicode kleiner als 256 entsprechen den Zeichen des ANSI-Codes, so dass beispielsweise das Zeichen A mit dem ANSI-Code 65 (oder &H40) in Unicode die Darstellung 0, 65 (oder &H0040) hat. Neben Unicode gibt es noch einen weiteren Zeichencode namens DBCS (Double-Byte Character Set), dessen Darstellung zwei Bytes je Zeichen vorsieht. Dieser Code ist in erster Linie im asiatischen Sprachraum verbreitet und dazu gedacht, die Vielfalt der in diesen Sprachen verwendeten Schriftzeichen ausdrcken zu knnen. Er hat weder etwas mit ANSI-Code noch mit Unicode gemeinsam, stellt also einen vllig eigenstndigen Zeichensatz dar. All dies heit fr den Visual-Basic-Programmierer, dass er es potenziell mit allen drei, sicherlich jedoch mit zwei unterschiedlichen Reprsentationsarten fr Zeichenfolgen zu tun bekommen kann so etwa beim Lesen von Datenstzen aus Dateien mit lteren und neueren Datenformaten. Damit aber nicht genug: Es gilt auch systembedingte Unterschiede zu beachten, die sich aufgrund unterschiedlicher Versionen fr Objektbibliotheken und Windows selbst einschleichen. Die folgende Tabelle zeigt eine Aufstellung, welche Umgebung mit welcher Zeichendarstellung einhergeht. Umgebung Windows-9x-API 16-Bit-Objektbibliotheken Visual Basic 32-Bit-Objektbibliotheken Windows-NT-API Automatisierung in Windows NT Automatisierung in Windows 9x Verwendete Zeichenstze ANSI und DBCS ANSI und DBCS Unicode Unicode Unicode Unicode Unicode

Zeichendarstellung in verschiedenen W indows- Komponenten

Um den Programmierer gegen alle Flle zu wappnen, unterhlt Visual Basic daher fr die traditionellen Zeichenfolgenfunktionen Asc, Chr, Len, InStr, Left, Right und Mid unterschiedliche Varianten, deren Funktionsweise spezifisch auf die eine oder andere Reprsentation ausgerichtet ist. Varianten mit Suffix B (so etwa AscB) gehen von einer ANSI-Darstellung und Varianten mit Suffix W (so etwa ChrW) von einer Unicode- oder DBCS-Darstellung aus. Die folgende Tabelle gibt eine bersicht ber die unter Visual Basic 6.0 verfgbaren Funktionen und Prozeduren, die im engeren oder weiteren Sinne etwas mit der Manipulation von Zeichenfolgen zu tun haben. Bezeichner Asc AscB AscW Chr ChrB ChrW Kurzbeschreibung Liefert den ANSI-Code des ersten Zeichens einer Zeichenfolge (auf DBCSSystemen DBCS-Code) Liefert den ANSI-Code des ersten Bytes einer Zeichenfolge Liefert den Unicode des ersten Doppel-Bytes einer Zeichenfolge Liefert das zu einem ANSI-Code gehrige Unicode-Zeichen Liefert das zu einem ANSI-Code gehrige ANSI-Zeichen Liefert das zu einem Unicode gehrige Unicode-Zeichen

Zeichenfolgenfunktionen und - prozeduren von Visual Basic

64

Funktionen und Anweisungen fr Zeichenfolgen

Bezeichner Filter

Kurzbeschreibung Durchsucht alle Elemente eines Zeichenfolgen-Arrays nach einer bestimmten Zeichenfolge und liefert die Array-Elemente, in denen diese enthalten ist Liefert Zeichenfolgendarstellung eines Werts im spezifizierten Format Liefert die Darstellung eines Whrungswerts im spezifizierten Format Liefert die Darstellung eines Datumswerts im spezifizierten Format Liefert die Darstellung eines Zahlenwerts im spezifizierten Format Liefert die Darstellung eines Prozentwerts im spezifizierten Format Liefert die hexadezimale Notation eines Werts Liefert die Startposition einer Zeichenfolge in einer anderen Zeichenfolge Liefert die Startposition einer ANSI-Zeichenfolge in einer anderen ANSIZeichenfolge Wie InStr, beginnt die Suche aber von hinten Umkehrfunktion zu Split, setzt die Zeichenfolgen eines String-Arrays zu einer einzigen Zeichenfolge zusammen (Trennzeichen optional) Liefert die Kopie einer Zeichenfolge in Kleinschreibung Liefert den linken Teil einer Zeichenfolge Liefert den linken Teil einer ANSI-Zeichenfolge Liefert die Anzahl der Zeichen in Zeichenfolge trgt der im Parameter bergebene Wert nicht den Typ String, liefert die Funktion die Anzahl der zum Speichern dieses Werts erforderlichen Bytes. Liefert die Anzahl der Bytes, die fr die Darstellung des Werts (zum Beispiel bei Speichern) erforderlich sind; liefert damit auch die Lnge einer ANSI-Zeichenfolge Byteorientierte, linksbndige Zuweisungsoperation fr beliebige Datentypen, ohne Lngenanpassung des Linkswerts. Elementare Datentypen unterliegen einer Typberprfung, benutzerdefinierte nicht. Liefert eine Kopie der Zeichenfolge ohne fhrende Leerzeichen zurck Liefert den mittleren Teil einer Zeichenfolge Zuweisungsoperation fr den mittleren Teil einer Zeichenfolge Liefert den mittleren Teil einer Zeichenfolge als ANSI-Zeichenfolge Zuweisungsoperation fr mittleren Teil einer ANSI-Zeichenfolge Liefert fr eine Zahl zwischen 1 und 12 den Monatsname als Zeichenfolge Liefert die oktale Notation eines Werts Standardvorgabe fr Zeichenfolgenvergleiche auf binren Vergleich oder Textvergleich (ohne Beachtung der Groschreibung) setzen

Format FormatCurreny FormatDateTime FormatNumber FormatPercent Hex InStr InStrB InStrRev Join LCase Left LeftB Len

Funktionen und Anweisungen fr Zeichenfolgen

LenB

LSet

LTrim Mid Mid MidB MidB MonthName Oct Option Compare

Zeichenfolgenfunktionen und - prozeduren von Visual Basic

65

Funktionen und Anweisungen fr Zeichenfolgen

Bezeichner Partition

Kurzbeschreibung Liefert das Intervall, in das eine Zahl fllt, als Zahlenbereich der Form IntervallAnf: IntervallEnde. Der Aufruf der Funktion erfolgt unter Angabe eines Startwerts fr das erste Intervall, eines Endwerts fr das letzte Intervall und einer Intervallbreite. Sucht Vorkommen einer Suchzeichenfolge in Zeichenfolge, ersetzt dieses gegen Ersatzzeichenfolge und liefert resultierende Zeichenfolge Liefert den rechten Teil einer Zeichenfolge Liefert den rechten Teil einer ANSI-Zeichenfolge Rechtsbndige Zuweisungsoperation fr Zeichenfolgen ohne Lngennderung des Linkswerts; fllt mit Leerzeichen auf oder schneidet ab Liefert die Kopie einer Zeichenfolge ohne abschlieende Leerzeichen Liefert eine Zeichenfolge mit der gewnschten Anzahl von Leerzeichen Umkehrfunktion zu Join, durchsucht eine Zeichenfolge nach Trennzeichen und liefert die Zeichenfolgenabschnitte als Array Liefert standardmige Reprsentation eines Zahlenwerts als Zeichenfolge Fhrt alphanumerischen Zeichenfolgenvergleich durch und unterscheidet dabei vier Flle Konvertiert eine Zeichenfolge nach einem von sieben mglichen Konvertierungsschemata und liefert die konvertierte Version als Kopie Liefert Zeichenfolge mit der gewnschten Anzahl eines einzelnen Zeichencodes Liefert die Kopie einer Zeichenfolge mit verkehrter Reihenfolge der Zeichen Liefert Zeichenfolge ohne fhrende und abschlieende Leerzeichen Liefert die Kopie einer Zeichenfolge in Groschreibung Liefert den Zahlenwert einer Zeichenfolge Liefert fr eine Zahl zwischen 1 und 7 den Wochentag als Zeichenfolge

Replace Right

Funktionen und Anweisungen fr Zeichenfolgen

RightB RSet RTrim Space Split Str StrComp StrConv String StrReverse Trim UCase Val WeekdayName

Zeichenfolgenfunktionen und - prozeduren von Visual Basic


Warnung

................................................... Warnung

Eine notorische Ursache fr Ungereimtheiten im Programmverhalten ist die auf die lnderspezifische Zahlendarstellung (Gebietseinstellungen des Systems) zurckzufhrende Punkt-/KommaProblematik im Zusammenhang mit Zeichenfolgen. Wer mit Lndereinstellung Deutsch (Standard) auf seinem System einen Zahlenwert als literale Zeichenfolge spezifiziert, muss darauf achten, das Komma als echtes Komma zu schreiben, whrend in echten numerischen Literalen der Punkt als Dezimalsymbol notiert werden muss.

Asc- , AscB- und AscW - Funktion


Function Asc (s As String) As Integer Function AscB (s As String) As Integer Function AscW (s As String) As Integer

66

Chr- ,

ChrB-

und ChrW - Funktion

Beschreibung

................................................... Bes c hreibung

Die Funktion Asc liefert den Code des ersten Zeichens der Zeichenfolge s entsprechend dem auf dem System geltenden Zeichensatz als Ganzzahl. Die beiden anderen Varianten der Funktion liefern (ohne Rcksicht auf den geltenden Zeichensatz) den ANSI-Code des ersten Bytes der Zeichenfolge (AscB) bzw. den Unicode des ersten Doppel-Bytes der Zeichenfolge (AscW).
Beispiel

................................................... Beis piel

Die Funktion StrToHex wandelt eine Zeichenfolge beliebiger Lnge byteweise in eine hexadezimale Reprsentation der Form "hh hh ..." um.

Funktionen und Anweisungen fr Zeichenfolgen

' Funktion wandelt beliebig lange Byte-Strings in Hex-String um Function StrToHex(sByteString As String) As String Dim i As Integer, iByte As Integer Dim sLow As String, sHigh As String For i = 1 To LenB(sByteString) ' byteweise analysieren iByte = AscB(MidB(sByteString, i, 1)) If iByte \ 16 > 9 Then ' Ziffer oder Buchstabe? sHigh = Chr(iByte \ 16 + 55) ' Buchstabe Else sHigh = Chr(iByte \ 16 + 48) ' Ziffer End If If iByte Mod 16 > 9 Then sLow = Chr(iByte Mod 16 + 55) Else sLow = Chr(iByte Mod 16 + 48) End If StrToHex = StrToHex + sHigh + sLow + " " ' Zusammensetzen Next i End Function
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Chr, Str
Verwandte Themen

Typumwandlung (S. 57)

Chr- , ChrB- und ChrW - Funktion


Function Chr (iANSICode As Integer) As String Function ChrB (iANSICode As Integer) As String Function ChrW (iUnicode As Integer) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Chr liefert das Unicode-Zeichen zu einem ANSI-Code als Unicode-Zeichenfolge der Lnge 1. ChrB liefert dagegen zu einem ANSI-Code das ANSI-Zeichen als ANSI-Zeichenfolge der Lnge 1 und ChrW das Unicode-Zeichen zu einem Unicode als Unicode-Zeichenfolge der Lnge 1.

67

Funktionen und Anweisungen fr Zeichenfolgen

Beispiel

................................................... Beis piel

Die Funktion HexToStr ist die Umkehrfunktion zu der Funktion StrToHex (vgl. Beispiel zu Asc). Sie wandelt beliebig lange Hexadezimaldarstellungen der Form "hh hh ..." in Bytefolgen des Typs String um.
Public Function HexToStr(sHexString As String) As String Dim i As Integer, iHigh As Integer, iLow As Integer Dim sHexChar As String Dim sLow As String, sHigh As String If LenB(" ") = Len(" ") Then ' Unicode-System? HexToStr = Space(Len(sHexString) / 3) Else HexToStr = Space(Len(sHexString) / 6) End If For i = 1 To Len(sHexString) Step 3 ' iHigh = Asc(Mid(sHexString, i, 1)) 48 ' If iHigh > 15 Then iHigh = iHigh 7 ' iLow = Asc(Mid(sHexString, i + 1, 1)) 48 If iLow > 15 Then iLow = iLow 7 MidB(HexToStr, (i + 2) \ 3) = ChrB(iHigh * Next i End Function
Verwandte Befehle

Funktionen und Anweisungen fr Zeichenfolgen

aus 3 Zeichen wird 1 Byte! Annahme: Ziffer War es etwa ein Buchstabe?

16 + iLow) ' Zusammensetzen

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Asc, Str
Verwandte Themen

Typumwandlung (S. 57)

Filter- Funktion
Function Filter( _ StringPool() As String, _ SuchString As String, _ [bVorkommenLiefern As Boolean = True], _ [vgl As vbCompareMethod = vbBinaryCompare]) _ As String()
Beschreibung

................................................... Bes c hreibung

Die Funktion Filter durchsucht die Elemente des Zeichenfolgenarrays StringPool nach dem Vorkommen der Zeichenfolge SuchString und liefert die entsprechenden Array-Elemente als Zeichenfolgenarray. Hat der optionale Parameter VorkommenLiefern den Wert True oder fehlt er, enthlt das Ergebnisarray alle Elemente, die SuchString enthalten, andernfalls (False) alle Elemente, die SuchString nicht enthalten. Hat der optionale Parameter vgl den Wert vbBinaryCompare oder fehlt er, ist die Vergleichsoperation ein zeichenweiser Unicode-Vergleich; hat vgl den Wert vbTextCompare, legt die Funktion der Vergleichsoperation die standardmige Sortierordnung der fr die auf dem System geltenden Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung.

68

Format- Funktion

Warnung

................................................... Wa rnung

Das Standardverhalten der Funktion bei fehlendem Parameter vgl kann sich durch eine Option Compare-Anweisung ndern.
Beispiel

................................................... Beis piel

Das Programm benutzt die Funktion Filter, um herauszufinden, welche Wochentage (hierfr gilt die Lndereinstellung) ohne Unterscheidung der Groschreibung die Zeichenfolge "TAG" nicht enthalten.
Private Sub Form_Load() Dim sWochenTage(7) As String, sErgebnis() As String AutoRedraw = True For i = 0 To 6 ' Wochentage generieren sWochenTage(i) = WeekdayName(i + 1) Next i sErgebnis = Filter(sWochenTage, "TAG", False, vbTextCompare) For i = 0 To UBound(sErgebnis) 1 ' es kommt nur der Mittwoch Print sErgebnis(i) Next i End Sub
Verwandte Befehle

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Verwa ndte Befehle

Join, Split

Format- Funktion
Function Format( _ vData, _ sFormat As String], _ [FirstDayOfWeek As VbFirstDayOfWeek = vbSunday], _ [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) _ As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Format liefert fr den Wert vData eine formatierte Darstellung als Zeichenfolge. Fehlt der optionale Parameter sFormat, folgt die Darstellung den auf dem jeweiligen System geltenden Lndereinstellungen, und das Ergebnis entspricht bis auf das fehlende fhrende Leerzeichen bei der Darstellung positiver Zahlen dem von Str. Ansonsten drckt sFormat unter Beachtung der Syntax fr Formatausdrcke ein benutzerdefiniertes Darstellungsformat aus. Die optionalen Parameter FirstDayOfWeek und FirstWeekOfYear beziehen sich auf exotische Formen der Datumsdarstellung und knnen im Allgemeinen getrost weggelassen werden.
Anwendung

................................................... Anwendung

Fr den Formatausdruck sFormat gelten folgende Regeln: 1. Der Formatausdruck kann den Namen eines benannten Formats enthalten. Die folgenden drei Tabellen geben einen berblick ber die benannten Formate.

69

Funktionen und Anweisungen fr Zeichenfolgen

Formatname

Beschreibung

"General Date" bliche Datums-/Zeitdarstellung mit zweistelliger Jahreszahl bei Angabe von Datum und Zeit: 01.01.00 13:00:00; bei Angabe von Zeit: 13:00:00; bei Angabe von Datum: 01.01.00 "Long Date" "Medium Date" "Short Date" Ausgeschriebenes Datum, entsprechend der Systemeinstellungen: Samstag, 1. Januar 2000 Mittleres Datumsformat (von Host-Anwendung definierbar): 1. Jan. 00 Kurzes Datum, entsprechend der Systemeinstellungen: 01.01.00

Funktionen und Anweisungen fr Zeichenfolgen

Benannte Datumsformate

Formatname "Long Time" "Medium Time" "Short Time"


Benannte Zeitformate

Beschreibung Zeitangabe enthlt auch Sekunden: 13:00:00 Zeitangabe im 12-Stunden-Format, ohne Sekunden: 1:00 Zeitangabe im 24-Stunden-Format, ohne Sekunden: 13:00

Formatname "General Number" "Currency"

Beschreibung Zahlen werden ohne Tausendertrennzeichen notiert. Zahlen werden mit Tausendertrennzeichen und zwei Nachkommastellen sowie unter Beachtung der auf dem System geltenden Gebietsschema-Einstellungen notiert. Festkommadarstellung unter Beachtung der auf dem System geltenden Gebietsschema-Einstellungen, ohne Tausendertrennzeichen und gerundet auf zwei Stellen hinter dem Komma: 10001,34 Wie "Fixed", jedoch mit Tausendertrennzeichen: 10.001,34 Wie "Fixed", jedoch mit Faktor 100 multipliziert und angehngtem Prozentzeichen % Wissenschaftliches Standardformat mit einer Stelle vor dem Komma, zwei Stellen nach dem Komma und Zehnerpotenz: 1,00E34 Ausgabe von Nein anstatt 0, Ja fr jeden anderen Wert Ausgabe von False anstatt 0, True fr jeden anderen Wert Ausgabe von Aus anstatt 0, Ein fr jeden anderen Wert

"Fixed"

"Standard" "Percent" "Scientific" "Yes/No" "True/False" "On/Off"


Benannte Zahlenformate

2. Der Formatausdruck kann ein benutzerdefiniertes Format enthalten. Die folgende Tabelle gibt einen berblick ber die Bedeutung der Symbole, die fr die Zusammenstellung benutzerdefinierter Formate eine feste Interpretation haben.

70

Format- Funktion

Symbol 0

Bedeutung Platzhalter fr Ziffer (vor und nach dem Dezimalzeichen). Auch Platzhalter fr Ganzzahlanteil vor dem Dezimalzeichen. Platzhalterpositionen, die die Dezimaldarstellung nicht bedient, erhalten das Fllzeichen 0. Das Format "0.000" fr 1234,12 ergibt "1234,120" und das Format "000000" fr 1234,12 ergibt "001234". Wie Symbol 0, es gibt jedoch kein Fllzeichen Platzhalter fr Dezimalzeichen

# . %

Funktionen und Anweisungen fr Zeichenfolgen

Zahlenwert wird mit 100 multipliziert und als Prozentwert mit anhngendem Prozentzeichen % dargestellt. Das Format "0.000%" fr 1234,12 ist "123412,000%". Die Position dieses Zeichens im Formatausdruck ist ausschlaggebend fr seine Bedeutung. Steht es zwischen zwei Ziffernplatzhaltern links vom Dezimalzeichenplatzhalter erfolgt die Darstellung mit Tausendertrennzeichen. Steht es dagegen links vom ersten Ziffernplatzhalter in einer Zahlendarstellung, erscheint es als gewhnliches Komma. Steht es bei fehlendem Dezimalzeichenplatzhalter rechts vom letzten Ziffernplatzhalter oder unmittelbar links neben dem Dezimalzeichenplatzhalter, wird der Zahlenwert durch 1000 dividiert. So bewirkt "#," fr 123.4123.456 die Darstellung "1234123" und "#,,.0" fr 1234.887.654 die Darstellung "1234,9". Wissenschaftliche Darstellung ohne Ausgabe des Pluszeichens im Exponenten Wissenschaftliche Darstellung mit Ausgabe des Pluszeichens im Exponenten Diese Symbole stehen fr sich selbst. Sie erscheinen als Zeichen. Alle anderen bedeutungsbeladenen Symbole mssen einen umgekehrten Schrgstrich vorangestellt bekommen, um sie als einfaches Zeichen darzustellen. Dieses Symbol kann einem anderen bedeutungsbeladenen Symbol vorangestellt werden, um dieses als Zeichen darzustellen. "\\" bewirkt die Ausgabe des Symbols selbst als Zeichen. Um ein Anfhrungszeichen auszugeben, muss es doppelt und in Kombination mit diesem Symbol notiert werden. Die Zahl 30405 wird mit "#0\##\'##\"" \N\o\r\d" zu "304'05"" Nord". Zeigt die Zeichenfolge in Anfhrungszeichen an. Die Regeln fr Zeichenfolgenliterale fordern die doppelte Notation von Anfhrungszeichen. Die Zahl 30405 wird mit "#0\##\'##\"" ""Nord""" gleichfalls zu "304'05"" Nord".

E- oder eE+ oder e+ - + $ ( )

"Nord"

Symbole fr benutzerdefinierte Zahlenformate

Symbol : / C d dd ddd

Bedeutung Platzhalter fr Zeittrennzeichen zwischen Stunden, Minuten und Sekunden Platzhalter fr Datumstrennzeichen zwischen Tagen, Monaten und Jahren Zeigt Datumsanteil in der Form ddddd und Zeitanteil in der Form ttttt an Tag erscheint als Zahl ohne fhrende Null (1 bis 31) Tag erscheint als Zahl mit fhrender Null (01 bis 31) Tag erscheint als abgekrzter Wochentag (Mo bis So)

Symbole fr benutzerdefinierte Datums- und Zeitformate

71

Funktionen und Anweisungen fr Zeichenfolgen

Symbol dddd ddddd dddddd w

Bedeutung Tag erscheint als ausgeschriebener Wochentag (Montag bis Sonntag) Datum erscheint vollstndig im kurzen Datumsformat (vgl. benanntes Format "Short Date") Datum erscheint vollstndig im langen Datumsformat (vgl. benanntes Format "Long Date") Wochentag erscheint als Zahl ohne fhrende Null (1 bis 7) Woche erscheint als Kalenderwoche (1 bis 54) Monat erscheint als Zahl ohne fhrende Null (1 bis 12) Monat erscheint als Zahl mit fhrender Null (01 bis 12) Monat erscheint als abgekrzter Monatsname (Jan bis Dez) Monat erscheint als ausgeschriebener Monatsname (Januar bis Dezember) Quartal erscheint als Zahl (1 bis 4) Kalendertag erscheint als Zahl (1 bis 366) Jahr erscheint als zweistellige Zahl (00 bis 99) Jahr erscheint als vierstellige Zahl (100 bis 9999) Stunde erscheint als Zahl ohne fhrende Null (0 bis 23) Stunde erscheint als Zahl mit fhrender Null (00 bis 23) Minute erscheint als Zahl ohne fhrende Null (0 bis 59) Minute erscheint als Zahl mit fhrender Null (00 bis 59) Sekunde erscheint als Zahl ohne fhrende Null (0 bis 59) Sekunde erscheint als Zahl mit fhrender Null (00 bis 59) Zeit erscheint als vollstndiges langes Zeitformat mit Stunden, Minuten und Sekunden (vgl. benanntes Format "Long Time") Zeit erscheint im 12-Stunden-Format mit Anhang AM fr Stunden zwischen 0 und 12 und mit Anhang PM fr Stunden zwischen 13 und 23. Das amerikanische Zeitformat ist somit "hh.nn.ss AM/PM". Wie AM/PM, jedoch mit kleingeschriebenem Anhang am bzw. pm

Funktionen und Anweisungen fr Zeichenfolgen

ww m mm mmm mmmm q y yy yyyy h hh n nn s ss ttttt AM/PM

am/pm

Symbole fr benutzerdefinierte Datums- und Zeitformate

Symbol @ & < > !

Bedeutung Platzhalter fr alphanumerisches Zeichen; Fllzeichen ist das Leerzeichen Platzhalter fr alphanumerisches Zeichen; kein Fllzeichen Erzwingt Kleinschreibung Erzwingt Groschreibung Erzwingt Auswertung der Platzhalter von links nach rechts (standardmig werden Platzhalter von rechts nach links ausgewertet)

Symbole fr benutzerdefinierte Zeichenfolgenformate

72

FormatCurrency- Funktion

Warnung

................................................... Wa rnung

Leider ist die Format-Funktion von Visual Basic 6.0 nicht fehlersicher implementiert, und liefert im Zusammenhang mit der Print-Anweisung gerne mal den obskuren Fehler 480, Anwendungs- oder objektdefinierter Fehler, wenn der Formatausdruck syntaktisch nicht korrekt ist oder einfach nicht zum Typ oder Wert von vData passt. Da dieser Fehler danach selbst bei Angabe korrekter Argumente nicht mehr weg zu bekommen ist, hilft in diesem Fall nur ein Neustart von Visual Basic.
Beispiel

................................................... Beis piel

Funktionen und Anweisungen fr Zeichenfolgen

Das Projekt FormatDemo gibt einen Halbjahreskalender auf einem gewhnlichen Formular aus:
' Projekt FormatDemo Private Sub Form_Load() Const cJahr = 2001 ' Jahr Const cHalbjahr = 2 AutoRedraw = True For iMonat = 1 To 6 ' erstes Halbjahr Dat = DateSerial(cJahr, iMonat + (cHalbjahr 1) * 6, 1) Print Format(Dat, "mmmm yyyy") Print "Kal.-Woche", For i = 0 To 6 ' Wochentage ausgeben Print Format(Dat + i, "dddd"), Next Print ' Anzahl der Tage in Monat berechnen Tage = Day(DateSerial(Year(Dat), Month(Dat) + 1, Day(Dat) 1)) For i = 1 To Tage ' Kalenderwoche und Tage ausgeben If (i 1) Mod 7 = 0 Then Print Format(Dat + i 1, "ww"), Print Format(i, "00"), If i Mod 7 = 0 Then Print Next Print Next End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

FormatCurrency, FormatDateTime, FormatNumber, FormatPercent, Str


Verwandte Themen

Typumwandlung (S. 57)

FormatCurrency- Funktion
Function FormatCurrency( _ vData, _ [NachkommaStellen As Long = -1], _ [NullVorKommaErgnzen As VbTriState = vbUseDefault], _ [WennNegativKlammernSetzen As VbTriState = vbUseDefault], _ [TausenderTrennzVerwenden As VbTriState = vbUseDefault]) _ As String

73

Funktionen und Anweisungen fr Zeichenfolgen

Beschreibung

................................................... Bes c hreibung

Die Funktion FormatCurrency ist eine spezialisierte Variante der Funktion Format. Sie liefert unter Verwendung der in der Systemsteuerung definierten Whrung eine als Whrungswert formatierte Zeichenfolge. Mittels der vier optionalen Parameter lassen sich Vorgaben fr die Anzahl der Nachkommastellen, die Ergnzung einer fhrenden Null bei Werten kleiner eins, die Klammerung negativer Zahlen sowie die Ergnzung eines Tausendertrennzeichens treffen.
Beispiel

................................................... Beis piel

Funktionen und Anweisungen fr Zeichenfolgen

' Ausgabe: "(-14.345,13 DM)" Print FormatCurrency(-14345.1253, , , vbTrue) ' Ausgabe: "-14345,125 DM" Print FormatCurrency(-14345.1253, 3, vbFalse, vbFalse, vbFalse)
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Format, FormatDateTime, FormatNumber, FormatPercent, Str, CStr


Verwandte Themen

Typumwandlung (S. 57)

FormatDateTime- Funktion
Function FormatDateTime( _ vData, _ BenanntesFormat As VbDateTimeFormat = vbGeneralDate]) _ As String
Beschreibung

................................................... Bes c hreibung

Die Funktion FormatDateTime ist eine spezialisierte Variante der Funktion Format. Sie liefert unter Verwendung des in der Systemsteuerung definierten Datums- und Zeitformats eine als Datums- und/oder Zeitangabe formatierte Zeichenfolge. Mittels des optionalen Parameters BenanntesFormat lsst sich das zu verwendende Format vorgeben. Zur Auswahl stehen je ein kurzes und ein langes Format fr Zeitangaben und Datumsangaben.
Beispiel

................................................... Beis piel

Print FormatDateTime(14345.1223, vbShortTime) ' Ausgabe: "02:56" Print FormatDateTime(14345.1223, vbLongTime) ' Ausgabe: "02:56:07" Print FormatDateTime(14345.1223, vbShortDate) ' Ausgabe: "10.4.39" ' Ausgabe: "Montag, 10 April 1939" Print FormatDateTime(14345.1223, vbLongDate) ' Ausgabe: "10.4.39 02:56:07" Print FormatDateTime(14345.1223, vbGeneralDate) Print FormatDateTime(14345.1223) ' Ausgabe: "10.4.39 02:56:07"
Verwandte Befehle

................................................... Verwa ndte Befehle

Format, FormatCurrency, FormatNumber, FormatPercent, Str

74

FormatNumber- Funktion

Verwandte Themen

................................................... Verwandte Them en

Typumwandlung (S. 57)

FormatNumber- Funktion
Function FormatNumber( _ vData, _ [NachkommaStellen As Long = -1], _ [NullVorKommaErgnzen As VbTriState = vbUseDefault], _ [WennNegativKlammernSetzen As VbTriState = vbUseDefault], _ [TausenderTrennzVerwenden As VbTriState = vbUseDefault]) _ [ZiffernGruppieren As VbTriState = vbUseDefault)] _ As String
Beschreibung

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Bes c hreibung

Die Funktion FormatNumber ist eine spezialisierte Variante der Funktion Format. Sie liefert eine Zahlendarstellung in Form einer Zeichenfolge. Der einzige Unterschied zu FormatCurrency besteht darin, dass die Funktion ihre Darstellung ohne Whrungssymbol vornimmt. Mittels der fnf optionalen Parameter lassen sich Vorgaben fr die Anzahl der Nachkommastellen, die Ergnzung einer fhrenden Null bei Werten kleiner eins, die Klammerung negativer Zahlen sowie die Ergnzung eines Tausendertrennzeichens treffen.
Beispiel

................................................... Beis piel

Print FormatNumber(-143.1253) ' Ausgabe:"-143,13" Print FormatNumber(-143.1253, 3, , vbTrue) ' Ausgabe:"(143,125)" Print FormatNumber(-143.1253, 0, vbFalse, vbFalse) ' Ausgabe:"-143)"
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Format, FormatCurrency, FormatDateTime, FormatNumber, Str


Verwandte Themen

Typumwandlung (S. 57)

FormatPercent- Funktion
Function FormatPercent( _ vData, _ [NachkommaStellen As Long = -1], _ [NullVorKommaErgnzen As VbTriState = vbUseDefault], _ [WennNegativKlammernSetzen As VbTriState = vbUseDefault], _ [TausenderTrennzVerwenden As VbTriState = vbUseDefault], _ [ZiffernGruppieren As VbTriState = vbUseDefault)] _ As String
Beschreibung

................................................... Bes c hreibung

Die Funktion FormatPercent ist eine spezialisierte Variante der Funktion Format. Sie multipliziert vData mit 100 und liefert das Ergebnis als Prozentangabe mit Prozentzeichen in Form einer Zeichenfolge. Mittels der fnf optionalen Parameter lassen sich Vorgaben fr die Anzahl der Nachkommastellen, die Ergnzung einer fhrenden Null bei Werten kleiner eins, die Klammerung negativer Zahlen sowie die Ergnzung eines Tausendertrennzeichens treffen.

75

Funktionen und Anweisungen fr Zeichenfolgen

Beispiel

................................................... Beis piel

Print FormatPercent(-143.1253) ' Ausgabe: "-14.312,53%" Print FormatPercent(-143.1253, , , vbTrue) ' Ausgabe: "(14.312,53%)" Print FormatPercent(-143.1253, 0, vbFalse, vbFalse) 'Ausgabe:"-14.313%)"
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Format, FormatCurrency, FormatDateTime, FormatNumber, Str


Verwandte Themen

Funktionen und Anweisungen fr Zeichenfolgen

Typumwandlung (S. 57)

Hex- Funktion
Function Hex(vZahl) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Hex interpretiert den Wert vZahl als Ganzzahl und liefert deren hexadezimale Reprsentation als Zeichenfolge. Die Darstellung enthlt nicht mehr Stellen als ntig, mithin also keine fhrenden Nullen oder Leerzeichen.
Beispiel

................................................... Beis piel

Print Hex(255) ' Ausgabe: "FF" lWert = 10 Print "&H" Right("0000000"+Hex(lWert) , 8) ' Ausgabe: "&H0000000A"
Verwandte Befehle

................................................... Verwa ndte Befehle

Oct

InStr- und InStrB- Funktion


Function InStr( [lStart As Long = 1,] _ sDurchsuchterString As String, _ sSuchString As String,_ [vgl As VbCompareMethode = vbBinaryCompare]) _ As Long Function InStrB( [lStart As Long = 1,] _ sDurchsuchterANSIString As String, _ sANSISuchString As String,_ [vgl As VbCompareMethode = vbBinaryCompare]) _ As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion InStr durchsucht die Zeichenfolge sDurchsuchterString ab der Zeichenposition lStart (optional mit Vorgabewert 1) nach dem nchsten Vorkommen der Zeichenfolge sSuchString. Ist die Suche erfolgreich, liefert die Funktion ihre Startposition in der durchsuchten Zeichenfolge, ansonsten den Wert 0. Hat der optionale Parameter vgl den Wert vbBinary-

76

InStrRev- Funktion

Compare oder fehlt er, ist die Vergleichsoperation ein zeichenweiser Unicode-Vergleich; hat vgl den Wert vbTextCompare, legt die Funktion der Vergleichsoperation die standardmige Sortierordnung der fr die auf dem System geltenden Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung. Die Variante InStrB dieser Funktion ist fr Zeichenfolgen im ANSI-Code zustndig.
Hinweis

................................................... Hinweis
Die mit Visual Basic 6.0 vorliegende Implementation dieser Funktion hat kein Problem damit, wenn Start grer ist als die Lnge der durchsuchten Zeichenfolge. Negative Werte sowie ein Wert von 0 fhren dagegen zu einem Laufzeitfehler.
Warnung

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Wa rnung

Das Standardverhalten der Funktion bei fehlendem Parameter vgl kann sich durch eine Option Compare-Anweisung ndern.
Beispiel

................................................... Beis piel

Der folgende Code zhlt mittels der Zhlvariablen iCount, wie oft die Zeichenfolge s1 innerhalb der Zeichenfolge s2 vorkommt.
iCount = 0 lPos = 0 Do lPos = InStr(lPos + 1, s1, s2) If lPos Then iCount = iCount +1 Loop While lPos ... ' iCount enthlt nun die Anzahl der Vorkommen
Verwandte Befehle

................................................... Verwa ndte Befehle

Filter, InStrRev, StrComp

InStrRev- Funktion
Function InStrRev( sDurchsuchterString As String, _ sSuchString As String,_ [lStart As Long = -1,] _ [vgl As VbCompareMethod = vbBinaryCompare]) _ As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion InStrRev vollbringt die gleiche Aufgabe wie InStr, mit dem feinen Unterschied, dass sie die Zeichenfolge sDurchsuchterString ab der Zeichenposition lStart (optional, mit Vorgabewert -1) rckwrts, also von rechts nach links, durchsucht. Hat der optionale Parameter vgl den Wert vbBinaryCompare oder fehlt er, ist die Vergleichsoperation ein zeichenweiser Unicode-Vergleich; hat vgl den Wert vbTextCompare, legt die Funktion der Vergleichsoperation die standardmige Sortierordnung der fr die auf dem System geltenden Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung.

77

Funktionen und Anw eisungen fr Zeichenfolgen

Hinweis

................................................... Hinweis
Die mit Visual Basic 6.0 vorliegende Implementation dieser Funktion hat kein Problem damit, wenn lStart grer ist als die Lnge der durchsuchten Zeichenfolge. Werte kleiner gleich 0 (auer dem Sonderwert -1) fhren dagegen zu einem Laufzeitfehler.
Warnung

................................................... Wa rnung

Das Standardverhalten der Funktion bei fehlendem Parameter vgl kann sich durch eine Option Compare-Anweisung ndern.
Beispiel

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Beis piel

Der folgende Code zhlt mittels der Zhlvariablen iCount, wie oft die Zeichenfolge s1 innerhalb der Zeichenfolge s2 vorkommt.
iCount = 0 lPos = -1 Do lPos = InStrRev(s1, s2, lPos) 1 If lPos >= 0 Then iCount = iCount + 1 Loop While lPos > 0 ... ' iCount enthlt nun die Anzahl der Vorkommen
Verwandte Befehle

................................................... Verwa ndte Befehle

Filter, InStr, StrComp

J oin- Funktion
Function Join( _ StringArray() As String, _ [TrennZeichen As String] = " ") _ As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Join ist die Umkehrfunktion zu Split. Sie verkettet die Elemente des Zeichenfolgenarrays StringArray zu einer einzelnen Zeichenfolge und liefert diese zurck. Fehlt der optionale Parameter TrennZeichen, fgt die Funktion zwischen den Elementen ein Leerzeichen ein. Durch Angabe eines Werts lassen sich auch andere Trennzeichenfolgen vorgeben, so etwa die leere Zeichenfolge "", das Tabulatorzeichen vbTab oder Zeilenvorschbe vbCrLf.
Beispiel

................................................... Beis piel

Das Projekt JoinDemo initialisiert ein Zeichenfolgenarray mit den Namen der Wochentage und gibt das Ergebnis des nachfolgenden Join-Aufrufs aus:
' Projekt: JoinDemo Private Sub Form_Load() Dim sWochenTage(7) As String, sErgebnis() As String AutoRedraw = True For i = 0 To 6 ' Wochentage generieren sWochenTage(i) = WeekdayName(i + 1) Next i Print Join(sWochenTage, vbCrLf) End Sub

78

LCase- Funktion

Verwandte Befehle

................................................... Verwa ndte Befehle

Filter, Split

LCase- Funktion
Function LCase(s As String) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion LCase liefert eine Kopie der im Parameter s bergebenen Zeichenfolge in Kleinschreibung zurck. Null wird wieder als Null zurckgegeben.
Beispiel

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Beis piel


' Schreibweise egal

if LCase(sTest1) = LCase(sTest2) Then


Verwandte Befehle

................................................... Verwa ndte Befehle

UCase

Left- und LeftB- Funktion


Function Left(sUnicode As String, lZeichenAnz As Long) As String Function LeftB(sANSI As String, lZeichenAnz As Long) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Left liefert die ersten lZeichenAnz Zeichen der Zeichenfolge sUnicode als Unicode-Zeichenfolge und die Funktion LeftB die ersten lZeichenAnz Bytes der Zeichenfolge sANSI als ANSI-Zeichenfolge. Ist der Wert von lZeichenAnz grer oder gleich der Lnge der Zeichenfolge, gibt die Funktion die vollstndige Zeichenfolge zurck. Mit 0 als Wert fr lZeichenAnz gibt die Funktion die leere Zeichenfolge zurck.
Beispiel

................................................... Beis piel

Die folgende Ausgabeanweisung gibt die Zeichenfolge s linksbndig in einem Feld aus. Ist die Lnge der Zeichenfolge s kleiner als 8, werden von rechts her Leerzeichen ergnzt (linksbndige Prokrustes-Zuweisung, vgl. auch LSet-Anweisung, S. 80).
Const cFeldBreite = 8 Print Left(s + Space(cFeldBreite), cFeldBreite)
Verwandte Befehle

................................................... Verwa ndte Befehle

Right, RightB, Mid, MidB, LTrim, RTrim, Trim

Len- und LenB- Funktion


Function Len(sUnicode As String) As Long Function LenB(Var As Type) As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion Len liefert die Anzahl der Zeichen in der Zeichenfolge sUnicode. Die leere Zeichenfolge Null hat die Lnge 0. Die Funktion LenB gibt die Anzahl der Bytes zurck, die zum Speichern des Werts von Var bentigt werden.

79

Funktionen und Anweisungen fr Zeichenfolgen

Anwendung

................................................... Anwendung

Wie es die Beschreibung bereits vermuten lsst, verbirgt sich hinter der Funktion LenB so etwas wie der Lngenoperator der Sprache Visual Basic, den Sie benutzen knnen, wann immer Sie wissen wollen, wie viele Bytes fr die Reprsentation eines bestimmten Werts von einem bestimmten Datentyp erforderlich sind. Achtung jedoch, die Lngenangaben von Zeichenfolgen enthalten nicht den Lngenbedarf des Deskriptors (vgl. auch Get-Anweisung, S. 140). Auf Arrays lsst sich diese Funktion gar nicht anwenden.
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle

Funktionen und Anweisungen fr Zeichenfolgen

Siehe Beispiel zu Chr-, ChrB- und ChrW-Funktion (S. 67)


Verwandte Befehle

VarType

LSet- Anweisung
LSet sString1 = sString2 LSet bdtVar = bdtWert
Beschreibung

................................................... Bes c hreibung

Die Anweisung LSet nimmt eine linksbndige Prokrustes-Zuweisung fr Zeichenfolgen und benutzerdefinierte Datentypen vor. Auf Zeichenfolgen angewendet, bertrgt sie den Wert von sString2 linksbndig in die Variable sString1, ohne deren Lnge anzupassen. Dabei wird der Wert von sString2 gegebenenfalls zurechtgestutzt oder um Leerzeichen ergnzt (vgl. Beispiel in Left- und LeftB-Funktion, S. 79). Auf benutzerdefinierte Datentypen angewendet, bertrgt LSet den Wert bdtWert Byte-weise und linksbndig in die Variable bdtVar, ohne deren Lnge anzupassen. Ist bdtWert krzer als der Wert, den bdtVar erwartet, ergnzt die Anweisung Nullbytes, ist er lnger, wird zurechtgestutzt.
Anwendung

................................................... Anwendung

Der ursprngliche Sinn dieser Anweisung war die Bereitstellung einer blockorientierten Zuweisungsoperation fr zusammengesetzte bzw. benutzerdefinierte Datentypen. Solche Werte lassen sich im Rahmen einer gewhnlichen Let-Zuweisung en bloc nmlich nicht mehr bertragen. Ein sehr wichtiger Einsatzbereich von LSet ist daher die berfhrung traditionell via Get oder Input gelesener Datenstze in Datensatzvariablen mit benutzerdefinierter Struktur bzw. die Vorbereitung von Datensatzvariablen fr die Put-Operation. Aus diesem Grund ist die Typberprfung, die Visual Basic LSet angedeihen lsst, nicht sehr rigide.
Warnung und Tipp

................................................... Wa rnung

Nachtigall, ick hr dir trapsen. Ja, mit LSet lassen sich auf dem Umweg ber benutzerdefinierte Datentypen implizite Typumwandlungen ausfhren, wie das Beispiel zu diesem Befehl zeigt. Von einer ernsthaften Anwendung im Zusammenhang mit disparaten Datentypen, die ber eine Analyse von Reprsentationen bestimmter Datentypen oder Werte hinausgeht, ist jedoch abzuraten, da fr gewhnlich nicht klar ist, welche Speicherausrichtung die Felder benutzerdefinierter Datentypen vom Compiler erhalten.

80

LTrim- Funktion

Beispiel

................................................... Beis piel

Wer die Speicherdarstellung eines spezifischen Werts zu Gesicht bekommen will, muss schon ein wenig tricksen, um der rigiden Typkontrolle von Visual Basic zu entrinnen. Der folgende Code benutzt die als Beispiel zu Chr vorgestellte Funktion StrToHex, um die hexadezimale Reprsentation eines Double-Werts nach einer LSet-Zuweisung zu erhalten. Beachten Sie bei der Interpretation der Hexadezimaldarstellung, dass Intel-Prozessoren mit verkehrter Bytereihenfolge arbeiten und in einem aus mehreren Bytes bestehenden Wert das erste Byte das niederwertige Byte ist.
Private Type bdt1 ' f As Double End Type Private Type bdt2 ' s As String * 4 End Type Private Sub Form_Load() AutoRedraw = True Dim bt1 As bdt1, bt2 As bt1.f = 2.234E-23 ' LSet bt2 = bt1 ' Print StrToHex(bt2.s) ' End Sub
Verwandte Befehle

erster benutzerdefinierter Typ

Funktionen und Anweisungen fr Zeichenfolgen

zweiter benutzerdefinierter Typ

bdt2 wie sieht die Reprsentation dieses Werts aus? Zuweisung unter Umgehung der Typprfung Ausgabe der hexadezimalen Darstellung

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Get, Let, Put, RSet


Verwandte Themen

Typumwandlung (S. 57)

LTrim- Funktion
Function LTrim(s As String) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion liefert eine Kopie der Zeichenfolge s zurck, die keine fhrenden Leerzeichen mehr enthlt.
Beispiel

................................................... Beis piel

Dim i As Integer i = 121 Print LTrim(Str(i))


Verwandte Befehle

' schneidet Leerstelle fr Vorzeichen ab

................................................... Verwa ndte Befehle

RTrim, Trim

Mid- und MidB- Funktion


Function Mid(sUnicode As String, lStart As Long _ [, lAnz As Long]) As String Function MidB(sANSI As String, lStart As Long _ [, lAnz As Long]) As String

81

Funktionen und Anweisungen fr Zeichenfolgen

Beschreibung

................................................... Bes c hreibung

Die Funktion Mid liefert lAnz Zeichen der Zeichenfolge sUnicode ab der Position lStart als Unicode-Zeichenfolge zurck. In gleicher Weise liefert die MidB-Funktion lAnz Bytes der Zeichenfolge sANSI ab der Byteposition lStart als Zeichenfolge. Fehlt der optionale Parameter lAnz, liefern beide Funktionen den gesamten Rest der Zeichenfolge ab der Position lStart.
Beispiel

................................................... Beis piel

Vgl. die Beispiele in Chr-, ChrB- und ChrW-Funktion (S. 67) und Asc-, AscB- und AscW-Funktion (S. 66).

Funktionen und Anweisungen fr Zeichenfolgen

Mid- und MidB- Anweisung


Mid s, lStart [, lAnz] = sErsatz MidB s, lStart [, lAnz] = sErsatz
Beschreibung

................................................... Bes c hreibung

Die Mid-Zuweisung kopiert die ersten lAnz Zeichen der Zeichenfolge sErsatz in die Zeichenfolge s ab Position lStart. Ist lAnz grer als die Lnge von sErsatz oder fehlt lAnz, wird die gesamte Zeichenfolge sErsatz kopiert. MidB unterscheidet sich von Mid nur darin, dass sie lAnz als Byteanzahl interpretiert und Byte-weise kopiert.
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle

Siehe Beispiel zu Chr-, ChrB- und ChrW-Funktion (S. 67)


Verwandte Befehle

Left, LeftB, Right, RightB, LTrim, RTrim, Trim

MonthName- Funktion
Function MonthName(lMonat As Long[, bAbk As Boolean = False]) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion MonthName liefert den zur Monatszahl lMonat gehrigen Monatsnamen als Zeichenfolge. Hat der optionale Parameter bAbk den Wert False oder fehlt er, gibt die Funktion den vollen Namen zurck, ansonsten seine Abkrzung (drei Buchstaben). Monatszahlen, die nicht zwischen 1 und 12 liegen, fhren zu einem Laufzeitfehler.
Beispiel

................................................... Beis piel


' Name aktueller Monat, ausgeschrieben

Print MonthName(Month(Date))
Verwandte Befehle

................................................... Verwa ndte Befehle

WeekdayName

Oct- Funktion
Function Oct(vOctWert) As Double

82

Option Compare- Anw eisung

Beschreibung

................................................... Bes c hreibung

Die Funktion Oct zhlt wie Hex nur mittelbar zu den Typumwandlungsfunktionen. Whrend Hex die hexadezimale Notation seines als Ganzzahl interpretierten Arguments als Zeichenfolge liefert, liefert Oct dessen oktale Notation.
Anwendung

................................................... Anwendung

Die Umwandlung in das oktale Zahlensystem mittels Oct findet heutzutage eher selten Anwendung. Sie ist ein Relikt aus vergangenen Zeiten, als das hexadezimale Zahlensystem im Computerbereich noch nicht die alles dominierende Rolle spielte.

Funktionen und Anweisungen fr Zeichenfolgen

Beispiel

................................................... Beis piel


' 64+8+5 = "115" ' Oktales Literal: "1234"

Print Oct(77) Print Oct(&o1234)


Verwandte Befehle

................................................... Verwa ndte Befehle

Hex

Option Compare- Anweisung


Option Compare Binary Option Compare Text
Beschreibung

................................................... Bes c hreibung

Die Anweisung Option Compare legt fest, welche Art von Zeichenfolgenvergleich bestimmte Zeichenfolgenfunktionen laut Vorgabe (das heit ohne Angabe des jeweiligen optionalen Parameters) durchfhren. Der Vergleichsart Binary liegt ein schlichter Vergleich der binren Reprsentation (zeichenweiser Unicode-Vergleich), der Vergleichsart Text dagegen die standardmige Sortierordnung der fr die auf dem System geltende Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung. Diese Anweisung darf in einem Modul nicht mehrfach gegeben werden, das heit, sie gilt immer fr das gesamte Modul und muss auf Modulebene stehen. Fehlt die Anweisung, gilt fr das jeweilige Modul die Voreinstellung Binary. Eine Option Compare-Anweisung wirkt sich auf die Zeichenfolgenoperatoren <, >, <=, >=, = und <> aus. Weiterhin kann sie sich bei Fehlen des entsprechenden optionalen Parameters auch auf die Funktionen: Filter, InStr, InStrB, InStrRev, Replace, Split, StrComp auswirken.
Beispiel

................................................... Beis piel

Option Compare Text ... Print (StrComp("", "u", vbBinaryCompare) = -1) = ("" < "") ' Ausgabe: Falsch

aber
Option Compare Binary ' Standardvergleichsart ... Print (StrComp("", "u", vbBinaryCompare) = -1) = ("" < "") ' Ausgabe: Wahr

83

Funktionen und Anweisungen fr Zeichenfolgen

Verwandte Befehle

................................................... Verwa ndte Befehle

Option Base, Option Explicit, Option Private

Replace- Funktion
Function Replace( _ sDurchsuchterString As String, _ sSuchString As String,_ sErsatzString As String,_ [lStart As Long = 1], _ [lAnz As Long = -1], [vgl As VbCompareMethode = vbBinaryCompare]) _ As Long
Beschreibung

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Bes c hreibung

Die Funktion Replace durchsucht die Zeichenfolge sDurchsuchterString ab der Zeichenposition lStart nach maximal lAnz Vorkommen der Zeichenfolge sSuchString und liefert eine Kopie von sDurchsuchterString ab der Zeichenposition lStart, in der all diese Vorkommen gegen die Zeichenfolge sErsatzString ersetzt sind. Fehlt der optionale Parameter lStart, beginnt die Kopie beim ersten Zeichen. Fehlt der Parameter lAnz, ersetzt die Funktion beliebig viele Vorkommen von sSuchString. Hat der optionale Parameter vgl den Wert vbBinaryCompare oder fehlt er, ist die Vergleichsoperation ein zeichenweiser Unicode-Vergleich; hat vgl den Wert vbTextCompare, legt die Funktion der Vergleichsoperation die standardmige Sortierordnung der fr die auf dem System geltenden Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung.
Hinweis

................................................... Hinweis
Die mit Visual Basic 6.0 vorliegende Implementation dieser Funktion hat kein Problem damit, wenn Start grer ist als die Lnge der durchsuchten Zeichenfolge; negative Werte sowie ein Wert von 0 fhren dagegen zu einem Laufzeitfehler.
Warnung

................................................... Wa rnung

Das Standardverhalten der Funktion bei fehlendem Parameter vgl kann sich durch eine Option Compare-Anweisung ndern.
Beispiel

................................................... Beis piel


As String Replace("12222223", Replace("12222223", Replace("12222223", Replace("abbbbbbc", "22", "22", "22", "BB", "3") "3", 2, 2) "3", 2 ,0) "C", 2, , vbTextCompare) ' ' ' ' "13333" "33223" "2222223" "CCCc"

Dim s Print Print Print Print

Vergleiche auch das Beispiel zu Print # (S. 151).


Verwandte Befehle

................................................... Verwa ndte Befehle

Filter, InStr, StrComp

84

Partion- Funktion

Partion- Funktion
Function Partition(Number As Long, Start As Long, Stop As Long, _ Interval As Long) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Partition ordnet eine gegebene Zahl Number in das zugehrige Intervall einer Intervallfolge ein und liefert dann eine Beschreibung des Intervalls in der Form UntereGrenze: ObereGrenze. Die Intervallfolge ist ber Start (untere Grenze des ersten Intervalls), Stop (obere Grenze des letzten Intervall) und Interval (Breite der einzelnen Intervalle in der Folge) definiert und enthlt die halboffenen (nach oben offen) Intervalle, die sich durch wiederholte Addition der Intervalllnge zum Startwert ergeben. Ist Number kleiner als Start, beschreibt die Funktion das Intervall in der Form: : UntereGrenze , ist Number grer als Stop, in der Form: ObereGrenze: .
Anwendung

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Anwendung

Der Einsatzbereich dieser ziemlich spezialisierten Funktion liegt hauptschlich im Bereich der Datenbankprogrammierung, wo sie fr die Berechnung der Datensatzgruppierung verwendbar ist.
Beispiel

................................................... Beis piel


Partition(1, 2, 100, 23) Partition(24, 2, 100, 23) Partition(25, 2, 100, 23) Partition(101, 2, 100, 23) ' ' ' ' Ausgabe: Ausgabe: Ausgabe: Ausgabe: ": 2" "2: 24" "25: 47" "101: "

Print Print Print Print

Right- und RightB- Funktion


Function Right(sUnicode As String, lZeichenAnz As Long) As String Function RightB(sANSI As String, lZeichenAnz As Long) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Right liefert die letzten lZeichenAnz Zeichen der Zeichenfolge sUnicode als Unicode-Zeichenfolge und die Funktion RightB die letzten lZeichenAnz Bytes der Zeichenfolge sANSI als ANSI-Zeichenfolge. Ist der Wert von lZeichenAnz grer oder gleich der Lnge der Zeichenfolge, gibt die Funktion die vollstndige Zeichenfolge zurck. Mit 0 als Wert fr lZeichenAnz gibt die Funktion die leere Zeichenfolge Null zurck.
Beispiel

................................................... Beis piel

Die folgende Ausgabeanweisung gibt die Zeichenfolge s rechtsbndig in einem Feld aus. Ist die Lnge der Zeichenfolge s kleiner als 8, werden von links her Leerzeichen ergnzt (rechtsbndige Prokrustes-Zuweisung, vgl. auch RSet-Anweisung, S. 86).
Const cFeldBreite = 8 Print Right(Space(cFeldBreite) + s , cFeldBreite)
Verwandte Befehle

................................................... Verwa ndte Befehle

Right, RightB, Mid, MidB, LTrim, RTrim, Trim

85

Funktionen und Anweisungen fr Zeichenfolgen

RSet- Anweisung
RSet sString1 = sString2
Beschreibung

................................................... Bes c hreibung

Die Anweisung RSet nimmt eine rechtsbndige Prokrustes-Zuweisung fr Zeichenfolgen vor, das heit, sie kopiert den Wert von sString2 rechtsbndig in die Variable sString1, ohne deren Lnge anzupassen. Dabei wird der Wert von sString2 gegebenenfalls vorne zurechtgestutzt oder um Leerzeichen ergnzt.
Beispiel

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Beis piel

Dim s As String * 20 RSet s = FormatCurrency(vWert, 2)


Verwandte Befehle

................................................... Verwa ndte Befehle

Get, Let, LSet, Put

RTrim- Funktion
Function RTrim(s As String) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion liefert eine Kopie der Zeichenfolge s zurck, die keine Leerzeichen am Ende enthlt.
Beispiel

................................................... Beis piel

Dim sFix As String * 100 Dim sVariable As String sFix = "Literaler Wert" ' Prokrustes-Zuweisung sVariable = sFix Print RTrim(sVariable)
Verwandte Befehle

................................................... Verwa ndte Befehle

LTrim, Trim

Space- Funktion
Function Space(lAnz As Long) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Space liefert eine Unicode-Zeichenfolge der Lnge lAnz, die mit Leerzeichen gefllt ist.
Beispiel

................................................... Beis piel

Siehe die Beispiele zu Chr-, ChrB- und ChrW-Funktion (S. 67), Left- und LeftB-Funktion (S. 79 ) und Right- und RightB-Funktion (S. 85).
Verwandte Befehle

................................................... Verwa ndte Befehle

LTrim, RTrim

86

Split- Funktion

Split- Funktion
Function Split(_ sKombination As String, _ [sTrennzeichen As String = " "], _ [lAnz As Long = -1], _ [vgl As vbCompareMethod = vbBinaryCompare]) _ As String()
Beschreibung

................................................... Bes c hreibung

Als Umkehrfunktion zu Join unterteilt die Funktion Split die Zeichenfolge sKombination in mehrere Zeichenfolgen und gibt diese als Zeichenfolgenarray zurck. Fehlt der optionale Parameter sTrennzeichen, wertet die Funktion standardmig jedes erscheinende Leerzeichen als Trennzeichen zwischen zwei Zeichenfolgen, ansonsten den Wert von sTrennzeichen. Fehlt der optionale Parameter lAnz, nimmt die Funktion so viele Unterteilungen vor, wie sie Trennzeichen findet, ansonsten nicht mehr als lAnz. Hat der optionale Parameter vgl den Wert vbBinaryCompare oder fehlt er, ist die Vergleichsoperation ein zeichenweiser Unicode-Vergleich; hat vgl den Wert vbTextCompare, legt die Funktion der Vergleichsoperation die standardmige Sortierordnung der fr die auf dem System geltenden Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung.
Warnung

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Wa rnung

Das Standardverhalten der Funktion bei fehlendem Parameter vgl kann sich durch eine Option Compare-Anweisung ndern.
Beispiel

................................................... Beis piel

cVornamen = "Audra, Petra, Jennifer, Maria, Magdalena" Dim sVornamen() As String sVornamen = Split(cVornamen, ", ") For i = 0 To UBound(sVornamen) ' zeilenweise ausgeben Print sVornamen(i) Next i Print cVornamen = Join(sVornamen, ", ") ' Ausgabe: Wahr
Verwandte Befehle

................................................... Verwa ndte Befehle

Filter, Join

Str- Funktion
Function Str(lZahl As Long) As String Function Str(dZahl As Double) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Str liefert den Wert von lZahl bzw. dZahl als Unicode-Zeichenfolge im standardmigen amerikanischen Zahlenformat.
Warnung

................................................... Wa rnung

Leider ist die Str-Funktion von Visual Basic 6.0 nicht fehlersicher implementiert und liefert im Zusammenhang mit der Print-Anweisung gerne mal den Fehler 480, wenn dZahl als literaler Wert angegeben wird. Da dieser Fehler danach selbst bei Angabe korrekter Argumente nicht mehr weg zu bekommen ist, hilft in diesem Fall nur ein Neustart von Visual Basic.

87

Funktionen und Anweisungen fr Zeichenfolgen

Wird die Funktion mit einer literalen Zeichenfolge bzw. einer Konstante als Argument aufgerufen, verwandelt Visual Basic die Zeichenfolge zunchst implizit in eine Zahl vom Typ Long oder Double, um mit Str daraus wieder eine Zeichenfolge zu machen. In Systemen mit deutschem Zahlenformat (Lndereinstellungen) passiert dabei dummerweise Folgendes:
Print Str("1234,1234") Print Str(Str("1234,1234")) ' Ausgabe: 1234,1234 ' Ausgabe: 12341234

Fehler, die aus dieser Ungereimtheit heraus entstehen, sind meist recht schwer zu finden (vgl. auch Variableninitialisierung, S. 168).
Beispiel

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Beis piel

Der folgende Code geht von einem Formular mit zwei Textfeldern namens Text1 und Text2 aus und bersetzt Eingaben in die Standardnotation.
Private Sub Text1_Change() Text2 = Str(Val(Text1)) End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle

Val, Round

StrComp- Funktion
Function StrComp( _ s1 As String, _ s2 As String, _ [vgl As vbCompareMethod = vbBinaryCompare]) _ As Integer
Beschreibung

................................................... Bes c hreibung

Die Funktion StrComp unterzieht die beiden Zeichenfolgen s1 und s2 einer Vergleichsoperation und unterscheidet dabei die vier in der folgenden Tabelle aufgelisteten Flle. Hat der optionale Parameter vgl den Wert vbBinaryCompare oder fehlt er, ist die Vergleichsoperation ein zeichenweiser Unicode-Vergleich; hat vgl den Wert vbTextCompare, legt die Funktion der Vergleichsoperation die standardmige Sortierordnung der fr die auf dem System geltenden Landessprache zugrunde ohne Unterscheidung der Gro- und Kleinschreibung. Funktionswert -1 1 0 Null
Warnung

Ergebnis des Vergleichs (hngt von Vergleichsoperation ab) s1 ist kleiner als s2 s1 ist grer als s2 s1 ist gleich s2 Einer der beiden Vergleichswerte ist Null

................................................... Wa rnung

Das Standardverhalten der Funktion bei fehlendem Parameter vgl kann sich durch eine Option Compare-Anweisung ndern.

88

StrConv- Funktion

Beispiel

................................................... Beis piel

Print StrComp("Bld", "Blut") ' Ausgabe: 1 Print StrComp("Bld", "Blut", vbTextCompare) ' Ausgabe: -1 Print StrComp("BlOnD", "blond", vbTextCompare) ' Ausgabe: 0
Verwandte Befehle

................................................... Verwa ndte Befehle

Option Compare, <, > =

StrConv- Funktion
Function StrConv( _ s As String, _ KonvSchema As VbStrConv, _ [lGebietsschemaID As Long) _ As String
Beschreibung

Funktionen und Anweisungen fr Zeichenfolgen

................................................... Bes c hreibung

Die Funktion StrComp liefert eine konvertierte Variante der Zeichenfolge s. Der Wert von KonvSchema (siehe Tabelle) bestimmt, welches Konversionsschema die Funktion der Konversion zugrunde legt. Bestimmte Konversionen sind allerdings nur mglich, wenn im System ein entsprechendes Gebietsschema eingestellt oder im optionalen Parameter lGebietsschemaID spezifiziert ist. Wert fr KonvSchema vbUpperCase (1) vbLowerCase (2) vbProperCase (3) vbWide (4) vbNarrow (8) vbKatakana (16) vbHiragana (32) vbUnicode (64) vbFromUnicode (128) Verwendetes Konversionsschema Umwandlung in Groschreibung Umwandlung in Kleinschreibung Umwandlung in gemischte Gro-/Kleinschreibung, Wortanfang gro, Rest klein Umwandlung von Ein-Byte-Zeichen in Zwei-Byte-Zeichen (DBCS) Umwandlung von Zwei-Byte-Zeichen (DBCS) in Ein-Byte-Zeichen Umwandlung Hiragana-Zeichen in Katagana-Zeichen Umwandlung Katagana-Zeichen in Hiragana-Zeichen Umwandlung von systemspezifischem ANSI-Zeichensatz in Unicode unter Verwendung der Zeichenumsetzungstabelle des Systems Umwandlung von Unicode in systemspezifischen ANSI-Zeichensatz unter Verwendung der Zeichenumsetzungstabelle des Systems

Hinweis

................................................... Hinweis
Sie knnen die in der Tabelle genannten Konstanten fr KonvSchema auch kombinieren. Allerdings hngen die sinnvollen Kombinationsmglichkeiten stark vom geltenden Gebietsschema ab. Der Wert vbUnicode + vbProperCase bewirkt beispielsweise die Umwandlung einer ANSIZeichenfolge in Unicode mit gemischter Gro-/Kleinschreibung. Folgende Zeichen wertet die Funktion als Trennzeichen zwischen Wrtern: Chr(0), Chr(9), Chr(10), Chr(11), Chr(12), Chr(13), Chr(32) das gilt aber nicht fr alle Gebietsschemata.

89

Funktionen und Anweisungen fr Zeichenfolgen

Beispiel

................................................... Beis piel

LSET s = StrConv(s, vbFromUnicode) ' ANSI-String fr Ausgabe vorbereiten Print StrConv(s1, vbUnicode + vbProperCase)
Verwandte Befehle

................................................... Verwa ndte Befehle

Chr, CStr

String- Funktion

Funktionen und Anweisungen fr Zeichenfolgen

Function String(lAnz As Long, iANSI As Integer) As String Function String(lAnz As Long, sVorgabe As String) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion String gibt es in zwei unterschiedlichen Varianten. Beide Varianten liefern eine Unicode-Zeichenfolge der Lnge lAnz, die mit einem einzelnen Zeichen aufgefllt ist. Fr die erste Variante wird das Zeichen als ANSI-Code iANSI spezifiziert. Ist iANSI grer als 255, bildet die Funktion den Wert mittels einer Restwertdivision in das Intervall zwischen 0 und 255 ab. Die zweite Variante von String arbeitet mit beliebigen Unicode-Zeichen. In dieser Syntax verwendet die Funktion das erste Unicode-Zeichen der Zeichenfolge sVorgabe.
Beispiel

................................................... Beis piel

Print StrToHex(String(2, 300)) ' Ausgabe: "2C 00 2C 00" Print StrToHex(String(2, ChrW(300))) ' Ausgabe: "2C 01 2C 01"
Verwandte Befehle

................................................... Verwa ndte Befehle

LTrim, RTrim

StrReverse- Funktion
Function StrReverse(s As String) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion StrReverse liefert eine Zeichenfolge, in der alle Zeichen der Zeichenfolge s in umgekehrter Reihenfolge enthalten sind. Bei Aufruf mit einer leeren Zeichenfolge ist das Ergebnis des Funktionsaufrufs gleichfalls eine leere Zeichenfolge. Ein Aufruf der Funktion mit Null fhrt dagegen zu einem Laufzeitfehler.
Beispiel

................................................... Beis piel


' Ausgabe: "DCBA"

Print StrReverse("ABCD")

Trim- Funktion
Function Trim(s As String) As String
Beschreibung

................................................... Bes c hreibung

Die Funktion liefert eine Kopie der Zeichenfolge s zurck, die weder am Anfang noch am Ende Leerzeichen enthlt.

90

UCase- Funktion

Beispiel

................................................... Beis piel

Print RTrim(LTrim(" Test ")) = Trim(" Test ") ' Gibt "Wahr" aus
Verwandte Befehle

................................................... Verwa ndte Befehle

LTrim, RTrim

UCase- Funktion
Function UCase(s As String) As String

Funktionen und Anweisungen fr Zeichenfolgen

Beschreibung

................................................... Bes c hreibung

Die Funktion UCase liefert eine Kopie der im Parameter s bergebenen Zeichenfolge in Groschreibung zurck. Die leere Zeichenfolge Null wird wieder als Null zurckgegeben.
Beispiel

................................................... Beis piel


' Schreibweise egal

If UCase(sTest1) = UCase(sTest2) Then


Verwandte Befehle

................................................... Verwa ndte Befehle

LCase

Val- Funktion
Function Val(sZahl As String) As Double
Beschreibung

................................................... Bes c hreibung

Die Funktion Val ist die Umkehrfunktion zu Str. Sie interpretiert die Zeichenfolge sZahl als Zahl in Standardnotation (mit Dezimalpunkt, nicht mit Dezimalkomma, da die Funktion keine Lndereinstellungen bercksichtigt) und liefert den Wert dieser Zahl.
Anwendung

................................................... Anwendung

Val liefert auch einen Zahlenwert als Ergebnis, wenn sZahl mit einer Ziffernfolge beginnt und danach Zeichen folgen, die nichts mehr mit der Zahlendarstellung zu tun haben so macht Val aus 12.34 Abfahrt Hamburg HBF den Wert 12.34, aus 12,34 Abfahrt Hamburg HBF jedoch 12. Um festzustellen, ob ein Wert vollstndig als Zahl ausgewertet werden kann, steht die Boolean-Funktion IsNumeric zur Verfgung sie liefert fr beide Beispielzeichenfolgen False.
Warnung

................................................... Wa rnung

Anders als die anderen Zeichenfolgenfunktionen arbeitet Val nicht mit der lnderspezifischen Zahlendarstellung und will einen Punkt als Dezimalsymbol sehen. Dennoch ergeben sich im Zusammenspiel mit Str seltsame Effekte:
Print Print Print Print Val("10,1") Val("10.1") Str(10.1) Val(Str(10.1)) ' ' ' ' Ausgabe: Ausgabe: Ausgabe: Ausgabe: 10 10,1 "10,1" 10,1 (seltsam,nicht?)

91

Mathematische und finanzmathematische Funktionen und Anweisungen

Beispiel

................................................... Beis piel

Private Sub Text1_Change() Text2.Text = Sqr(Val(Text1.Text)) End Sub


Verwandte Befehle

................................................... Verwa ndte Befehle

LCase

Mathematische und finanzmathematische Funktionen und Anweisungen

W eekdayName- Funktion
Function WeekdayName( _ lTag As Long, _ [bAbk As Boolean = False], _ [FirstDayOfWeek As VbFirstDayOfWeek = vbUseSystemDayOfWeek]) _ As String
Beschreibung

................................................... Bes c hreibung

Die Funktion WeekdayName liefert den zur Tageszahl lTag gehrigen Wochentag als Zeichenfolge. Hat der optionale Parameter bAbk den Wert False oder fehlt er, gibt die Funktion den vollen Namen zurck, ansonsten seine Abkrzung (zwei Buchstaben). ber den optionalen Parameter FirstDayOfWeek lsst sich zudem vorgeben, mit welchem Wochentag die Zhlung beginnen soll. Fehlt er, beginnt die Zhlung mit dem im System festgelegten Tag, und das ist der Montag. Tageszahlen, die nicht zwischen 1 und 7 liegen, fhren zu einem Laufzeitfehler.
Beispiel

................................................... Beis piel


' aktueller Wochentag ausgeschrieben

Print WeekdayName(Weekday(Date))
Verwandte Befehle

................................................... Verwa ndte Befehle

MonthName

Mathematische und finanzmathematische Funktionen und Anweisungen


Wenn bei den Zeichenfolgen zuvor die Rede davon war, dass die Manipulation derselben schon immer eine der ureigensten Domnen der Programmiersprache Basic war, dann sollte das nicht etwa heien, dass die Sprache in puncto Mathematik wenig zu bieten habe. Auch fr die Formulierung mathematischer und numerischer Problematiken war die Sprache fr sich genommen immer schon recht reichhaltig ausgestattet. Insbesondere bot die weitgehend interaktive Programmentwicklung eine enorme Flexibilitt bei der Programmierung von On-the-fly-Anwendungen fr die Lsung minder komplexer Problematiken, die nicht auf das berlegene Laufzeitverhalten von Compilersprachen angewiesen waren. Als problematisch erwiesen sich allerdings die fehlenden Mittel fr eine geeignete Modularisierung und eine Anbindung an bereits bestehende mathematische Bibliotheken. Was die Modularisierbarkeit von Code betrifft, so hat sich Basic mit Visual Basic inzwischen zu einer wahrlich vorbildlichen Programmiersprache entwickelt. Die Mglichkeiten der Anbindung an bestehende mathematische Bibliotheken sind aber nach wie vor eher als lau einzustufen, da solche Bibliotheken (sofern sind nicht in Visual Basic selbst, als ActiveX-Bibliotheken

92

Mathematische und finanzmathematische Funktionen und Anweisungen

oder in C implementiert sind, und das sind Bibliotheken aus dem Bereich der Numerischen Mathematik auch heutzutage noch eher nicht, weil da immer noch FORTRAN herumgeistert) von ihrem Aufrufmodell her meist nicht kompatibel sind. Auch wenn es Visual Basic wohl nicht mehr zur lingua franca der numerischen Mathematik bringen wird, ihre mathematische und auch finanzmathematische Grundausstattung ist reichhaltig genug fr die meisten Fragestellungen im naturwissenschaftlichen, wirtschaftlichen und informationstechnologischen Bereich, und es spricht inzwischen absolut nichts mehr gegen die Entwicklung eigener mathematischer Bibliotheken als solide Basis fr knftige Projekte. Bei einer solchen Bibliothek kann es sich um eine Klassenbibliothek fr abstrakte Datentypen handeln, so etwa fr die Vektor- und Matrizenrechnung, oder um ein gewhnliches Bibliotheksmodul, das spezifische Funktionen und Prozeduren etwa fr den Bereich Statistik bereitstellt. Nichtsdestoweniger bleibt jede eigene Implementation von Datentypen und Operationen auf das mathematische Inventar der Sprache selbst angewiesen. Die folgende Tabelle gibt einen berblick ber die mathematischen und finanzmathematischen Funktionen und Anweisungen von Visual Basic. Bezeichner Abs Atn Cos DDB Exp Fix FV Int IPmt IRR Log MIRR NPer NPV Pmt PPmt Kurzbeschreibung Liefert den Absolutwert (vorzeichenlosen Wert) einer Zahl Liefert den Arcustangens einer Zahl als Winkel im Bogenma Liefert den Cosinus zu einem Winkel im Bogenma Liefert den Abschreibungswert eines Vermgenswerts ber einen bestimmten Zeitraum bei geometrisch degressiver Abschreibung Liefert den Wert der Exponentialfunktion (mit Basis e) zu einer Zahl Liefert den Vorkommaanteil einer Dezimalzahl als Ganzzahl Liefert den knftigen Wert einer Annuitt (Ansparung oder Kredit) bei konstanter Zahlung, konstantem Zins und fester Laufzeit Liefert den nchsten ganzzahligen Wert kleiner oder gleich einer Zahl Liefert den Zinsanteil fr eine bestimmte Periode bei Abzahlung oder Ansparung mit konstanten Raten und konstantem Zinssatz Liefert den internen Ertragssatz fr eine Folge regelmiger Ein- und Auszahlungen Liefert den natrlichen Logarithmus einer Zahl Liefert den modifizierten internen Ertragssatz fr eine Folge regelmiger, mit unterschiedlichen Zinsstzen behafteten Ein- und Auszahlungen Liefert die Anzahl der Zeitrume fr eine Annuitt (Ansparung oder Kredit) bei konstanter Zahlung und konstantem Zins Liefert den Nettobarwert einer Investition bei regelmigen Aus- und Einzahlungen und konstantem Diskontsatz Liefert den Auszahlungswert (Hhe der Rate bei Kredit) fr eine Annuitt mit einer festen Anzahl von Zeitrumen, konstanter Zahlung und konstantem Zins Liefert den Kapitalanteil (bei Kredit: Tilgung) eines bestimmten Zeitraums fr eine Annuitt (Ansparung oder Kredit) mit einer festen Anzahl von Zeitrumen, konstanter Zahlung und konstantem Zins

Mathematische und finanzmathematische Funktionen und Anweisungen

Mathematische und finanzmathematische Funktionen und Anweisungen

93

Mathematische und finanzmathematische Funktionen und Anweisungen

Bezeichner PV Randomize Rate Rnd

Kurzbeschreibung Liefert den Barwert fr eine Annuitt (Ansparung oder Kredit) bei konstanter Zahlung, konstantem Zins und fester Laufzeit Initialisiert den Zufallsgenerator mit einem Startwert Liefert den Zinssatz zu einer Annuitt (Anzahlung oder Kredit) mit einer festen Anzahl von Zeitrumen, konstanter Zahlung und konstantem Zins Liefert eine gleich verteilte Zufallszahl zwischen 0 und 1 Liefert den Wert einer Zahl auf eine bestimmte Dezimalstelle gerundet Liefert das Vorzeichen eines Werts als Faktor (-1, 0 oder 1) Liefert den Sinus zu einem Winkel im Bogenma Liefert den periodischen Abschreibungswert eines Vermgenswerts bei linearer Abschreibung ber einen bestimmten Zeitraum Liefert die Quadratwurzel eines positiven Zahlenwerts Liefert den Abschreibungswert eines Vermgenswerts fr eine bestimmte Periode nach dem Modell der Jahressummengewichtung Liefert den Tangens zu einem Winkel im Bogenma

Mathematische und finanzmathematische Funktionen und Anweisungen

Round Sgn Sin SLN Sqr SYD Tan

Mathematische und finanzmathematische Funktionen und Anweisungen


Warnung

................................................... Wa rnung

Die mit Visual Basic 6 (SP3) vorliegende Implementation der finanzmathematischen Funktionen ist alles andere als fehlersicher. So erhlt man in nicht klar zu bestimmenden Situationen oder bei Angabe falscher Parameterwerte gerne mal den lstigen Laufzeitfehler 480, Anwendungsoder objektdefinierter Fehler, den man im Lauf der aktuellen Visual-Basic-Sitzung nicht mehr los wird selbst bei Angabe korrekter Parameterwerte. In diesem Fall hilft nur noch ein Neustart von Visual Basic.
Tipp

................................................... Tipp

Aufgrund der internen Darstellung gewhnlicher Zahlenwerte im hexadezimalen Format kommt es bei verschiedenen Funktionen zu Rundungsfehlern, die gerade im finanzmathematischen Bereich, aber auch anderswo fr peinliche Fehler (so genannte Pfennigfuchser-Fehler) im Bereich der letzten Nachkommastelle sorgen knnen. Sie vermeiden solche Fehler, indem Sie fr Whrungsbetrge konsequent den Datentyp Currency und fr dezimale Berechnungen mit nachfolgenden Rundungsoperationen den Datentyp Decimal einsetzen. Gegebenenfalls erforderliche Typumwandlungen nimmt Visual Basic dann implizit vor.

Abs- Funktion
Function Abs(dZahl As Double) As Double
Beschreibung

................................................... Bes c hreibung

Die Funktion Abs liefert den Absolutwert zu der Zahl dZahl, das heit den Zahlenwert mit positivem Vorzeichen.

94

Atn- Funktion

Beispiel

................................................... Beis piel

DeltaX = Abs(MouseX X) DeltaY = Abs(MouseY Y)


Verwandte Befehle

................................................... Verwa ndte Befehle

Sgn

Atn- Funktion
Function Atn(d As Double) As Double
Beschreibung

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Bes c hreibung

Die zu den trigonometrischen Umkehrfunktionen zhlende Arcustangensfunktion Atn ist die Umkehrfunktion der Tangensfunktion (Tan). Sie liefert den Arcustangens zu der Zahl d als Winkel im Bogenma. Das Ergebnis der Funktion liegt immer im offenen Intervall ]-/2; /2[. Fr die Umwandlung in Grad ist der Wert mit 180/ = 57,2957795130823 zu multiplizieren.
Anwendung

................................................... Anwendung

Diese Funktion berechnet den Winkel zwischen Hypothenuse und Ankathete eines rechtwinkligen Dreiecks, wenn deren Lngen bekannt sind, bzw. den zu einem Tangenswert (Steigung) gehrigen Winkel.
Tipp

................................................... Tipp

Da Visual Basic die Zahl nicht als Konstante kennt, muss ein anderer Weg gefunden werden, an ihren Wert zu kommen. Ein sehr eleganter Weg ist die Berechnung des Werts ber die Funktion Atn.
Dim Pi As Double Pi = Atn(1) * 4
Beispiel

' 3.14159265358979

................................................... Beis piel


' Ausgabe: 0,785398163397448

Print Atn(1)
Verwandte Befehle

................................................... Verwa ndte Befehle

Cos, Sin, Tan

Cos- Funktion
Function Cos(dWinkel As Double) As Double
Beschreibung

................................................... Bes c hreibung

Die zu den trigonometrischen Funktionen zhlende Cosinusfunktion Cos liefert den Cosinus zu dem im Bogenma angegebenen Winkel dWinkel. Das Ergebnis der Funktion liegt immer im Intervall [-1; 1]. Fr die Umwandlung eines Gradwerts in das Bogenma ist der Wert mit /180 = 1,74532925199433E-02 zu multiplizieren.
Anwendung

................................................... Anwendung

Diese Funktion berechnet aus dem Winkel zwischen Ankathete und Hypothenuse die Ankathete eines rechtwinkligen Dreiecks mit Hypothenuse 1.

95

Mathematische und finanzmathematische Funktionen und Anweisungen

Beispiel

................................................... Beis piel


' 3.14159265358979 ' Ausgabe: 0,5

Dim Pi As Double Pi = Atn(1) * 4 Print Cos(Pi / 3)


Verwandte Befehle

................................................... Verwa ndte Befehle

Atn, Sin, Tan

Mathematische und finanzmathematische Funktionen und Anweisungen

DDB- Funktion
Function DDB( _ dKosten As Double, _ dRestwert As Double, _ dNutzungsDauer As Double, _ dPeriode As Double, _ [vFaktor As Variant = 2]) _ As Double
Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion DDB ermglicht die Berechnung der Abschreibung einer Investition dKosten mit dem Restwert dRestwert nach der angenommenen Nutzungsdauer dNutzungsDauer fr eine bestimmte Periode dPeriode. Fehlt der optionale Parameter vFaktor oder hat er den Wert 2, berechnet die Funktion den Abschreibungswert nach der geometrisch degressiven Methode, ansonsten mit der gleichen Formel, jedoch mit vFaktor als Degressionsfaktor.
Anwendung

................................................... Anwendung

dNutzungsDauer und dPeriode muss die gleiche Einheit (Monate oder Jahre) zugrunde liegen. Diese Funktion bercksichtigt den Parameter dRestwert nur insofern, als sie 0 zurckliefert, wenn der Restwert fr eine Periode bereits erreicht ist. Mit anderen Worten, die Funktion rechnet nicht mit der blichen Formel ( Wert(Periode) Restwert ) Faktor DDB = ----------------------------------------------------------------------------------------------Nutzungszeit sondern nach der schlichteren Formel Wert(Periode) Faktor DDB = -----------------------------------------------------------Nutzungszeit Das kann zwar verwirren, gestattet aber einen Test, nach wie vielen Perioden eine Investition einen bestimmten Restwert erreicht hat.
Beispiel

................................................... Beis piel

Das folgende Codefragment zeigt, wie sich ein Wert von 10.000 bei Abschreibung nach der geometrisch degressiven Methode und einer Laufzeit von 10 Jahren entwickelt:
Laufzeit = 10 AnschaffungsWert = 10000 RestWert = 2000 For Per = 1 to Laufzeit 1 Print DDB(AnschaffungsWert, RestWert, Laufzeit, Per) Next

96

Exp- Funktion

Verwandte Befehle

................................................... Verwa ndte Befehle

SLN, SYD

Exp- Funktion
Function Exp(dZahl As Double) As Double
Beschreibung

................................................... Bes c hreibung

Die Wachstumsfunktion Exp ist die Umkehrfunktion zur natrlichen Logarithmusfunktion Log. Sie liefert den Wert der Eulerschen Konstante (2,71828182845905) hoch dZahl.
Beispiel

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Beis piel


' Ausgabe: 2,71828182845905 ' Ausgabe: 10

Print Exp(1) Print Exp(Log(10))


Verwandte Befehle

................................................... Verwa ndte Befehle

Log

Fix- Funktion
Function Fix(dZahl As NumTyp) As NumTyp
Beschreibung

................................................... Bes c hreibung

Die Rundungsfunktion Fix liefert den Ganzzahlanteil von dZahl, indem sie alle Nachkommastellen abschneidet. Sie weist damit die gleiche Funktionalitt wie CInt auf. Im Gegensatz zu CInt richtet die Funktion den Datentyp des Rckgabewerts aber nach dem Datentyp des Parameters.
Warnung

................................................... Wa rnung

Wie das Beispiel zeigt, ist die Dezimalrechnung mit den Datentypen Single und Double nicht immer exakt. Das liegt daran, dass die Reprsentation dieser Werte intern im hexadezimalen bzw. echten binren Zahlenformat erfolgt und viele endliche Dezimalbrche im binren Zahlensystem nur als unendliche Binrbrche darstellbar sind. Wenn Sie Exaktheit bentigen, mssen Sie mit einem der Datentypen Currency oder Decimal rechnen!
Beispiel

................................................... Beis piel


' Ausgabe: 27 ' Ausgabe: 3,00000000000011E-03

a = 27.003 Print Fix(a) Print (a Fix(a)) Dim b As Variant b = CDec(a) Print Fix(b) Print (b Fix(b))
Verwandte Befehle

' Ausgabe: 27 ' Ausgabe: 0,003

................................................... Verwa ndte Befehle

CInt, Int, Round

97

Mathematische und finanzmathematische Funktionen und Anweisungen

FV- Funktion
Function FV( _ dZins As Double, _ dLaufzeit As Double, _ dRate As Double, _ [vJetztWert], _ [vTermin]) _ As Double
Beschreibung

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion FV liefert den zuknftigen Wert einer Annuitt mit einer Laufzeit von dLaufzeit Zahlungsperioden, konstantem Zins dZins und der Rate dRate. Der optionale Parameter vJetztWert ermglicht die Angabe eines Ausgangswerts bei bereits erfolgter Ansparung. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt.
Anwendung

................................................... Anwendung

Beachten Sie, dass die Werte fr die Parameter dZins und dLaufzeit auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Funktion lsst sich sowohl zur Berechnung von Krediten als auch von Ansparungen verwenden, wird aber vorzugsweise fr die Kreditberechnung eingesetzt, da der zuknftige Wert bei Ansparungen meist einen Ausgangswert darstellt. Bei der Kreditberechnung sind dRate und dJetztWert als negative Werte anzugeben, bei der Ansparberechnung als positive Werte.
Tipp

................................................... Tipp

Die Funktionen PV und FV liefern mit vertauschten Vorzeichen fr dRate und dJetztWert die gleichen Ergebnisse.
Beispiel

................................................... Beis piel

Das folgende Codefragment zeigt, wie sich eine Ansparung mit einer monatlichen Rate von 100 und einem Zinssatz von 10% p.a. mit und ohne eine Starteinlage von 10.000 ber zehn Jahre hin entwickelt:
Laufzeit = 10 * 12 MonatsRate = 100 Zins = 0.1 / 12 Starteinlage = 10000 Print FV(Zins, Monatsrate, Laufzeit) ' -18619,84 Print FV(Zins, Monatsrate, Laufzeit, Starteinlage) ' -41550,28

Das gleiche als Kredit:


Laufzeit = 10 * 12 MonatsRate = -100 Zins = 0.1 / 12 Starteinlage = -10000

98

Int- Funktion

Print FV(Zins, Monatsrate, Laufzeit) Print FV(Zins, Monatsrate, Laufzeit, Starteinlage)


Verwandte Befehle

' 8120,14 ' 12481,15

................................................... Verwa ndte Befehle

IPmt, IRR, NPer, NPV, Pmt, PPmt, PV

Int- Funktion
Function Int(dZahl As NumTyp) As NumTyp
Beschreibung

................................................... Bes c hreibung

Mathematische und finanzmathematische Funktionen und Anweisungen

Die Rundungsfunktion Int liefert die nchste Ganzzahl kleiner gleich dZahl. Im Gegensatz zu Fix schneidet die Funktion nicht nur die Nachkommastellen ab, sondern rundet echt. Die Funktion richtet den Datentyp des Rckgabewerts nach dem Datentyp des Parameters.
Warnung

................................................... Wa rnung

Wie das Beispiel zeigt, ist die Dezimalrechnung mit den Datentypen Single und Double nicht immer exakt. Das liegt daran, dass die Reprsentation dieser Werte intern im hexadezimalen bzw. echten binren Zahlenformat erfolgt und viele endliche Dezimalbrche im binren Zahlensystem nur als unendliche Binrbrche darstellbar sind. Wenn Sie Exaktheit bentigen, mssen Sie mit einem der Datentypen Currency oder Decimal rechnen.
Beispiel

................................................... Beis piel


' Ausgabe: -28 ' Ausgabe: 0,998000000000001

a = -27.002 Print Int(a) Print (a Int(a)) Dim b As Variant b = CDec(a) Print Int(b) Print (b Int(b))
Verwandte Befehle

' Ausgabe: -28 ' Ausgabe: 0,998

................................................... Verwa ndte Befehle

CInt, Fix, Round

IPmt- Funktion
Function IPmt( _ dZins As Double, _ dPeriode As Double, _ dLaufzeit As Double, _ dBarwert As Double, _ [vZuknftigerWert], _ [vTermin]) _ As Double
Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion IPmt (engl.: Interest Payment) liefert den Zinsanteil in der Periode dPeriode zu einer Annuitt mit einer Laufzeit von dLaufzeit Zahlungsperioden, konstantem Zins dZins und dem Barwert dBarwert (vgl. PV-Funktion,

99

Mathematische und finanzmathematische Funktionen und Anweisungen

S. 106). Der optionale Parameter vZuknftigerWert (vgl. FV-Funktion, S. 98) ermglicht die Angabe eines zuknftigen Werts, der den nach der letzten Zahlung erreichten Kontostand angibt. Bei einem Kredit ist dieser Wert im Allgemeinen mit 0 anzugeben, was dem Vorgabewert fr den Parameter entspricht. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt.
Anwendung

................................................... Anwendung

Mathematische und finanzmathematische Funktionen und Anweisungen

Beachten Sie, dass die Werte fr die Parameter dZins, dPeriode und dLaufzeit auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Funktion wird im Allgemeinen zur Berechnung von Krediten verwendet. Fr die Kreditberechnung setzen Sie dBarwert auf die Hhe des Kredits (Zahlungsausgang) und vZuknftigerWert auf 0 (Kredit abbezahlt).
Tipp

................................................... Tipp

Die Funktion PPmt liefert den Tilgungs- bzw. Kapitalanteil. Die Summe aus Tilgungs- bzw. Kapitalanteil und Zins entspricht der von der Funktion Pmt gelieferten Rate.
Beispiel

................................................... Beis piel

Das Projekt ZinsAnteil zeigt, wie sich Zins und Tilgung prozentual fr einen Kredit beliebiger Hhe bei einem Zinssatz von 10% p.a. ber zehn Jahre hin entwickeln.
' Projekt: Annuitt-Zinsanteil Const Laufzeit = 10 * 12 Const Zins = 0.1 / 12 Const mRate = 100

' 100 Prozent(!)

Private Sub Form_Load() AutoRedraw = True BarWert = PV(Zins, Laufzeit, mRate) ' Barwert in Prozent (!) ' Kreditmodalitten Print "Laufzeit", Laufzeit; "Monate" Print "Zins p.a.", Zins * 12 * 100; "%" Print "Periode", "Zinsanteil (%)", "Tilgungsanteil (%)" Print String(40, "=") ' prozentualen Zins- und Tilgungsanteil ausgeben. For i = 1 To Laufzeit Step 12 Print i, Round(IPmt(Zins, i, Laufzeit, BarWert), 2), Print Round(PPmt(Zins, i, Laufzeit, BarWert), 2) Next i End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle

FV, NPer, NPV, Pmt, PPmt, PV

IRR- Funktion
Function IRR(dWerte() As Double[, vErwartet As Variant = 0.1)] As Double

1 00

Log- Funktion

Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion IRR (engl.: Internal Rate of Return) liefert den internen Ertragssatz fr eine via dWerte() spezifizierte Folge regelmiger Ein- und Auszahlungen (Cash Flows). Fehlt der optionale Parameter vErwartet, rechnet die Funktion mit dem Erwartungswert 0,1, ansonsten mit dem angegebenen Wert.
Anwendung

................................................... Anwendung

Der interne Ertragssatz ist der Zinssatz fr eine Investition, die aus Ein- und Auszahlungen in regelmigen Abstnden besteht, wobei sich aber das Verhltnis zwischen Ein- und Auszahlungen mit der Zeit verschieben kann (wie bei einem neuen Unternehmen blich, das zu Beginn groe Investitionen ttigt und seine Einnahmen erst mit der Zeit verbessert, bis der Break-even berschritten ist). Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Elemente des Arrays dWerte enthalten die Werte der Cash Flows. Dabei ist die Reihenfolge eine wichtige Gre. IRR wird iterativ berechnet. IRR verwendet vErwartet als Startwert und wiederholt die Berechnung so lange, bis das Ergebnis auf 0,00001 Prozent genau ist. Wenn nach 20 Versuchen kein Ergebnis gefunden werden kann (im Allgemeinen, weil vErwartet zu schlecht ist), generiert IRR den Laufzeitfehler 5.
Beispiel

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Beis piel

Das folgende Codefragment zeigt beispielhaft, wie die Analyse eines Unternehmens aussehen kann:
Dim dWerte(9) As Double dWerte(0) = -50000 dWerte(1) = -25000 dWerte(2) = 0 dWerte(3) = 5000 dWerte(4) = -1000 dWerte(5) = 7000 dWerte(6) = 21000 dWerte(7) = 45000 dWerte(8) = 60000 dWerte(9) = 110000 Print Round(IRR(dWerte) * 100, 2)
Verwandte Befehle

' ' ' ' ' ' ' ' ' ' '

Investition bei Grndung Unternehmensaufbau Break Even Erster Gewinn im vierten Jahr Verlust wg. schwacher Konjunktur Gewinn im sechsten Jahr Gewinn im siebten Jahr Gewinn im achten Jahr Gewinn im neunten Jahr Gewinn im zehnten Jahr 17,32 Prozent

................................................... Verwa ndte Befehle

MIRR, Rate

Log- Funktion
Function Log(dZahl As Double) As Double
Beschreibung

................................................... Bes c hreibung

Die natrliche Logarithmusfunktion Log ist die Umkehrfunktion zur Wachstumsfunktion Exp. Sie liefert den Wert, mit dem man die Eulersche Konstante (2,71828182845905) potenzieren muss, um dZahl zu erhalten.

1 01

Mathematische und finanzmathematische Funktionen und Anweisungen

Beispiel

................................................... Beis piel


' Ausgabe: 1 ' Ausgabe: 10

Print Log(2.71828182845905) Print Exp(Log(10))


Verwandte Befehle

................................................... Verwa ndte Befehle

Exp

MIRR- Funktion

Mathematische und finanzmathematische Funktionen und Anweisungen

Function MIRR( _ dWerte() As Double, _ dZinsFinanz As Double, _ dZinsReinv As Double) _ As Double


Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion MIRR (engl.: Modified Internal Rate of Return) liefert den modifizierten internen Ertragssatz fr eine via dWerte() spezifizierte Folge regelmiger Ein- und Auszahlungen (Cash Flows). Im Gegensatz zu IRR rechnet MIRR mit unterschiedlichen Zinsstzen fr die Finanzierung ungedeckter Ausgaben (dZinsFinanz) und die Reinvestition von Gewinnen (dZinsReinv).
Anwendung

................................................... Anwendung

Die beiden Zinswerte, dZinsFinanz und dZinsReinv, sind als Faktoren (Prozentwert dividiert durch 100) anzugeben.
Beispiel

................................................... Beis piel

Das folgende Codefragment zeigt beispielhaft, wie die Analyse eines Unternehmens aussehen kann, wenn fr Investitionen ein Zins von 10% und fr Reinvestitionen der interne Ertragssatz des Unternehmens angesetzt wird:
Dim dWerte(9) As Double dWerte(0) = -50000 ' Investition bei Grndung dWerte(1) = -25000 ' Unternehmensaufbau dWerte(2) = 0 ' Break Even dWerte(3) = 5000 ' Erster Gewinn im vierten Jahr dWerte(4) = -1000 ' Verlust wg. schwacher Konjunktur dWerte(5) = 7000 ' Gewinn im sechsten Jahr dWerte(6) = 21000 ' Gewinn im siebten Jahr dWerte(7) = 45000 ' Gewinn im achten Jahr dWerte(8) = 60000 ' Gewinn im neunten Jahr dWerte(9) = 110000 ' Gewinn im zehnten Jahr Print Round(IRR(dWerte) * 100, 2) ' 17,32 Prozent Print Round(MIRR(dWerte, 0.1, IRR(dWerte)) * 100, 2) ' 17,04 Prozent
Verwandte Befehle

................................................... Verwa ndte Befehle

IRR, Rate

1 02

NPer- Funktion

NPer- Funktion
Function NPer( _ dZins As Double, _ dRate As Double, _ dBarwert As Double, _ [vZuknftigerWert], _ [vTermin]) _ As Double
Beschreibung

................................................... Bes c hreibung

Mathematische und finanzmathematische Funktionen und Anweisungen

Die zu den finanzmathematischen Funktionen zhlende Funktion NPer (engl.: Number of Periods) liefert die Laufzeit (Anzahl der Zahlungsperioden) einer Annuitt mit konstantem Zins dZins und dem Barwert dBarwert (vgl. die Funktion PV-Funktion S. 106). Der optionale Parameter vZuknftigerWert (vgl. FV-Funktion, S. 98) ermglicht die Angabe eines zuknftigen Werts, der den nach der letzten Zahlung erreichten Kontostand angibt. Bei einem Kredit ist dieser Wert im Allgemeinen mit 0 anzugeben, was dem Vorgabewert fr den Parameter entspricht. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt.
Anwendung

................................................... Anwendung

Beachten Sie, dass die Werte fr die Parameter dZins, dRate auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen, wie der von der Funktionen erwartete Wert. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Wird die Funktion zur Berechnung eines Kredits eingesetzt, ist fr dBarwert die Kredithhe als negativer Wert zu spezifizieren. Wird die Funktion zur Berechnung einer Ansparung eingesetzt, ist fr dBarwert der augenblickliche Wert der Ansparung als positiver Wert anzugeben und fr vZuknftigerWert das Sparziel als negativer Wert.
Beispiel

................................................... Beis piel

Das folgende Codefragment berechnet die Laufzeit fr einen Kredit ber 7.000 zu 10% p.a. sowie die Laufzeit einer Ansparung zu denselben Bedingungen:
Print NPer(0.1 / 12, 100, -7000) Print NPer(0.1 / 12, 100, 0, -7000) ' Laufzeit f. Kredit: 106 ' Laufzeit f. Ansparung: 55

Auf dieselben Ergebnisse kommt man auch mittels:


Print -NPer(0.1 / 12, 100, 0, 7000) Print -NPer(0.1 / 12, 100, 7000)
Warnung

' Laufzeit f. Kredit: 106 ' Laufzeit f. Ansparung: 55

................................................... Wa rnung

Die Funktion liefert einen Laufzeitfehler, wenn die Kreditlaufzeit bei gegebenem Zins und gegebener Rate ber alle Grenzen wachsen wrde, sprich: die Rate zu klein ist, als dass jemals eine Tilgung erfolgen knnte. (Solche Kredite wrden Banken natrlich am liebsten geben: Man zahlt ein Leben lang, und die Schulden werden immer grer.)
Print NPer(0.1 / 12, 100, -20000) ' Laufzeitfehler

1 03

Mathematische und finanzmathematische Funktionen und Anweisungen

Verwandte Befehle

................................................... Verwa ndte Befehle

FV, IPmt, NPV, Pmt, PPmt, PV

NPV- Funktion
Function NPV(dDiskontsatz As Double Werte() As Double) As Double
Beschreibung

................................................... Bes c hreibung

Mathematische und finanzmathematische Funktionen und Anweisungen

Die zu den finanzmathematischen Funktionen zhlende Funktion NPV (engl.: Net Present Value) liefert den Nettobarwert einer Investition fr eine via dWerte() spezifizierte Folge regelmiger Ein- und Auszahlungen (Cash Flows) bei festem Diskontsatz dDiskontsatz.
Anwendung

................................................... Anwendung

Der Nettobarwert einer Investition ist der aktuelle Wert einer Folge zuknftiger regelmiger Aus- und Einzahlungen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Elemente des Arrays dWerte enthalten die Werte der erwarteten Cash Flows. Dabei ist die Reihenfolge eine wichtige Gre. Die Investition beginnt mit dem Zeitraum des ersten CashFlow-Werts und endet mit dem Auftreten des letzten Cash-Flow-Werts. Im Gegensatz zur Funktion PV, die den Barwert einer Folge von Zahlungen unvernderlicher Hhe bei konstantem Zins und konstanter Laufzeit berechnet, erlaubt NPV Zahlungen unterschiedlicher Hhe (und Vorzeichen) und ermittelt die Laufzeit selbststndig aus der Anzahl der Werte. Die Funktion geht davon aus, dass die Zahlungen jeweils zum Ende der Zahlungsperioden erfolgen. Bezieht sich der erste Cash Flow auf den Beginn des ersten Zeitraums, so muss die Folge mit der zweiten Zahlung beginnen und die erste Zahlung gesondert zum Ergebnis von NPV addiert werden.
Beispiel

................................................... Beis piel

Das folgende Codefragment zeigt beispielhaft, wie die NPV-Analyse fr ein Unternehmen aussehen kann:
Dim dWerte(9) As Double dWerte(0) = -50000 dWerte(1) = -25000 dWerte(2) = 0 dWerte(3) = 5000 dWerte(4) = -1000 dWerte(5) = 7000 dWerte(6) = 21000 dWerte(7) = 45000 dWerte(8) = 60000 dWerte(9) = 110000 Print NPV(0.1, dWerte)
Verwandte Befehle

' ' ' ' ' ' ' ' ' ' '

Investition bei Grndung Unternehmensaufbau Break Even Erster Gewinn im vierten Jahr Verlust wg. schwacher Konjunktur Gewinn im sechsten Jahr Gewinn im siebten Jahr Gewinn im achten Jahr Gewinn im neunten Jahr Gewinn im zehnten Jahr 40254

................................................... Verwa ndte Befehle

MIRR, Rate

1 04

Pmt- Funktion

Pmt- Funktion
Function Pmt( _ dZins As Double, _ dLaufzeit As Double, _ dBarwert As Double, _ [vZuknftigerWert], _ [vTermin]) _ As Double
Beschreibung

................................................... Bes c hreibung

Mathematische und finanzmathematische Funktionen und Anweisungen

Die zu den finanzmathematischen Funktionen zhlende Funktion Pmt (engl.: Payment) liefert die zu zahlende Rate zu einer Annuitt mit einer Laufzeit von dLaufzeit Zahlungsperioden, konstantem Zins dZins und dem Barwert dBarwert (vgl. die Funktion PV-Funktion, S. 106). Der optionale Parameter vZuknftigerWert (vgl. die Funktion FV-Funktion, S. 98) ermglicht die Angabe eines zuknftigen Werts, der den nach der letzten Zahlung erreichten Kontostand angibt. Bei einem Kredit ist dieser Wert im Allgemeinen mit 0 anzugeben, was dem Vorgabewert fr den Parameter entspricht. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt.
Anwendung

................................................... Anwendung

Beachten Sie, dass die Werte fr die Parameter dZins und dLaufzeit auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Fr die Kreditberechnung setzen Sie dBarwert auf die Hhe des Kredits (Zahlungsausgang) und vZuknftigerWert auf 0 (Kredit abbezahlt).
Tipp

................................................... Tipp

Die Funktionen IPmt und PPmt liefern den Zinsanteil und den Kapitalanteil zu einer bestimmten Periode. Die Summe aus Kapitalanteil und Zinsanteil entspricht der von Pmt gelieferten Rate.
Beispiel

................................................... Beis piel

Sie wollen einen Kredit ber 250.000 mit einer Laufzeit von 20 Jahren und einem festen Zinssatz von 8,3% aufnehmen. Die monatliche Rate berechnet sich dann zu:
Print Pmt(.083 / 12, 20 * 12, -250000) ' Ausgabe: 2138

Die gleichen 250.000 im Rahmen einer Lebensversicherung mit 4,6% Kapitalverzinsung angespart, ergibt eine monatliche Rate von:
Print Pmt(.046 / 12, 20 * 12, 0, -250000) ' Ausgabe: 636,82

Man sieht, Geben ist eben doch billiger denn Nehmen.


Verwandte Befehle

................................................... Verwa ndte Befehle

FV, IPmt, NPer, NPV, PPmt, PV

1 05

Mathematische und finanzmathematische Funktionen und Anweisungen

PPmt- Funktion
Function PPmt( _ dZins As Double, _ dPeriode As Double, _ dLaufzeit As Double, _ dBarwert As Double, _ [vZuknftigerWert], _ [vTermin]) _ As Double

Mathematische und finanzmathematische Funktionen und Anweisungen

Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion PPmt (engl.: Principal Payment) liefert den Kapitalanteil in der Periode dPeriode zu einer Annuitt mit einer Laufzeit von dLaufzeit Zahlungsperioden, konstantem Zins dZins und dem Barwert dBarwert (vgl. PVFunktion, S. 106). Der optionale Parameter vZuknftigerWert (vgl. FV-Funktion, S. 98) ermglicht die Angabe eines zuknftigen Werts, der den nach der letzten Zahlung erreichten Kontostand angibt. Bei einem Kredit ist dieser Wert im Allgemeinen mit 0 anzugeben, was dem Vorgabewert fr den Parameter entspricht. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt.
Anwendung

................................................... Anwendung

Beachten Sie, dass die Werte fr die Parameter dZins, dPeriode und dLaufzeit auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Funktion wird im Allgemeinen zur Berechnung von Krediten eingesetzt und liefert dann den Tilgungsanteil zu einer bestimmten Periode. Fr die Kreditberechnung setzen Sie dBarwert auf die Hhe des Kredits (Zahlungsausgang) und vZuknftigerWert auf 0 (Kredit abbezahlt).
Tipp

................................................... Tipp

Die Funktion IPmt liefert den Zinsanteil. Die Summe aus Tilgungs- bzw. Kapitalanteil und Zins entspricht der von der Funktion Pmt gelieferten Rate.
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle

Vgl. das Beispiel in IPmt-Funktion (S. 99).


Verwandte Befehle

FV, IPmt, NPer, NPV, Pmt, PV

PV- Funktion
Function PV( _ dZins As Double, _ dLaufzeit As Double, _ dRate As Double, _ [vJetztWert], _ [vTermin]) _ As Double

1 06

Randomize- Anw eisung

Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion PV (engl.: Payment Value) liefert den Barwert einer Annuitt mit einer Laufzeit von dLaufzeit Zahlungsperioden, konstantem Zins dZins und der Rate dRate. Der optionale Parameter vJetztWert ermglicht die Angabe eines Ausgangswerts bei bereits erfolgter Ansparung. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt.
Anwendung

................................................... Anwendung

Mathematische und finanzmathematische Funktionen und Anweisungen

Beachten Sie, dass die Werte fr die Parameter dZins und dLaufzeit auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Funktion lsst sich sowohl zur Berechnung von Krediten als auch von Ansparungen verwenden, wird aber vorzugsweise fr die Ansparberechnung eingesetzt, da der Barwert bei Krediten blicherweise einen Ausgangswert darstellt. Bei der Kreditberechnung sind dRate und dJetztWert als positive Werte anzugeben, bei der Ansparberechnung als negative Werte.
Tipp

................................................... Tipp

Die Funktionen PV und FV liefern mit vertauschten Vorzeichen fr dRate und dJetztWert die gleichen Ergebnisse.
Beispiel

................................................... Beis piel

Das folgende Codefragment ermittelt den Barwert einer auf 100.000 abgeschlossenen Lebensversicherung mit einer Laufzeit von 35 Jahren und einem Zinssatz von 4,45%:
Zins = 0.045/12 Laufzeit = 35 * 12 Ansparung = -100000 Raten = Pmt(Zins, Laufzeit, 0, Ansparung) Barwert = PV(Zins, Laufzeit, Raten) ZukWert = FV(Zins, Laufzeit, Raten)
Verwandte Befehle

' 99,33 ' 21126,98 ' 100000 Probe stimmt!

................................................... Verwa ndte Befehle

FV, IPmt, IRR, NPer, NPV, Pmt, PPmt

Randomize- Anweisung
Sub Randomize ([vSeed])
Beschreibung

................................................... Bes c hreibung

Die Anweisung Randomize initialisiert den Zufallsgenerator mit einem Startwert (engl.: Seed). Ausgehend von diesem Startwert lsst sich mittels der Zufallsfunktion Rnd eine gleich verteilte Sequenz von Zufallszahlen berechnen. Zu einem bestimmten Startwert liefert der Zufallsfunktion Rnd immer die gleiche Folge. Dabei benutzt sie jeweils den zuletzt gelieferten Wert als neuen Startwert. Fehlt vSeed, nimmt die Anweisung den von der Funktion Timer gelieferten Wert als Startwert.

1 07

Mathematische und finanzmathematische Funktionen und Anweisungen

Anwendung

................................................... Anwendung

Eine wirklich zufllige Initialisierung des Zufallsgenerators lsst sich erreichen, indem man den Wert der Funktion Timer als Startwert benutzt, der die Anzahl der seit Mitternacht (Systemzeit) vergangenen Sekunden liefert. Wird Randomize in einem Programm dagegen gar nicht ausgefhrt, arbeitet Visual Basic mit dem Vorgabewert 0 als Startwert. Um im gleichen Programmlauf mehrere Folgen von Zufallszahlen mit deterministischem Startwert zu erzeugen, bergeben Sie der Funktion Rnd jeweils bei Berechnung des letzten Folgenelements einen negativen Wert und rufen danach Randomize mit dem Startwert der nchsten Folge auf.

Mathematische und finanzmathematische Funktionen und Anweisungen

Beispiel

................................................... Beis piel

Der Startwert 10 sorgt dafr, dass Rnd reproduzierbar die folgende Zufallsfolge {0,5749933; 0,2375866; 0,5295308; 0,2520258} generiert:
Randomize 10 Print Rnd(1), Rnd(1), Rnd(1), Rnd(1) Rnd(-1) Randomize Timer Print Rnd(1), Rnd(1), Rnd(1), Rnd(1)
Verwandte Befehle

' Folge fr Startwert 10 ' Randomize vorbereiten ' wirklich zufllige Folge

................................................... Verwa ndte Befehle

Rnd

Rate- Funktion
Function Rate( _ dLaufzeit As Double, _ dRate As Double, _ dBarWert As Double, _ [vZuknftigerWert], _ [vTermin]) _ [vSchtzung As Variant = 0.1] As Double
Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion Rate liefert den Zinssatz einer Annuitt mit dem Barwert (vgl. PV-Funktion, S. 106) dBarWert, einer Laufzeit von dLaufzeit Zahlungsperioden und der Zahlungsrate dRate. Der optionale Parameter vZuknftigerWert (vgl. FV-Funktion, S. 98) ermglicht die Angabe eines zuknftigen Werts, der den nach der letzten Zahlung erreichten Kontostand angibt. Bei einem Kredit ist dieser Wert im Allgemeinen mit 0 anzugeben, was dem Vorgabewert fr den Parameter entspricht. Umgekehrt ist bei einer Ansparung dBarWert mit 0 anzugeben. Fehlt der optionale Parameter vTermin oder ist er 0, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Ende einer Periode erfolgt; ist der Wert dagegen 1, geht die Funktion davon aus, dass die Ratenzahlung jeweils zu Beginn einer Periode erfolgt. Da die Funktion das Ergebnis mit einem iterativen Verfahren berechnet, bentigt sie fr den Start der Iteration einen Schtzwert vSchtzung. Fehlt dieser optionale Parameter, arbeitet die Funktion mit dem Vorgabewert 0,1.

1 08

Rnd- Funktion und Rnd- Anw eisung

Anwendung

................................................... Anwendung

Beachten Sie, dass die Werte fr die Parameter dRate und dLaufzeit auf denselben Einheitszeitraum (meist Monat oder Jahr) bezogen sein mssen. Fr alle finanzmathematischen Funktionen gilt, dass Zahlungsausgnge durch negative Zahlen und Zahlungseingnge durch positive Zahlen dargestellt werden. Die Funktion lsst sich sowohl bei der Berechnung von Krediten als auch von Ansparungen verwenden. Bei der Kreditberechnung ist dBarwert als negativer Wert anzugeben, bei der Ansparberechnung dBarwert als 0 und dZuknftigerWert als negativer Wert.
Beispiel

................................................... Beis piel

Das folgende Codefragment ermittelt den Zins in Prozent fr eine Ansparung ber 250.000 mit einer Laufzeit von 35 Jahren und einer monatlichen Rate von 250 :
dLaufzeit = 35 * 12 dZukWert = -250000 dRate = 250 Print Rate(dLaufzeit, dRate, 0, dZukWert) * 1200; "%" ' Ausgabe: 4,42 %
Verwandte Befehle

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Verwa ndte Befehle

FV, IPmt, NPer, NPV, Pmt, PPmt, PV

Rnd- Funktion und Rnd- Anweisung


Function Rnd [(vSchalter)] As Single Sub Rnd ([vSchalter])
Beschreibung

................................................... Bes c hreibung

Rnd lsst sich sowohl als Funktion als auch als Anweisung verwenden. Die Anweisung unterscheidet sich von der Funktion nur insoweit, als sie keinen Wert liefert. Die Zufallsfunktion Rnd ermittelt ausgehend von einem Startwert eine Zufallszahl mit dem Datentyp Single, die dem halboffenen Intervall [0; 1[ entstammt. Die Berechnung ist gleichverteilt, das heit, jede der im Intervall als Single darstellbaren Zahlen wird mit gleicher Wahrscheinlichkeit ermittelt. Der Wert des optionalen Parameters vSchalter bestimmt, wie die Funktion mit dem Startwert verfhrt. Fehlt der Parameter oder ist sein Wert grer als 0, berechnet die Funktion jeweils die nchste Zufallszahl aus der vorangegangenen, indem sie diese als Startwert verwendet. Damit liefert Rnd eine deterministische Folge von Zufallszahlen, die durch den ersten Startwert ausgewhlt wird. Standardmig initialisiert Visual Basic den Startwert fr jeden Programmlauf auf 0, so dass Rnd ohne weitere Vorkehrungen in der Tat die immer gleiche Folge liefert. Um eine andere Folge auszuwhlen, muss der Startwert zuvor mittels der Anweisung Randomize explizit gesetzt werden. Hat der Parameter vSchalter den Wert 0, liefert Rnd erneut die vorangegangene Zufallszahl. Ist vSchalter dagegen ein negativer Wert, legt die Funktion dem nchsten Aufruf den durch Randomize (erneut) gesetzten Startwert zugrunde.
Anwendung

................................................... Anwendung

Im Allgemeinen wird man vor dem ersten Rnd-Aufruf einen Randomize-Aufruf setzen, der fr eine Auswahl der Zufallsfolge sorgt. Eine wirklich zufllige Initialisierung des Zufallsgenerators lsst sich erreichen, indem man den Wert der Funktion Timer, die die Anzahl der seit Mittnacht (Systemzeit) vergangenen Sekunden liefert, als Startwert einsetzt. Dazu reicht es, Randomize ohne Angabe eines Parameters auszufhren. Um im gleichen Programmlauf mehrere Folgen von Zufallszahlen mit deterministischem Startwert zu erzeugen, setzen Sie vor jeden Randomize-Aufruf die Anweisung Rnd(-1).

1 09

Mathematische und finanzmathematische Funktionen und Anweisungen

Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Vgl. das Beispiel zu Randomize-Anweisung (S. 107).


Verwandte Befehle

Randomize
Verwandte Themen

Zeitgeber-Steuerelement (Timer) (S. 432)

Mathematische und finanzmathematische Funktionen und Anweisungen

Round- Funktion
Function Round(dZahl As NumTyp, [iDezStellen As Integer = 0]) As NumTyp
Beschreibung

................................................... Bes c hreibung

Die Rundungsfunktion Round fhrt eine Kaufmannsrundung durch. Fehlt der Parameter iDezimalstellen oder hat der den Wert 0, liefert die Funktion die nchste Ganzzahl in der Umgebung von dZahl und fhrt dabei im Gegensatz zu Fix und Int eine echte Kaufmannsrundung durch. Jeder andere positive Wert fr iDezimalstellen benennt eine Dezimalstelle hinter dem Komma, an der die Rundung stattfinden soll. Die Funktion richtet den Datentyp des Rckgabewerts nach dem Datentyp des Parameters.
Warnung

................................................... Wa rnung

Wie das Beispiel zeigt, ist die Dezimalrechnung mit den Datentypen Single und Double nicht immer exakt. Das liegt daran, dass die Reprsentation dieser Werte intern im hexadezimalen bzw. echten binren Zahlenformat erfolgt und viele endliche Dezimalbrche im binren Zahlensystem nur als unendliche Binrbrche darstellbar sind. Im Zusammenhang mit der Funktion Round kann das zu peinlichen Fehlern fhren. Wenn Sie Exaktheit bentigen, mssen Sie mit einem der Datentypen Currency oder Decimal rechnen.
Beispiel

................................................... Beis piel


Round(14.005, Round(14.015, Round(14.025, Round(14.035, Round(14.045, Round(14.055, 2) 2) 2) 2) 2) 2) ' ' ' ' ' ' 14 14,02 14,02 14,04 14,04 14,06 (erwartet: 14,01) (korrekt) (erwartet 14,03) (korrekt) (erwartet 14,03) (korrekt)

Print Print Print Print Print Print


Verwandte Befehle

................................................... Verwa ndte Befehle

CInt, Fix, Int

Sgn- Funktion
Function Sgn(dZahl As NumTyp) As Integer
Beschreibung

................................................... Bes c hreibung

Die Vorzeichenfunktion Sgn liefert das Vorzeichen des Werts dZahl als Faktor. Das Ergebnis ist 1, wenn dZahl positiv ist, 0, wenn dZahl 0 ist, und -1, wenn dZahl negativ ist.

110

Sgn- Funktion

Anwendung

................................................... Anwendung

Die Funktion Sgn ist zuweilen ntzlich, wenn es darum geht, Laufzeitoptimierungen vorzunehmen und If-Anweisungen durch geschicktere Formulierung logischer Ausdrcke zu vereinfachen oder ganz zu vermeiden.
Beispiel

................................................... Beis piel

Die folgende Zeile wird erheblich schneller verarbeitet als die auskommentierte If-Anweisung (allerdings haben die beiden Formulierungen nicht die gleiche Semantik, da Nullwerte nicht mitgezhlt werden):

Mathematische und finanzmathematische Funktionen und Anweisungen

Dim lZhler As Long Zeit = Timer ' Laufzeitmessung beginnen For i = 1 To 1000000 zv = Rnd 0.5 lZhler = lZhler + Sgn(zv) ' If zv > 0 Then lZhler = lZhler + 1 Else lZhler = lZhler 1 Next Caption = Timer Zeit ' Laufzeit als Titelzeile ausgeben

In der folgenden, dem Projekt Apfelmann entstammenden Routine fhrt die Formulierung der zeitaufwndigen If-Abfrage mit den Funktionen Abs und Sgn zu einer Laufzeitverbesserung um immerhin ca. 30 %. Messen Sie es nach, indem Sie einmal die eine und einmal die andere Zeile auskommentieren!
Private Sub Apfel(m_x1, m_x2, m_y1, m_y2, step_x, step_y) Dim r1 As Double, re As Double, im As Double Dim zr As Double, zi As Double, it As Long Zeit = Timer For zr = m_x1 To m_x2 Step step_x ' alle Spalten in x-Richtung For zi = m_y1 To m_y2 Step step_y ' alle Punkte in Spalte zr re = 0 ' Realteil initialisieren im = 0 ' Imaginrteil initialisieren For it = 0 To cMaxIterat ' Iteration fr Punkt r1 = re * re im * im + zr im = 2 * re * im + zi re = r1 ' If re < -cGrenze Or re > cGrenze Or im < -cGrenze Or im > cGrenze Then If Sgn(cGrenze Abs(re)) + Sgn(cGrenze Abs(im)) = -2 Then PSet (zr, zi), it * 16 ' Punkt ausgeben Exit For End If Next it Next zi Next zr Caption = Timer Zeit End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle

CInt, Fix, Int

111

M athematische und finanzmathematische Funktionen und Anw eisungen

Sin- Funktion
Function Sin(dWinkel As Double) As Double
Beschreibung

................................................... Bes c hreibung

Die zu den trigonometrischen Funktionen zhlende Sinusfunktion Sin liefert den Sinus zu dem im Bogenma angegebenen Winkel dWinkel. Das Ergebnis der Funktion liegt immer im Intervall [-1; 1]. Fr die Umwandlung eines Gradwerts in das Bogenma ist der Wert mit /180 = 1,74532925199433E-02 zu multiplizieren.
Anwendung

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Anwendung

Diese Funktion berechnet aus dem Winkel zwischen Ankathete und Hypothenuse die Gegenkathete eines rechtwinkligen Dreiecks mit Hypothenuse 1.
Beispiel

................................................... Beis piel


' 3.14159265358979 ' Ausgabe: 0,5 [= Sin(30)]

Dim Pi As Double Pi = Atn(1) * 4 Print Sin(Pi / 6)


Verwandte Befehle

................................................... Verwa ndte Befehle

Atn, Cos, Tan

SLN- Funktion
Function SLN( _ dAnschaffungsKosten As Double, _ dRestwert As Double, _ dNutzungsDauer As Double) _ As Double
Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion SLN (engl.: Straight Line Depreciation) berechnet die periodische Abschreibung einer Investition dAnschaffungsKosten mit dem Restwert dRestwert ber die Nutzungsdauer dNutzungsDauer nach dem linearen (arithmetischen) Abschreibungsmodell.
Anwendung

................................................... Anwendung

Der von SLN gelieferte Wert bezieht sich auf die gleiche Einheit (Monate oder Jahre) wie dNutzungsDauer. Er errechnet sich wie folgt: Anschaffungswert Endwert SLN = -------------------------------------------------------------------------Nutzungsdauer
Beispiel

................................................... Beis piel


' Ausgabe 990

Print SLN(10000, 100, 10)


Verwandte Befehle

................................................... Verwa ndte Befehle

DDB, SYD

112

Sqr- Funktion

Sqr- Funktion
Function Sqr(dPositiveZahl As Double) As Double
Beschreibung

................................................... Bes c hreibung

Die Wurzelfunktion Sqr liefert die Quadratwurzel von dPositiveZahl. Ist der Wert von dPositiveZahl negativ, meldet die Funktion einen Laufzeitfehler.
Beispiel

................................................... Beis piel

Das folgende Codefragment berechnet die Lsung(en) der allgemeinen quadratischen Gleichung ax + bx +c = 0:
det = (b * b 4 * a * c) If det < 0 Then Print "Keine Lsung" If det = 0 Then Print "x1, x2 = "; -b / 2 / a If det > 0 Then Print "x1 = "; (-b + det) / 2 / a Print "x2 = "; (-b det) / 2 / a End If
Verwandte Befehle

Mathematische und finanzmathematische Funktionen und Anweisungen

................................................... Verwa ndte Befehle

^ (Operator)

SYD- Funktion
Function SYD( _ dAnschaffungsKosten As Double, _ dRestwert As Double, _ dNutzungsDauer As Double_ dPeriode As Double) _ As Double
Beschreibung

................................................... Bes c hreibung

Die zu den finanzmathematischen Funktionen zhlende Funktion SYD (engl.: Sum of Years Depreciation) berechnet die periodische Abschreibung einer Investition dAnschaffungsKosten mit dem Restwert dRestwert ber die Nutzungsdauer dNutzungsDauer fr die Periode dPeriode nach dem Abschreibungsmodell der Jahressummengewichtung.
Beispiel

................................................... Beis piel

Der folgende Code zeigt eine alternative Implementation der Funktion SYD:
Function MySYD(Wert, Rest, Nutzung, per) d = Nutzung * (Nutzung + 1) / 2 MySYD = (Wert Rest) / d * (Nutzung + 1 per) End Function

Beide Funktionen liefern die gleichen Werte:


For per = 1 To 10 Print SYD(10000, 100, 10, per), Print MySYD(10000, 100, 10, per) Next ' 1800, 1620, 1440, 1260,... ' 1800, 1620, 1440, 1260,...

113

Funktionen und Anw eisungen fr Datums- / Zeitw erte

Verwandte Befehle

................................................... Verwa ndte Befehle

DDB, SLN

Tan- Funktion
Function Tan(dWinkel As Double) As Double
Beschreibung

................................................... Bes c hreibung

Funktionen und Anweisungen fr Datums- / Zeitwerte

Die zu den trigonometrischen Funktionen zhlende Tangensfunktion Tan liefert den Tangens zu dem im Bogenma angegebenen Winkel dWinkel. Die Umkehrfunktion zu Tan ist Atn. Fr die Umwandlung von Grad in das Bogenma ist der Wert mit /180 = 1,74532925199433E-02 zu multiplizieren.
Anwendung

................................................... Anwendung

Diese Funktion berechnet aus dem Winkel zwischen Ankathete und Hypothenuse die Steigung der Hypothenuse, welche ihrerseits als Quotient zwischen Ankathete und Gegenkathete definiert ist.
Beispiel

................................................... Beis piel


' 3.14159265358979 ' 1 ' 1

Dim Pi As Double Pi = Atn(1) * 4 Print Sin(Pi / 4) / Cos(Pi / 4) Print Tan(Pi / 4)


Verwandte Befehle

................................................... Verwa ndte Befehle

Atn, Cos, Sin

Funktionen und Anweisungen fr Datums- / Zeitwerte


Mit der zunehmenden Bedeutung von Visual Basic als Programmiersprache fr Front-endAnwendungen im Datenbankbereich versteht es sich beinahe von selbst, dass die Sprache insbesondere fr solche Datentypen quivalente anbietet, die bei der Datenbankprogrammierung gemeinhin als grundlegende Datentypen gehandelt werden. Die Welt der Datums-/Zeitwerte und ihrer Operationen stellt nicht zuletzt aus diesem Grund neben der Welt der Zeichenfolgen und der Welt der numerischen Datentypen eine eigene Kategorie dar, um die Visual Basic die Sprache Basic bereichert hat. Werte des Typs Date reprsentiert Visual Basic als 64-Bit-Gleitkommazahlen (8 Bytes) nach IEEE und kann somit Datumsangaben im Bereich zwischen dem 1. Januar 100 und dem 31. Dezember 9999 sowie Uhrzeiten im Bereich von 0:00:00 bis 23:59:59 unterscheiden. Datumswerte knnen Datumsangaben und Zeitangaben kombinieren, aber auch je einzeln ausdrcken. Der Notation literaler Datums- und Zeitangaben liegt das amerikanische Format zugrunde, das heit, in Datumsangaben wird der Monat vor dem Tag notiert, die Abtrennung erfolgt durch das Zeichen /, und Zeitangaben sind in 12-StundenDarstellung gefolgt von PM oder AM zu treffen. Zudem ist die Darstellung durch ein fhrendes und ein abschlieendes #-Zeichen einzuschlieen. An Operationen fr den Datentyp Date hlt Visual Basic eine ganze Latte parat, die mehr oder weniger etwas mit der Konvertierung unter Bercksichtigung verschiedener Notationen oder mit der Extraktion einer bestimmten Teilinformation zu tun haben. Die folgende Tabelle gibt einen berblick ber alle fr diesen Datentyp relevanten Funktionen und Anweisungen:

114

Funktionen und Anw eisungen fr Datums- / Zeitw erte

Bezeichner CDate Date Date DateAdd

Kurzbeschreibung Interpretiert eine Zeichenfolge oder einen Zahlenwert als Datums-/Zeitwert Liefert das aktuelle Systemdatum als Datums-/Zeitwert Setzt den Datumsanteil von Datums-/Zeitwert als aktuelles Systemdatum Berechnet die Summe aus einem Datums-/Zeitwert und einem Zeitintervall, das wahlweise in Sekunden, Minuten, Stunden, Tage etc. anzugeben ist

Funktionen und Anweisungen fr Datums- / Zeitwerte

DateDiff

Berechnet das Zeitintervall zwischen zwei Datums-/Zeitwerten und liefert das Ergebnis wahlweise in einer der Einheiten Sekunden, Minuten, Stunden, Tage etc. Liefert eine Teilinformation aus einem Datums-/Zeitwert, wahlweise Sekunden, Minuten, Stunden, Tage etc. Setzt einen Datums-/Zeitwert aus Ganzzahlwerten (Tag, Monat und Jahr) zusammen Interpretiert eine Zeichenfolge oder einen Zahlenwert als Datumsanteil von Datums-/Zeitwert Liefert den Tag aus einem Datums-/Zeitwert als Zahlenwert (1 bis 31) Liefert den Zeitpunkt der Erstellung bzw. letzten nderung einer Datei als Datums-/Zeitwert Liefert die Darstellung eines Datums-/Zeitwerts als Zeichenfolge im spezifizierten Format Liefert die Stunde aus einem Datums-/Zeitwert als Zahlenwert (0 bis 23) Liefert die Minute aus einem Datums-/Zeitwert als Zahlenwert (0 bis 59) Liefert den Monat aus einem Datums-/Zeitwert als Zahlenwert (1 12) Liefert fr einen Zahlenwert zwischen 1 und 12 den Monatsnamen als Zeichenfolge Liefert Systemdatum und -zeit als Datums-/Zeitwert Liefert die Sekunde aus einem Datums-/Zeitwert als Zahlenwert (0 bis 59) Liefert die aktuelle Systemzeit als Datums-/Zeitwert Setzt den Zeitanteil von Datums-/Zeitwert als aktuelle Systemzeit Liefert den Wert des System-Timers (Sekunden seit Mitternacht) Setzt einen Datums-/Zeitwert aus Ganzzahlwerten (Sekunde, Minute, Stunde) zusammen Interpretiert eine Zeichenfolge oder einen Zahlenwert als Zeitanteil eines Datums-/Zeitwerts Liefert den Wochentag aus einem Datums-/Zeitwert als Zahl (1 bis 7) Liefert den Wochentag als Zeichenfolge fr Werte zwischen 1 und 7 Liefert das Jahr aus einem Datums-/Zeitwert als Zahlenwert

DatePart DateSerial DateValue Day FileDateTime FormatDateTime Hour Minute Month MonthName Now Second Time Time Timer TimeSerial TimeValue WeekDay WeekDayName Year

Auf Datum und Zeit bezogene Funktionen und Anweisungen

115

Funktionen und Anw eisungen fr Datums- / Zeitw erte

CDate- Funktion
Function CDate(vWert) As Date Siehe Typumwandlung (S. 57).

Date- Funktion und Date- Anweisung


Function Date() As Date Date = datDatum
Beschreibung

................................................... Bes c hreibung

Funktionen und Anweisungen fr Datums- / Zeitwerte

Als Funktion liefert Date das aktuelle Systemdatum und als Anweisung setzt Date das aktuelle Systemdatum (dauerhaft).
Beispiel

................................................... Beis piel

Immer hufiger spielen sich Shareware-Programme als Timeware-Programme auf, indem sie nach einer gewissen Zeit berraschend die Arbeit einstellen und einen so dazu berreden wollen, sich fr die Vollversion registrieren zu lassen. Fr die bergangszeit bietet sich ein kleines Visual-Basic-Programm namens SharewareTrick an, das kurz am Systemdatum dreht:
Dim datSystem As Date Private Sub Form_Load() datSystem = Date Date = "1.1.00" Zeitware = Shell("notepad.exe", vbNormalFocus) Timer1.Interval = 10000 End Sub Private Sub Timer1_Timer() Timer1.Interval = 0 Date = datSystem End End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle

Now, Time

DateAdd- Funktion
Function DateAdd(Interval As String, Number As Double, Date) As Date
Beschreibung

................................................... Bes c hreibung

Die Funktion DateAdd addiert zu einem gegebenen Datums-/Zeitwert Date ein Zeitintervall Number, dem die Einheit Interval zugrunde gelegt ist. Wert fr Interval "yyyy" "q" "m" Beschreibung Die Funktion interpretiert Number als Jahre Die Funktion interpretiert Number als Quartale Die Funktion interpretiert Number als Monate

116

DateDiff- Funktion

Wert fr Interval "ww" "d", "w", "y" "h" "n" "s"


Anwendung

Beschreibung Die Funktion interpretiert Number als Wochen Die Funktion interpretiert Number als Tage Die Funktion interpretiert Number als Stunden Die Funktion interpretiert Number als Minuten Die Funktion interpretiert Number als Sekunden

................................................... Anwendung

Funktionen und Anweisungen fr Datums- / Zeitwerte

Der Datentyp Date verwendet fr die interne Darstellung von Datums-/Zeitwerten einen Wert vom Typ Double, der sich nicht so ohne Weiteres in seine Bestandteile (Sekunden, Minuten, Stunden, Tage, Wochen, Monate Jahre) zerlegen lsst. Mit der Funktion DateAdd stellt Visual Basic ein bequemes Mittel fr das Rechnen mit Zeitwerten zur Verfgung. Beachten Sie, dass der Wertebereich von Date auf Datums-/Zeitwerte zwischen dem 1.1.100 und dem 31.12.9999 beschrnkt ist.
Beispiel

................................................... Beis piel

Die folgende Zeile berechnet den Datums-/Zeitwert fr ein Ereignis, das NewInterval Sekunden in der Zukunft gelegen ist.
m_TriggerTime = DateAdd("s", NewInterval, Now)

Ein praxisnahes Beispiel fr die Anwendung dieser Funktion ist das im Praxisteil vorgestellte Projekt LongTimer (vgl. LongTimer der Timer mit Ausdauer, S. 599).
Verwandte Befehle

................................................... Verwa ndte Befehle

DateDiff, DatePart, DateSerial, DateValue, TimeSerial

DateDiff- Funktion
Function DateDiff(Interval As String, Date1, Date2, [FirstDayOfWeek As VbFirstDayOfWeek = vbSunday], _ [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) _ As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion DateDiff bildet die Differenz aus den beiden Datums-/Zeitwerten Date2 und Date1 und liefert das Ergebnis als Ganzzahl in der Einheit Interval. Die optionalen Parameter FirstDayOfWeek und FirstWeekOfYear beziehen sich auf exotische Formen der Datumsdarstellung und knnen im Allgemeinen getrost weggelassen werden. Wert fr Interval "yyyy" "q" "m" "w", "ww" Beschreibung Funktion liefert das Ergebnis in der Einheit Jahre Funktion liefert das Ergebnis in der Einheit Quartale Funktion liefert das Ergebnis in der Einheit Monate Funktion liefert das Ergebnis in der Einheit Wochen

117

Funktionen und Anw eisungen fr Datums- / Zeitw erte

Wert fr Interval "d", "y" "h" "n" "s"


Anwendung

Beschreibung Funktion liefert das Ergebnis in der Einheit Tage Funktion liefert das Ergebnis in der Einheit Stunden Funktion liefert das Ergebnis in der Einheit Minuten Funktion liefert das Ergebnis in der Einheit Sekunden

................................................... Anwendung

Funktionen und Anweisungen fr Datums- / Zeitwerte

Der Datentyp Date verwendet fr die interne Darstellung von Datums-/Zeitwerten einen Wert vom Typ Double, der sich nicht so ohne Weiteres in seine Bestandteile (Sekunden, Minuten, Stunden, Tage, Wochen, Monate Jahre) zerlegen lsst. Mit der Funktion DateDiff stellt Visual Basic ein bequemes Mittel fr das Rechnen mit Zeitwerten zur Verfgung. Beachten Sie, dass der Wertebereich von Date auf Datums-/Zeitwerte zwischen dem 1.1.100 und dem 31.12.9999 beschrnkt ist.
Warnung

................................................... Wa rnung

Die Reihenfolge der Parameter Date1 und Date2 ist leider kontraintuitiv gewhlt. DateDiff rechnet: Date2 Date1.
Beispiel

................................................... Beis piel

Die folgende Zeile berechnet die Anzahl der Sekunden, die seit der Geburtsstunde des Autors verstrichen sind:
Print DateDiff("s", #3/3/1959 11:32:00 PM#, Now)

Ein praxisnahes Beispiel fr die Anwendung dieser Funktion ist das im Praxisteil vorgestellte Projekt LongTimer (vgl. LongTimer der Timer mit Ausdauer, S. 599).
Verwandte Befehle

................................................... Verwa ndte Befehle

DateAdd, DatePart, DateSerial, DateValue, TimeSerial

DatePart- Funktion
Function DatePart( _ Interval As String, Date, [FirstDayOfWeek As VbFirstDayOfWeek = vbSunday], _ [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) _ As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion DatePart extrahiert den ber den Parameter Interval spezifizierten Bestandteil des Datums-/Zeitwerts Date und liefert ihn als Wert vom Typ Long. Die optionalen Parameter FirstDayOfWeek und FirstWeekOfYear beziehen sich auf exotische Formen der Datumsdarstellung und knnen im Allgemeinen getrost weggelassen werden.

118

DateSerial- Funktion

Wert fr Interval "yyyy" "q" "m" "ww" "w" "y" "d" "h" "n" "s"
Anwendung

Beschreibung Funktion extrahiert die Information Jahre Funktion extrahiert die Information Quartale Funktion extrahiert die Information Monate Funktion extrahiert die Information Wochen Funktion extrahiert die Information Tag der Woche Funktion extrahiert die Information Tag im Jahr

Funktionen und Anweisungen fr Datums- / Zeitwerte

Funktion extrahiert die Information Tag im Monat Funktion extrahiert die Information Stunden Funktion extrahiert die Information Minuten Funktion extrahiert die Information Sekunden

................................................... Anwendung

Der Datentyp Date verwendet fr die interne Darstellung von Datums-/Zeitwerten einen Wert vom Typ Double, der sich nicht so ohne Weiteres in seine Bestandteile (Sekunden, Minuten, Stunden, Tage, Wochen, Monate Jahre) zerlegen lsst. Mit der Funktion DatePart stellt Visual Basic ein bequemes Mittel fr das Zerlegen von Datums-/Zeitwerten zur Verfgung.
Beispiel

................................................... Beis piel

Print "Diese Woche ist die " & DatePart("ww", Now) & ". Kalenderwoche"
Verwandte Befehle

................................................... Verwa ndte Befehle

Day, Hour, Minute, Month, MonthName, Second, WeekDay, Year

DateSerial- Funktion
Function DateSerial( _ iJahr As Integer, iMonat As Integer, iTag As Integer) As Date
Beschreibung

................................................... Bes c hreibung

Die Funktion DateSerial generiert aus den Ganzzahlwerten iTag, iMonat und iJahr einen Datums-/Zeitwert.
Anwendung

................................................... Anwendung

Die Funktion prft die Werte der Parameter nicht, das heit, sie lst auch keinen Laufzeitfehler aus, wenn die Komponenten kein reelles Datum ergeben. Wichtig ist nur das Resultat: Es darf sich kein Datum vor dem 1.1.100 und nach dem 31.12.9999 ergeben. Auf diese Weise gestattet die Funktion sehr schn das Rechnen mit relativen Zeitangaben wie: heute, vor zwei Jahren, drei Monaten, vier Tagen. Wenn Sie versuchen, dies allgemein zu Fu auszurechnen, werden Sie merken, dass Sie schnell in des Teufels Kche geraten, da die Monate unterschiedlich lang sind und unser Gregorianische Kalender eine nicht unkomplizierte Schaltregel hat.

119

Funktionen und Anw eisungen fr Datums- / Zeitw erte

Beispiel

................................................... Beis piel

Mit DateSerial gert die Lsung des genannten Problems zum Einzeiler. Probieren Sie es aus; fr den 1.1.2001 stimmt die alternative Lsung, fr den 1.1.2000 dagegen nicht.
d = Date Date = "1.1.2000" ' Date = "1.1.2001" Print DateSerial(Year(Date) 2, Month(Date) 3, Day(Date) 4) Print Date 2 * 365 3 * 31 4 ' alternative Lsung Date = d

Funktionen und Anweisungen fr Datums- / Zeitwerte

Ein praxisnahes Beispiel fr die Anwendung dieser Funktion ist das Projekt FormatDemo (vgl. Format-Funktion, S. 69), das einen Halbjahreskalender ausgibt.
Verwandte Befehle

................................................... Verwa ndte Befehle

TimeSerial

DateValue- Funktion
Function DateValue( sDatum As String) As Date
Beschreibung

................................................... Bes c hreibung

Die Funktion DateValue interpretiert die Zeichenfolge sDatum als Datum und generiert daraus einen Datums-/Zeitwert. Falls die Zeichenfolge auch Zeitangaben enthlt, werden diese nicht bercksichtigt.
Anwendung

................................................... Anwendung

Was die Notation des Datums betrifft, ist DateValue weitgehend tolerant. So ergnzt die Funktion bei fehlendem Jahr das aktuelle Jahr aus dem Systemdatum des Computers und akzeptiert darber hinaus neben dem kurzen und dem langen Datumsformat (entsprechend den auf dem System geltenden Datumseinstellungen) auch mittlere Datumsformate, in denen der Monat mit mindestens drei Buchstaben abgekrzt ist und Tag und Monat gegebenenfalls vertauscht sind.
Tipp

................................................... Tipp

CDate und TimeValue unterscheiden sich insofern, als CDate auch Werte anderer Datentypen als String in einen Datums-/Zeitwert umsetzt und zustzlich auch einen Zeitanteil bercksichtigt.
Beispiel

................................................... Beis piel


DateValue("1.2") DateValue("1. Feb") DateValue("1. Febr.") DateValue("1. Februar 00") DateValue("Feb, 1 00") DateValue("00, Feb 01 ") DateValue("1.2.00") DateValue("1.2.2000 ") DateValue("1. Feb") ' ' ' ' ' ' ' ' ' "01.02.2000" "01.02.2000" "01.02.2000" "01.02.2000" "01.02.2000" "01.02.2000" "01.02.2000" "01.02.2000" "01.02.2000"

Viele Wege fhren nach Rom!


Print Print Print Print Print Print Print Print Print

1 20

Day- Funktion

Verwandte Befehle

................................................... Verwa ndte Befehle

TimeSerial, CDate

Day- Funktion
Function Day(datWert As Date) As Integer
Beschreibung

................................................... Bes c hreibung

Die Funktion Day liefert den Tagesanteil des Datums-/Zeitwerts datWert als Ganzzahl zwischen 1 und 31.
Beispiel

Funktionen und Anweisungen fr Datums- / Zeitwerte

................................................... Beis piel ................................................... Verwa ndte Befehle

Siehe Format-Funktion (S. 69) und das dort vorgestellte Projekt FormatDemo.
Verwandte Befehle

DatePart, Hour, Minute, Month, Second, Year

FileDateTime- Funktion
Function FileDateTime(sPfad As String) As Date Siehe FileDateTime-Funktion (S. 139 ).

FormatDateTime- Funktion
Function FormatDateTime(vData, _ BenanntesFormat As VbDateTimeFormat = vbGeneralDate]) _ As String Siehe FormatDateTime-Funktion (S. 74 ) und Format-Funktion (S. 69).

Hour- Funktion
Function Hour(datWert As Date) As Integer
Beschreibung

................................................... Bes c hreibung

Die Funktion Hour liefert den Stundenanteil des Datums-/Zeitwerts datWert als Ganzzahl zwischen 0 und 23.
Beispiel

................................................... Beis piel

Print "Es ist"; Minute(Time); " Minuten und "; Second(Time); _ "Sekunden nach"; Hour(Time)
Verwandte Befehle

................................................... Verwa ndte Befehle

DatePart, Day, Minute, Month, Second, Year

Minute- Funktion
Function Minute(datWert As Date) As Integer

1 21

Funktionen und Anw eisungen fr Datums- / Zeitw erte

Beschreibung

................................................... Bes c hreibung

Die Funktion Minute liefert den Minutenanteil des Datums-/Zeitwerts datWert als Ganzzahl zwischen 0 und 59.
Beispiel

................................................... Beis piel

Print "Es ist"; Minute(Time); " Minuten und "; Second(Time); _ "Sekunden nach"; Hour(Time)
Verwandte Befehle

Funktionen und Anweisungen fr Datums- / Zeitwerte

................................................... Verwa ndte Befehle

DatePart, Day, Hour, Month, Second, Year

Month- Funktion
Function Month(datWert As Date) As Integer
Beschreibung

................................................... Bes c hreibung

Die Funktion Month liefert den Monatsanteil des Datums-/Zeitwerts datWert als Ganzzahl zwischen 1 und 12.
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle

Siehe Format-Funktion (S. 69) und das dort vorgestellte Projekt FormatDemo.
Verwandte Befehle

DatePart, Day, Hour, Minute, Second, Year

MonthName- Funktion
Function MonthName(lMonat As Long, bAbk As Boolean = False) As String Siehe MonthName-Funktion (S. 82).

Now- Funktion
Function Now() As Date
Beschreibung

................................................... Bes c hreibung ................................................... Beis piel

Die Funktion Now liefert die aktuelle Systemzeit mit Datums- und Zeitanteil.
Beispiel

Print Now
Verwandte Befehle

................................................... Verwa ndte Befehle

Time, Date

Second- Funktion
Function Second(datWert As Date) As Integer

1 22

Time- Funktion und Time- Anw eisung

Beschreibung

................................................... Bes c hreibung

Die Funktion Second liefert den Sekundenanteil des Datums-/Zeitwerts datWert als Ganzzahl zwischen 0 und 59.
Beispiel

................................................... Beis piel

Print "Es ist"; Minute(Time); " Minuten und "; Second(Time); _ "Sekunden nach"; Hour(Time)
Verwandte Befehle

................................................... Verwa ndte Befehle

Funktionen und Anweisungen fr Datums- / Zeitwerte

DatePart, Day, Hour, Month, Minute, Year

Time- Funktion und Time- Anweisung


Function Time() As Date Time = datZeit
Beschreibung

................................................... Bes c hreibung

Als Funktion liefert Time die aktuelle Systemzeit und als Anweisung setzt Time den Datums-/ Zeitwert datZeit als aktuelle Systemzeit (dauerhaft).
Anwendung

................................................... Anwendung

Wer nicht gerade eine Uhr programmiert, drfte sehr gut ohne diese Funktion bzw. Anweisung auskommen. Es kommt zwar hufiger vor, dass man die aktuelle Systemzeit ausgeben muss so etwa beim Drucken oder wenn Datenstze mit Zeitstempeln versehen werden mssen, im Allgemeinen wird dann aber die Funktion Now die bessere Lsung sein, da sie den Zeit- und den Datumsanteil der Systemzeit ermittelt. Wenn es dagegen um die Bestimmung von Zeitrumen innerhalb eines Tages geht, so etwa fr Laufzeitmessungen, wird die Funktion Timer die bessere Wahl sein.
Anwendung

................................................... Anwendung

Wer kennt das nicht? Das Dokument ist erst in der Nacht fertig geworden, und der Empfnger braucht das nicht unbedingt zu wissen. Anstatt umstndlich auf den Zeitstempel der Datei loszugehen, ist es geschickter, der Anwendung eine Zeit lang eine falsche Zeit vorzugaukeln, whrend sie die Datei abspeichert. Genau das macht das Beispielprojekt ZeitStempel.
' Projekt: Zeitstempel Const cVerzgerung = 10 Const cZivilZeit = #3:59:00 PM# Dim datSysZt As Date Private Sub Form_Load() datSysZt = Time Time = cZivilZeit Timer1.Interval = cVerzgerung * 1000 End Sub Private Sub Timer1_Timer() Timer1.Interval = 0 t = Time ' Sekunden ' Kurz vor Feierabend

' aktuelle Zeit merken ' Kurz vor Feierabend ... ' Timer setzen

1 23

Funktionen und Anw eisungen fr Datums- / Zeitw erte

Time = datSysZt + (t cZivilZeit) If Time < datSysZt Then Date = Date + 1 End End Sub
Verwandte Befehle

' Zeit richtig korrigeren ' Mitternachtskorrektur ' und Tschss

................................................... Verwa ndte Befehle

Now, Date

Timer- Funktion

Funktionen und Anweisungen fr Datums- / Zeitwerte

Function Timer() As Single


Beschreibung

................................................... Bes c hreibung

Die Funktion Timer liefert die seit Mitternacht (Systemzeit) vergangene Zeit in Sekunden mit Nachkommaanteil als Fliekommawert einfacher Genauigkeit (Windows 9x: in 18tel Sekundenschritten; Windows NT: in 50stel Sekundenschritten).
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle

Siehe die Beispiele zu Sgn-Funktion (S. 110).


Verwandte Befehle

Time, Date

TimeSerial- Funktion
Function TimeSerial( _ iStd As Integer, iMin As Integer, iSek As Integer) As Date
Beschreibung

................................................... Bes c hreibung

Die Funktion TimeSerial generiert aus den Ganzzahlwerten iStd, iMin und iSek einen Datums-/ Zeitwert.
Anwendung

................................................... Anwendung

Die Funktion prft die Werte der Parameter nicht, das heit, sie lst auch keine Laufzeitfehler aus, wenn die Komponenten keine reelle Zeit ergeben. Ergibt die akkumulierte Zeit einen Wert grer #23:59:59# oder kleiner #0:00:00#, liefert die Funktion gleichzeitig einen Datumsoffset bezogen auf das Referenzdatum 30.12.1899. Auf diese Weise gestattet die Funktion sehr schn das Rechnen mit relativen Zeitangaben wie: vor 22 Stunden, 97 Minuten und 123 Sekunden.
Beispiel

................................................... Beis piel

cZt = #11:11:11# For iSek = 0 to 400 Step 10 Print TimeSerial(Hour(cZt), Minute(cZt), Second(cZt) + iSek) next iSek
Verwandte Befehle

................................................... Verwa ndte Befehle

DatePart, DateSerial

1 24

TimeValue- Funktion

TimeValue- Funktion
Function TimeValue(sZeit As String) As Date
Beschreibung

................................................... Bes c hreibung

Die Funktion DateValue interpretiert die Zeichenfolge sZeit als Zeitangabe und generiert daraus einen Datums-/Zeitwert. Falls die Zeichenfolge auch Datumsangaben enthlt, werden diese nicht bercksichtigt.
Anwendung

................................................... Anwendung

Was die Notation der Zeit betrifft, ist TimeValue weitgehend tolerant, solange nur das Trennzeichen : erscheint und die Zeitangabe reell ist. So interpretiert die Funktion fehlende Minutenund Sekundenanteile als 00 und kommt auch mit den Zustzen am, AM, pm und PM zurecht, wenn die Zeit in 12-Stunden-Darstellung notiert ist.
Tipp

Funktionen und Anweisungen fr Datums- / Zeitwerte

................................................... Tipp

CDate und TimeValue unterscheiden sich insofern, als CDate auch Werte anderer Datentypen als String in einen Datums-/Zeitwert umsetzt und zustzlich einen Datumsanteil bercksichtigt.
Beispiel

................................................... Beis piel


TimeValue("13:0") TimeValue("13:00:00") TimeValue("1 pm") TimeValue("13 pm") TimeValue("13 am") TimeValue("1 PM") TimeValue("13 AM") ' ' ' ' ' ' ' "13:00:00" "13:00:00" "13:00:00" "13:00:00" "13:00:00" "13:00:00" "13:00:00"

Alle Zeitangaben notieren die gleiche Zeit:


Print Print Print Print Print Print Print
Verwandte Befehle

................................................... Verwa ndte Befehle

DateValue, CDate

W eekday- Funktion
Function Weekday( _ datDatum As Date, _ [FirstDayOfWeek As VbDayOfWeek = vbSunday]) _ As Integer
Beschreibung

................................................... Bes c hreibung

Die Funktion Weekday interpretiert den Datums-/Zeitwert datDatum als Zeitangabe und liefert dazu den Wochentag als Ganzzahl zwischen 1 und 7. Fehlt der optionale Parameter FirstDayOfWeek oder hat er den Wert vbSunday, interpretiert die Funktion den Sonntag als ersten Tag der Woche, ansonsten den Tag, den die Konstante ausdrckt.
Warnung

................................................... Wa rnung

Microsoft hat den Standardwert fr den Parameter FirstDayOfWeek nicht richtig gewhlt, da der Aufruf Weekday(Now) ein falsches Ergebnis liefert. In unseren Sphren gilt der Montag als erster Tag der Woche wohl aufgrund der biblischen Devise und am Siebten Tage ruhte der Herr. Es empfiehlt sich daher, die Funktion mit dem Wert vbMonday fr ErsteTagWoche aufzurufen.

1 25

Dateiorientierte Funktionen und Anw eisungen

Beispiel

................................................... Beis piel


' Falscher Wochentag!!! ' Richtiger Wochentag

Alle Zeitangaben notieren die gleiche Zeit:


Print WeekdayName(Weekday(Now)) Print WeekdayName(Weekday(Now, vbMonday))
Verwandte Befehle

................................................... Verwa ndte Befehle

DatePart, DateValue, CDate

Dateiorientierte Funktionen und Anweisungen

W eekdayName- Funktion
Function WeekdayName( _ lTag As Long, _ [bAbk As Boolean = False], _ [FirstDayOfWeek As VbFirstDayOfWeek = vbUseSystemDayOfWeek]) _ As String Siehe WeekdayName-Funktion (S. 92).

Year- Funktion
Function Year(datWert As Date) As Integer
Beschreibung

................................................... Bes c hreibung

Die Funktion Year liefert den Jahresanteil des Datums-/Zeitwerts datWert als Ganzzahl zwischen 100 und 9999.
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle

Siehe Format-Funktion (S. 69) und das dort vorgestellte Projekt FormatDemo.
Verwandte Befehle

DatePart, Day, Hour, Minute, Month, Second

Dateiorientierte Funktionen und Anweisungen


Um es gleich vorwegzunehmen: Visual Basic weist nicht mehr die ursprngliche Geschlossenheit der Sprache Basic gegenber dem Dateisystem und der dateibezogenen Ein- und Ausgabe auf. Die Sache ist komplizierter geworden, denn verloren gegangen ist eher wenig, hinzugekommen dagegen viel. Freilich sind da noch die traditionellen Mittel, wohlbekannte Befehle wie Open, Input, Print#, Get, Put und Close, mit denen sich letztlich jeder Datei zu Leibe rcken lsst und die auch eine gesunde Basis fr das delikate Thema der Abwrtskompatibilitt darstellen. Zudem sind die dateisystembezogenen Befehle ChDir, ChDrive, MkDir, RmDir, Name weiterhin vorhanden. Ja, sie haben sogar noch Gesellschaft in Form recht ntzlicher Befehle wie Dir, FileCopy, FileLen, GetAttr und SetAttr usw. erhalten, die man sich zu Zeiten von QBasic etwa noch als entsprechende DOS-Kommandos mit Zeichenfolgenoperationen selbst zusammenbasteln und ber die Shell-Anweisung ausfhren musste. Darber hinaus versteht es sich schon fast von selbst, dass Dateinamen inzwischen lang und Pfadangaben UNC-konform (engl.: Universal Naming Convention, dazu gleich mehr) sein knnen, was letztlich Tr und Tor fr den netzwerkweiten Zugriff auf Dateien ffnet, ohne auf logische Laufwerke oder andere Krcken aus der DOSZeit angewiesen zu sein. Damit lsst sich schon was anfangen.

1 26

Dateiorientierte Funktionen und Anw eisungen

Komplett neu ist dagegen alles, was der Sprache von der objektorientierten Seite her an Potenzial zuteil geworden ist. So beispielsweise das FileSystemObject-Objekt, das als operative Grundlage des Windows-Explorers ein wahres Fllhorn an Mglichkeiten darstellt, wenn es darum geht, etwas ber das Dateisystem in Erfahrung zu bringen, Manipulationen darin vorzunehmen oder auch nur mit Textdateien zu arbeiten. Zudem ist das Tor weit offen fr beliebige Erweiterungen in dieser Richtung es steht Ihnen frei, Ihre ganz persnliche Klassenbibliothek fr dateibezogenene Operationen zu schreiben und fortan alle Dateizugriffe ber die darin definierten Objekte abzuwickeln. Das knnte beispielsweise den Vorteil haben, dass diese Objekte Ihren Anwendungen den ganzen Ballast logistischer und formaler Natur abnehmen, den bestimmte Dateiformate so mit sich bringen. Paradebeispiel fr diesen Ansatz sind die Anweisungen LoadPicture, SavePicture, Load und Unload. (Wer genau hinsieht, wird erkennen, dass zumindest die ersten drei Anweisungen in BLoad und BSave ihre Vorlufer hatten). So bequem solche Operationen auch sind, ihre Implementation und da beit die Maus keinen Faden ab lebt letztlich wieder von den erwhnten traditionellen Mitteln des Dateizugriffs, es sei denn, man kann dafr von entsprechenden zumeist in C oder C++ geschriebenen Bibliotheksroutinen profitieren oder gar von Betriebssystemroutinen aus der reichhaltigen Windows API (vgl. hierzu Routinen aus DLLs und der Windows-API einsetzen, S. 185). Ein etwas konsequenterer Ansatz, der der Idee der objektorientierten Programmierung nher steht, besteht darin, die im Programm verwendeten Datenstrukturen selbst als Objekte zu verpacken und ihnen Operationen wie SaveMyObject und LoadMyObject zu spendieren. Ein komplexes Objekt, das seinerseits verschiedene Objekte als Elemente enthlt, wird in seiner SaveMethode dann schlicht die Save-Methoden dieser Objekte aufrufen usw. Wann immer aber und das gilt auf letzter Ebene fr alle Objektreprsentationen die Werte elementarer Datentypen zu speichern sind, geht es ans Eingemachte, und die traditionellen Mittel sind wieder gefragt. Das alles ist aber noch nicht genug. Tatkrftige Untersttzung gibt es auch noch vonseiten der Steuerelemente. Da wren schon mal die Standardsteuerelemente der Klassen FileListBox und DriveListBox, die eine interaktive Auswahl von Dateien und logischen Laufwerken ermglichen. Da wren die Standarddialoge, die eine groe Hilfe beim ffnen und Speichern von Dateien darstellen und eine Flle von Operationen so ganz nebenbei und kostenlos mit sich bringen (vgl. Standarddialoge-Steuerelement (CommonDialog), S. 444). Und nicht zuletzt wre da auch noch die schier unerschpfliche Flle an Mglichkeiten, mittels so genannter Datenquellen (Data-Steuerelement, RemoteData-Steuerelement, ADO-Daten-Steuerelement, ADORecordset-Objekte) sowie DAO- und ADO-Objekten mit Daten zu hantieren, die in Datenbanken organisiert sind. Nicht nur weil die historische Entwicklung der Sprache Basic es so hervorgebracht hat, sondern auch weil es der Aufbau dieses Buches so will, geht es erst im Kapitel Objekte und Klassen (S. 195) um die Dateioperationen von Objekten und da eher nur am Rande. Ein wenig ber den Umgang mit Datenbanken finden Sie im Abschnitt Data-Datensteuerelement (Data) (S. 402). Wer aber die in diesem Abschnitt vorgestellte traditionelle Grundlage aller Dateioperationen kennt und verstanden hat, wird auf der objektorientierten Seite keine Not haben, beides miteinander zu verheiraten. Die folgende Tabelle gibt einen berblick ber die traditionellen Funktionen und Anweisungen, die unmittelbar oder mittelbar etwas mit Dateizugriffen zu tun haben. Bezeichner ChDir ChDrive Kurzbeschreibung ndert das aktuelle Arbeitsverzeichnis Setzt das aktuelle logische Laufwerk

Dateiorientierte Funktionen und Anweisungen

Auf Dateioperationen bezogene Funktionen und Anweisungen

1 27

Dateiorientierte Funktionen und Anw eisungen

Bezeichner Close CurDir Dir Environ EOF

Kurzbeschreibung Schliet eine oder mehrere zuvor geffnete Dateien Liefert das aktuelle Arbeitsverzeichnis auf dem angegebenen logischen Laufwerk Liefert den nchsten Dateinamen, der auf ein Suchmuster passt Liefert eine oder alle Umgebungsvariablen Testet, ob das Dateiende erreicht ist Ermittelt den ffnungsmodus einer Datei Kopiert eine Datei Liefert den Zeitpunkt der Erstellung bzw. letzten nderung einer Datei als Datums-/Zeitwert Liefert die Lnge einer Datei in Bytes Liefert die nchste freie Dateinummer Liest Daten aus einer indexsequenziellen Datei oder Binrdatei Liefert die Attribute einer Datei oder eines Ordners bzw. Verzeichnisses Liest die angegebene Anzahl an Zeichen aus einer Datei und liefert diese als Unicode-Zeichenfolge Liest den Wert einer oder mehrerer Variablen aus einer Textdatei Liest die angegebene Anzahl an Bytes aus einer Datei und liefert diese als Bytearray (ANSI-Zeichenfolge) Lscht alle Dateien, die auf das angegebene Suchmuster passen Liest eine Zeile aus einer geffneten sequenziellen Datei in eine Variable vom Typ String ein Liefert die aktuelle Schreib- bzw. Leseposition (Byte-Nummer) einer geffneten Datei Regelt die Zugriffsmglichkeiten anderer Programme auf eine bereits geffnete Datei Liefert die Lnge einer Datei in Bytes Zuweisungsoperation, die Daten beliebiger Datentypen fr die Ausgabe in eine Datei als Zeichenfolge aufbereitet Generiert ein neues Verzeichnis Benennt eine Datei um oder verschiebt diese in ein anderes Verzeichnis ffnet eine Datei zum Lesen oder Schreiben Schreibt Daten im gebietsspezifischen Format in eine sequenzielle Datei Schreibt Daten in eine indexsequenzielle Datei oder Binrdatei Schliet alle geffneten Dateien Lscht ein Verzeichnis Liefert die aktuelle Schreib- oder Leseposition in einer geffneten Datei

Dateiorientierte Funktionen und Anweisungen

FileAttr FileCopy FileDateTime FileLen FreeFile Get GetAttr Input Input # InputB Kill Line Input # Loc Lock LOF LSet MkDir Name Open Print# Put Reset RmDir Seek

Auf Dateioperationen bezogene Funktionen und Anweisungen

1 28

Dateiorientierte Funktionen und Anw eisungen

Bezeichner Seek SetAttr Shell Unlock Write#

Kurzbeschreibung Setzt die aktuelle Schreib- oder Leseposition in einer geffneten Datei Setzt ein oder mehrere Attribute fr eine Datei oder ein Verzeichnis Startet eine andere Anwendung und liefert deren Task-ID Regelt die Zugriffsmglichkeiten anderer Programme auf eine bereits geffnete Datei Schreibt Daten in standardisiertem Format in eine sequenzielle Datei

Dateiorientierte Funktionen und Anweisungen

Auf Dateioperationen bezogene Funktionen und Anweisungen

UNC- Pfad und Laufwerkspfad


Ein wichtige Gre im Umgang mit Dateien ist ihre Position im lokalen Dateisystem respektive im Netzwerk. Um eine irgendwo im Netzwerk (das kann auch auf dem lokalen System sein) gelegene Datei anzusprechen, geben Sie den UNC-Pfad der Datei an, der nach folgendem Schema notiert wird:
\\Server\Freigabe\[Verzeichnis ... \]Dateiname.Erw

Liegt die Datei dagegen auf dem lokalen Computer oder existiert fr seine im Netzwerk gelegene Position eine Netzlaufwerkverbindung, die der betreffenden Freigabe einen Laufwerksbuchstaben Laufw zuordnet, lsst sie sich auch ber ihren traditionellen Laufwerkspfad ansprechen.
Laufw:\[Verzeichnis ... \]Dateiname.Erw

Beide Pfadangaben knnen nach allen Regeln der Kunst absolut oder relativ zum jeweils aktuellen Arbeitsverzeichnis sein; der Unterschied zwischen beiden besteht eigentlich nur darin, dass der absolute Laufwerkspfad einen Laufwerksbuchstaben mit nachfolgenden Doppelpunkt hat, wo der absolute UNC-Pfad einen Servernamen und eine Freigabe enthlt.

Fehler und deren Behandlung


Wo gehobelt wird, fallen Spne. Da Dateioperationen sozusagen aus der geschlossenen Welt eines Programms hinausfhren und mit anderen Programmen am Gerangel um Gemeingut (gemeinsam genutzte Ressourcen) teilnehmen, ist es vllig normal, dass zur Laufzeit Fehler auftreten knnen, die zur Entwurfszeit nicht absehbar waren. Die zu solchen Fehlern fhrenden Konstellationen sind recht vielfltig, so dass man sich beim Programmentwurf einer stattlichen Anzahl mglicher Laufzeitfehler gegenber sieht, die es einzukalkulieren gilt. Hier einige der Ursachen fr hufige Fehler: Nr. 52 Fehlermeldung Mgliche Ursachen

Dateiname oder -nummer Der Dateiname einer anzulegenden Datei entspricht nicht falsch der Konvention fr Dateinamen. Ihr Programm hat nicht das Recht, die Datei auf einer Freigabe anzulegen, (z.B. weil das Kennwort nicht richtig ist). Die verwendete Dateinummer wurde entweder durch eine Close-Anweisung bereits freigegeben oder nie im Rahmen einer Open-Anweisung vergeben, etwa weil diese gescheitert ist.

Hufige Laufzeitfehler im Zusammenhang mit Dateioperationen

1 29

Dateiorientierte Funktionen und Anweisungen

Nr. 53 55

Fehlermeldung Datei nicht gefunden Datei bereits geffnet

Mgliche Ursachen Die Datei kann nicht geffnet werden, weil sie nicht existiert. Die Datei kann nicht geffnet werden, weil sie bereits geffnet ist. Passiert bei Open, Name, FileCopy, SetAttr, Kill. Das Ein- bzw. Ausgabegert enthlt einen defekten Datentrger oder die Netzwerkverbindung ist whrend der Dateioperation zusammengebrochen. Sie versuchen, eine Datei mit Name umzubenennen, der angegebene Dateiname ist aber bereits an eine andere Datei vergeben. Der freie Platz auf einer Diskette, Festplatte oder Netzwerkfreigabe reicht fr die Durchfhrung der Operation nicht aus. Die Dateioperation passt nicht zu dem Modus, in dem die Datei geffnet wurde. Beispielsweise drfen Sie EOF nicht im Modus Binary und die Funktion Input nicht im Modus Input verwenden. Sie haben versucht, auf eine Datei oder einen Datensatz zuzugreifen, die bzw. der von einem anderen Prozess gesperrt wurde, oder es fehlt das Schreibrecht, um auf dem entsprechenden Datentrger zu schreiben. Im angegebenen Laufwerk befindet sich kein Datentrger oder das Laufwerk wurde nicht verriegelt. Das Format der Pfadangabe ist nicht korrekt, das Ausgabegert untersttzt keine Schreiboperationen oder die Datei ist schreibgeschtzt. Der angegebene Pfad existiert nicht oder der Server, der ihn freigibt, ist nicht am Netz.

57

Fehler beim Lesen von/ Schreiben auf Gert Datei existiert bereits

Dateiorientierte Funktionen und Anweisungen

58

61

Datentrger voll

62

Einlesen hinter Dateiende

70

Zugriff verweigert

71 75

Datentrger nicht bereit Fehler beim Zugriff auf Pfad/Datei Pfad nicht gefunden

76

Hufige Laufzeitfehler im Zusammenhang mit Dateioperationen

In Form der On Error GoTo-Anweisung stellt Basic ein Mittel bereit, solchen Laufzeitfehlern zu begegnen. Mehr darber finden Sie im Abschnitt Fehlerbehandlung (S. 43).

Dateien
Um in Visual Basic eine Datei mit traditionellen Mitteln bearbeiten zu knnen, muss sie zunchst durch eine Open-Anweisung geffnet werden ein Vorgang, der unter anderem die Zugriffsrechte anderer Prozesse auf diese Datei einschrnken kann und ihr eine logische Dateinummer zuordnet. Diese Dateinummer ist fr alle folgenden Operationen anzugeben, die mit dieser Datei in Zusammenhang stehen. Die Zugriffsrechte auf die Datei oder Teile der Datei lassen sich auch danach noch mittels Lock- und Unlock-Anweisungen entsprechend den Erfordernissen handhaben. Sobald kein weiterer Zugriff auf die Datei mehr erfolgt, kann sie mittels Close geschlossen werden. Diese Operation schreibt gegebenenfalls noch nicht geschriebene Pufferinhalte und gibt die Dateinummer wieder frei.

1 30

ChDir- Anw eisung

Was die Dateioperationen betrifft, so ist zu beachten, dass Basic traditionell drei Dateikonzepte untersttzt, die sich darin unterscheiden, welche Art von Information gespeichert wird und wie der Zugriff auf diese Information erfolgt: die sequenzielle Datei (auch Textdatei genannt), die indexsequenzielle Datei und die Binrdatei. Fr jede dieser Dateiarten gibt es spezifische Operationen, die speziell auf ihren Zweck zugeschnitten sind. Sequenzielle Dateien enthalten durch spezifische Trennzeichen voneinander abgetrennte Zeichenfolgen, die textuelle Reprsentationen von Werten unterschiedlicher Datentypen darstellen. Zum Schreiben dieser Werte verwendet man die Anweisungen Print# und Write#, wobei erstere die gebietsspezifische Zeichenfolgendarstellung eines Werts generiert und letztere die internationale. Das Lesen besorgt dagegen die Anweisung Input# oder wenn auch die Trennzeichen gelesen werden sollen die Funktion Input. Im speziellen Fall von Textdateien ermglicht die Anweisung Line Input# das zeilenweise Lesen. Indexsequenzielle Dateien enthalten eine Folge von Datenstzen. Da alle Datenstze eine feste Lnge aufweisen, kann Basic die Position eines bestimmten Datensatzes aus der Datensatznummer und der Datensatzlnge errechnen, so dass keine Trennzeichen notwendig sind. Das Schreiben von Datenstzen besorgt die Anweisung Get und das Lesen die Anweisung Put. Binrdateien liegt dagegen a priori keine bestimmte Interpretation zugrunde. Sie werden als einfache Aneinanderreihung von Bytes behandelt, und es unterliegt der Verantwortung des Programms, sie zu einzelnen Werten fr Variablen der unterschiedlichen Datentypen zu gruppieren. Als Leseoperationen stehen dafr die Funktion Input und die Anweisung Get zur Verfgung und als Schreiboperation die Anweisung Put.

Dateiorientierte Funktionen und Anweisungen

ChDir- Anweisung
ChDir sPfad
Beschreibung

................................................... Bes c hreibung

Windows kennt und pflegt in der Systemumgebung eines Programms fr jedes Laufwerk ein aktuelles Arbeitsverzeichnis. Das standardmige Arbeitsverzeichnis (vgl. CurDir-Funktion, S. 134) ist das aktuelle Arbeitsverzeichnis auf dem standardmigen Laufwerk (vgl. ChDriveAnweisung, S. 132). Die Anweisung ChDir setzt sPfad als neues aktuelles Arbeitsverzeichnis auf dem in sPfad spezifizierten Laufwerk. Enthlt sPfad keine Laufwerksspezifikation, setzt die Funktion das standardmige Arbeitsverzeichnis auf sPfad.
Anwendung

................................................... Anwendung

Ist der in sPfad spezifizierte Pfad nicht existent, lst die Funktion den Laufzeitfehler 76, Pfad nicht gefunden aus. Solange das standardmige Arbeitsverzeichnis lokal auf dem Computer liegt, zeigt ChDir bei Angabe eines UNC-Pfads fr sPfad keine Wirkung meldet aber auch keinen Fehler. Ergibt sich dagegen die Situation, dass das standardmige Arbeitsverzeichnis auf einem anderen Computer liegt (vgl. CurDir-Funktion, S. 134) und somit bereits ein UNCPfad ist, kommt ChDir auch bei Angabe eines UNC-Pfads seiner Aufgabe nach.
Warnung

................................................... Wa rnung

Mit dem UNC-Pfad ist das so eine Sache. Wie unter CurDir nher ausgefhrt, besteht zwar die Mglichkeit, das standardmige Arbeitsverzeichnis von vornherein als UNC-Pfad zu erhalten, Visual Basic sieht aber keine Mittel vor, das standardmige Arbeitsverzeichnis, sofern es einmal auf ein lokales Verzeichnis gesetzt wurde, wieder auf einen anderen Computer (etwa einen File Server) im Netzwerk zu verlagern, sprich: in einen UNC-Pfad umzuwandeln. Damit knnte man natrlich leben, wenn sich ChDir darauf beschrnken wrde, ein UNC-Arbeitsverzeichnis bei Angabe eines UNC-Pfades als UNC-Arbeitsverzeichnis beizubehalten. Leider ist das jedoch

1 31

Dateiorientierte Funktionen und Anw eisungen

nicht so: ChDir setzt bei Angabe eines UNC-Pfads, der in das Dateisystem des lokalen Computers fhrt, ungefragt den Laufwerkspfad.
Beispiele

................................................... Beis piele

Angenommen das Programm, das den folgenden Code enthlt, ist im Verzeichnis C:\VB-Programme gelegen und wird ber den Explorer gestartet:
Print App.Path Print CurDir ChDir ".." Print CurDir ChDir "Windows" Print CurDir ChDir "C:\VB-Programme" Print CurDir ChDir "D:\Eigene Dateien" Print CurDir ChDrive "D" Print CurDir ' ' ' ' ' ' ' ' ' ' ' ' C:\VB-Programme C:\VB-Programme (wie App.Path) Ein Verzeichnis hher C:\ relativer Pfad C:\Windows absoluter Pfad auf Standardlaufwerk C:\VB-Programme absoluter Pfad auf Nicht-Standardlaufwerk C:\VB-Programme (C ist Standardlaufwerk) erst jetzt ndert sich Standardlaufwerk D:\Eigene Dateien (D ist Standardlaufwerk)

Dateiorientierte Funktionen und Anweisungen

Angenommen das Programm, das den folgenden Code enthlt, liegt im Verzeichnis \\Adler\c\VB-Programme\ und wird ber die Netzwerkumgebung des Explorers gestartet:
Print Print ChDir Print ChDir Print ChDir Print
Verwandte Befehle

App.Path CurDir ".." CurDir "Windows" CurDir "C:\VB-Programme" CurDir

' ' ' ' ' ' ' '

\\Adler\c\VB-Programme\ \\Adler\c\VB-Programme\ (wie App.Path) Ein Verzeichnis hher \\Adler\c\ relativer Pfad \\Adler\c\windows UNC-Pfad ist ab jetzt verloren C:\VB-Programme

................................................... Verwa ndte Befehle

ChDrive, CurDir

ChDrive- Anweisung
Sub ChDrive (sLaufw As String)
Beschreibung

................................................... Bes c hreibung

Windows kennt und pflegt in der Systemumgebung eines Programms fr jedes Laufwerk ein aktuelles Arbeitsverzeichnis. Die Anweisung ChDrive setzt das erste Zeichen von sLaufw als neues aktuelles Laufwerk. Das aktuelle Arbeitsverzeichnis auf diesem Laufwerk wird damit zum standardmigen Arbeitsverzeichnis.
Anwendung

................................................... Anwendung

Ist sLaufw eine leere Zeichenfolge, ndert ChDrive das aktuelle Laufwerk nicht, meldet aber auch keinen Fehler. Existiert das erste Zeichen von sLaufw nicht als logisches Laufwerk, lst die Funktion den Laufzeitfehler 68, Gert nicht verfgbar, aus.

1 32

Close- Anw eisung

Warnung

................................................... Wa rnung

Ergibt sich die Situation, dass das standardmige Arbeitsverzeichnis auf einem anderen Computer liegt (vgl. CurDir-Funktion, S. 134) und somit durch einen UNC-Pfad beschrieben wird, geht dieser mit dem nchsten Aufruf von ChDrive unwiederbringlich verloren, das heit, als standardmiges Arbeitsverzeichnis lassen sich fortan nur noch Verzeichnisse einstellen, auf die der Zugriff ber ein logisches Laufwerk erfolgen kann.
Beispiel

................................................... Beis piel

Siehe das Beispiel zu ChDir-Anweisung (S. 131).

Dateiorientierte Funktionen und Anweisungen

Verwandte Befehle

................................................... Verwa ndte Befehle

ChDir, CurDir

Close- Anweisung
Close [#]iDateiNr[, [#]DateiNr1, ...]
Beschreibung

................................................... Bes c hreibung

Die Anweisung Close schliet die unter den Dateinummern iDateiNr, iDateiNr1 usw. (mittels Open) geffneten Dateien oder Gerte. Gegebenenfalls existierende Schreibpuffer werden zuvor herausgeschrieben. Wird der Befehl ohne Parameter aufgerufen, schliet er alle mit Dateinummern assoziierten Dateien und Gerte.
Anwendung

................................................... Anwendung

Bevor ein Programm mit traditionellen Mitteln auf eine Datei oder ein Gert zugreifen kann, muss es eine Open-Anweisung durchfhren, die der Datei eine Dateinummer zuordnet und gegebenenfalls Pufferspeicher organisiert. Aus Grnden der Effizienz puffert Visual Basic alle Schreib- und Leseoperationen fr Dateien, die im Input-, Output- oder Append-Modus geffnet wurden, und fhrt sie blockweise aus. Das hat unter anderem die Folge, dass Schreiboperationen wie Print# ihre Daten nicht direkt auf den Datentrger schreiben, sondern immer erst, wenn der Schreibpuffer voll ist. Der Befehl Close hat nun folgende Funktionen: Er bewirkt fr jede genannte Dateinummer ein explizites Herausschreiben gegebenenfalls noch gefllter Schreibpuffer mit nachfolgender Freigabe des Puffers und der Dateinummer. Die Freigabe einer Dateinummer durch Close hebt gleichzeitig alle Zugriffsbeschrnkungen auf, die fr die betreffende Datei mittels Open und Lock getroffen wurden. Entgegen anders lautenden Informationen in der Online-Hilfe zu Visual Basic entfernt Close alle Sperren, die mit Lock gesetzt und nicht explizit mit Unlock freigegeben wurden.
Tipp

................................................... Tipp

Zwar schliet ein Visual-Basic-Programm bei Beendigung von sich aus alle Dateien und Gerte durch einen impliziten Close-Aufruf, dennoch ist es guter defensiver Programmierstil, eine Datei unmittelbar, nachdem der letzte Zugriff darauf erfolgt ist, wieder zu schlieen. Das verkrzt die Einschrnkungen, denen andere Programme in Bezug auf diese Datei ausgesetzt sind, auf ein Minimum.
Beispiel

................................................... Beis piel

Der folgende Code lsst sich in einem Programm einsetzen, dessen Aufrufe protokolliert werden sollen:

1 33

Dateiorientierte Funktionen und Anw eisungen

Open "Aufrufe.log" For Append As 1 Print #1, "Aufruf am "; Now Close 1
Verwandte Befehle

................................................... Verwa ndte Befehle

Open

CurDir- Funktion
Function CurDir[(sLaufw As String)] As String

Dateiorientierte Funktionen und Anweisungen

Beschreibung

................................................... Bes c hreibung

Windows kennt und pflegt in der Systemumgebung eines Programms fr jedes Laufwerk ein aktuelles Arbeitsverzeichnis und ein aktuelles Laufwerk. Im Allgemeinen ist das standardmige Arbeitsverzeichnis dann das aktuelle Arbeitsverzeichnis auf dem aktuellen Laufwerk. Die Funktion CurDir liefert das aktuelle Arbeitsverzeichnis auf dem Laufwerk sLaufw. Fehlt der optionale Parameter sLaufw, liefert die Funktion das standardmige Arbeitsverzeichnis.
Anwendung

................................................... Anwendung

Unmittelbar nach Programmstart entspricht das standardmige Arbeitsverzeichnis dem Verzeichnis, aus dem heraus der Start erfolgt ist. Erfolgt der Start direkt durch Aufruf der ausfhrbaren Datei aus einem Fenster des Explorers heraus, deckt sich das Arbeitsverzeichnis mit dem Programmverzeichnis (vgl. App.Path-Eigenschaft, S. 264). Wird der Programmstart dagegen von einem anderen Programm veranlasst, erbt das Visual-Basic-Programm schlicht das standardmige Arbeitsverzeichnis des Aufrufers. Das ist so, wenn der Aufruf aus einem Kommandozeileninterpreter oder Scripting-Host heraus erfolgt, wenn er von einem anderen Visual-Basic-Programm aus mittels einer Shell-Anweisung erfolgt oder wenn er ber eine Verknpfung fhrt, in deren Eigenschaften unter AUSFHREN IN ein anderer Pfad als das Programmverzeichnis eingetragen ist. Das ist aber auch so, wenn das standardmige Arbeitsverzeichnis des Aufrufers auf einem anderen Computer im Netzwerk liegt. In diesem Fall lsst sich das standardmige Verzeichnis nur als UNC-Pfad notieren, wenn es kein logisches Laufwerk fr die entsprechende Freigabe gibt.
Warnung

................................................... Wa rnung

Ist das standardmige Verzeichnis einmal ein Laufwerkspfad, lassen sich fortan nur noch solche Verzeichnisse als standardmiges Arbeitsverzeichnis setzen, die ber ein logisches Laufwerk ansprechbar sind. UNC-Pfade sind nicht mehr mglich.
Tipp

................................................... Tipp

Beim ffnen von Dateien, fr die kein absoluter Pfad spezifiziert ist, bezieht sich Visual Basic auf das ererbte Arbeitsverzeichnis. Das aber kann mal so und mal so aussehen, je nach dem, ob das Programm in der Entwicklungsumgebung, als kompilierte Fassung, ber eine Verknpfung oder aus einem Explorer-Fenster heraus gestartet wurde. Als probates Mittel, um einen definierten und situationsunabhngigen Ausgangspunkt fr das Laden von Hilfsdateien zu erhalten, empfiehlt es sich, entsprechende Pfadangaben auf die Exe-Datei zu beziehen und das standardmige Arbeitsverzeichnis via ChDir auf den Wert von App.Path zu setzen.
Beispiel

................................................... Beis piel

Siehe ChDir-Anweisung (S. 131)

1 34

Dir- Funktion

Verwandte Befehle

................................................... Verwa ndte Befehle

ChDir, ChDrive

Dir- Funktion
Function Dir [(sSuchmuster As String, _ [Attributvkt As VbFileAttribute = vbNormal])] As String
Beschreibung

................................................... Bes c hreibung

Die Funktion Dir kennt zwei unterschiedliche Arbeitsmodi. Wird sie unter Angabe eines Werts fr den optionalen Parameter sSuchmuster aufgerufen, interpretiert sie diesen als Suchmuster fr Dateinamen und liefert den ersten Dateinamen, der passt. Passt das Suchmuster auf keinen Dateinamen, gibt sie die leere Zeichenfolge zurck. Wird die Funktion Dir, nachdem sie einmal mit Suchmuster aufgerufen wurde, ohne den optionalen Parameter sSuchmuster aufgerufen, liefert sie den jeweils nchsten Dateinamen, der auf das Suchmuster passt. Der zweite optionale Parameter Attributvkt ermglicht die Angabe eines Attributvektors, der die Ergebnismenge um Dateien mit entsprechenden Attributen erweitert(!).
Anwendung

Dateiorientierte Funktionen und Anweisungen

................................................... Anwendung

Die beraus ntzliche Funktion Dir vereinigt in sich das Funktionsschema der Win32-APIFunktionen FindFirstFile, FindNextFile und FindClose. Um alle Dateinamen in einem Verzeichnis zu erhalten, die auf ein gegebenes Suchmuster passen und darber hinaus bestimmte Attribute aufweisen, legen Sie mit dem ersten Aufruf von Dir das Suchmuster und gegebenenfalls den Attributvektor fest und rufen Dir ab dann so oft parameterlos auf, bis die Funktion die leere Zeichenfolge liefert. Das Suchmuster besteht aus einem Pfadanteil (absolut oder relativ notiert) und einem Dateianteil, wobei der Pfadanteil das Verzeichnis spezifiziert, das durchsucht wird, und der Dateianteil ein Dateinamensmuster, das auch die Platzhalter ? (Zeichen an dieser Stelle wird nicht unterschieden) und * (Zeichen ab dieser Stelle werden nicht unterschieden) enthalten kann. Fehlt der Pfadanteil oder ist er relativ notiert, bezieht die Funktion den Pfad auf das standardmige Arbeitsverzeichnis (vgl. CurDir-Funktion, S. 134). Um den Namen eines Datentrgers zu erfahren, geben Sie das Stammverzeichnis des Laufwerks als Suchmuster an (z.B. C:\) und die Konstante vbVolume als Attributvektor. In anderen Pfaden hat vbVolume keine Wirkung. Die in der VbFileAttribute-Aufzhlung enthaltene Konstante vbAlias ist fr zuknftige Zwecke definiert. Unter Visual Basic 6.0 (SP3) lst sie einen Laufzeitfehler aus.
Warnungen

................................................... Wa rnungen
Da diese Funktion in der von Microsoft stammenden Dokumentation recht lieblos abgehandelt wurde, ist viel Falsches darber zu lesen, insbesondere was den Attributvektor betrifft. Richtig ist: Die Funktion schrnkt die Ergebnismenge nicht auf Dateien mit bestimmten Attributen ein, sondern sie erweitert die zu vbNormal gehrige Ergebnismenge um die Dateien, die eines der im Attributvektor genannten zustzlichen Attribute tragen. Die mit Visual Basic vorliegende Implementation von Dir ist nicht fr den rekursiven Aufruf geeignet. Das Beispiel zu RmDir-Anweisung (S. 155) zeigt einen Work-around. Ein Beispiel fr eine alternative Implementation, die speziell fr rekursive Prozeduren geeignet ist, finden Sie im Abschnitt Routinen aus DLLs und der Windows-API einsetzen (S. 185).

1 35

Dateiorientierte Funktionen und Anw eisungen

Tipp

................................................... Tipp

Falls Sie sich nur fr Dateien mit bestimmten Attributen interessieren, bergeben Sie Dir diese Attribute als Attributvektor und filtern dann die gewnschten Dateien mittels GetAttr aus der von Dir gelieferten Ergebnismenge selbst heraus.
Beispiel

................................................... Beis piel

Das folgende Codefragment liefert alle Dateien im Verzeichnis C:\Eigene Dateien, deren Dateiname mit T beginnt, mindestens zwei Zeichen enthlt und die Erweiterung txt trgt:

Dateiorientierte Funktionen und Anweisungen

sDatName = Dir("C:\Eigene Dateien\T?*.txt") While sDatName <> "" Print sDatName Dir Wend

Und dieses Codefragment liefert nur die Dateien aus dem Verzeichnis C:\, die verborgen und schreibgeschtzt sind:
Attr = vbHidden + vbReadOnly Pfad = "C:\" sDatName = Dir(Pfad + "*.*", Attr) While sDatName <> "" If (GetAttr(Pfad + sDatName) And Attr) = Attr Then ' Filter Print sDatName End If sDatName = Dir Wend
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

ChDir, CurDir, FileDateTime, GetAttr


Verwandte Themen

Routinen aus DLLs und der Windows-API einsetzen (S. 185)

Environ- Funktion
Function Environ(sEnvVar As String) Function Environ(iEnvIndex As Integer)
Beschreibung

................................................... Bes c hreibung

Wird die Funktion Environ mit einer Zeichenfolge als Parameter aufgerufen, spezifiziert sEnvVar den Namen einer Umgebungsvariablen. Environ liefert dann den Wert dieser Umgebungsvariablen oder die leere Zeichenfolge, wenn diese nicht bekannt ist. Bei Aufruf der Funktion mit einem Zahlenwert liefert die Funktion dagegen die durch iEnvIndex spezifizierte Zeile aus der Umgebungsdefinition oder die leere Zeichenfolge, falls die Umgebungsdefinition weniger Zeilen umfasst.

1 36

EOF- Funktion

Anwendung

................................................... Anwendung

Auch wenn diese Funktion nicht unmittelbar etwas mit Dateizugriffen zu tun hat, mittelbar hat sie es schon, weil sie Informationen ber vordefinierte Pfade (PATH, TEMP, TMP, windir, winbootdir usw.) liefert.
Beispiel

................................................... Beis piel

Der folgende Code gibt die gesamte Umgebungsinformation eines Programms aus:
i = 1 While Environ(i) <> "" Print Environ(i) i = i + 1 Wend

Dateiorientierte Funktionen und Anweisungen

Vgl. auch das Beispiel zu Kill-Anweisung (S. 144).

EOF- Funktion
Function EOF(iDateiNummer As Integer) As Boolean
Beschreibung

................................................... Bes c hreibung

Die Funktion EOF liefert True, wenn das Dateiende einer unter der Nummer iDateiNummer geffneten Datei beim Lesen erreicht ist, ansonsten False.
Anwendung

................................................... Anwendung

Leseoperationen auf Dateien knnen nur so lange durchgefhrt werden, bis das Dateiende erreicht ist. Um festzustellen, ob dies der Fall ist, wird die Funktion EOF eingesetzt. Bei Dateien, die mit dem Zugriffsmodus Input geffnet wurden, liefert sie False, wenn die letzte Leseoperation (meist Line Input #) durch das Ende der Datei beendet wurde. Im Zusammenhang mit den Zugriffsmodi Binary und Random liefert sie True, wenn die letzte Leseoperation (Input bzw. Get) aufgrund des Dateiendes nicht oder nicht vollstndig ausgefhrt werden konnte.
Warnung

................................................... Wa rnung

Die Online-Hilfe zu EOF bezichtigt diese Funktion, Laufzeitfehler zu produzieren, wenn sie im Zugriffsmodus Binary fr die Kontrolle der Input-Funktion benutzt wird. Das ist falsch. Input ist so implementiert, dass es im Modus Binary generell keinen Laufzeitfehler auslst. Zu einem Laufzeitfehler kann es dagegen kommen, wenn EOF im Zugriffsmodus Input fr die Kontrolle der Funktion Input benutzt wird und diese mehr als ein Zeichen je Aufruf liest.
Beispiel

................................................... Beis piel

Der folgende Code liest die Textdatei Scandisk.log zeilenweise fr die Ausgabe durch Print:
Open "c:\scandisk.log" For Input As 1 While Not EOF(1) Line Input #1, sZeile Print sZeile Wend Close 1

1 37

Dateiorientierte Funktionen und Anw eisungen

Verwandte Befehle

................................................... Verwa ndte Befehle

LOF, Loc, Get, Input, Line Input, Open, Seek

FileAttr- Funktion
Function FileAttr(iDateiNummer As Integer[, iTyp As Integer = 1])
Beschreibung

................................................... Bes c hreibung

Dateiorientierte Funktionen und Anweisungen

Die Funktion FileAttr liefert eine Aussage darber, in welchem Modus die zu der Dateinummer iDateiNummer gehrige Datei geffnet wurde. Es sind folgende Funktionswerte mglich: 1 steht fr Input, 2 fr Output, 4 fr Random, 8 fr Append und 32 fr Binary.
Anwendung

................................................... Anwendung

Der zweite, optionale Parameter wird nur noch aus Kompatibilittsgrnden mitgeschleppt. Er hatte eine Bedeutung, als es noch 16-Bit-Systeme gab. Auf 32-Bit-Systemen muss er 1 sein.
Beispiel

................................................... Beis piel


' Ausgabe: 32

Open sDatei For Binary As 2 Print FileAttr(2) Close2


Verwandte Befehle

................................................... Verwa ndte Befehle

Open

FileCopy- Anweisung
Sub FileCopy(sQuellDatei As String, sZielDatei As String)
Beschreibung

................................................... Bes c hreibung ................................................... Anwendung

Die Anweisung FileCopy erstellt eine Kopie der Datei sQuellDatei als sZielDatei.
Anwendung

Es versteht sich, dass sQuellDatei einen gltigen Pfad zu einer existierenden Datei und sZielDatei einen gltigen Pfad mit gltigem Dateinamen enthalten mssen. Die Funktion lst verschiedene Laufzeitfehler aus so den Laufzeitfehler 76, wenn mit den Pfaden etwas nicht in Ordnung ist, den Laufzeitfehler 53, wenn die Datei nicht existiert, und den Laufzeitfehler 55, wenn die Datei zum Schreiben geffnet wurde.
Warnung

................................................... Wa rnung

Sollte unter dem Dateinamen sZielDatei bereits eine andere Datei existieren, wird diese kommentarlos berschrieben.
Beispiel

................................................... Beis piel

FileCopy sQuellDatei, sZieldatei


Verwandte Befehle

................................................... Verwa ndte Befehle

Kill, Name

1 38

FileDateTime- Funktion

FileDateTime- Funktion
Function FileDateTime(sDatei As String) As Date
Beschreibung

................................................... Bes c hreibung

Die Funktion FileDateTime liefert das letzte nderungsdatum bzw. das Erstellungsdatum der Datei oder des Verzeichnisses sDatei als Datums-/Zeitwert.
Beispiel

................................................... Beis piel


' Datum der Windows-Installation

Print FileDateTime ("C:\Windows")


Verwandte Befehle

Dateiorientierte Funktionen und Anweisungen

................................................... Verwa ndte Befehle

FileLen, GetAttr

FileLen- Funktion
Function FileLen(sDatei As String) As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion FileDateTime liefert die Lnge der Datei sDatei in Bytes. Spezifiziert sDatei ein Verzeichnis, gibt die Funktion den Wert 0 zurck.
Anwendung

................................................... Anwendung

Ein Aufruf dieser Funktion fr eine zum Schreiben geffnete Datei liefert die Lnge der Datei, bevor diese zum Schreiben geffnet wurde. Die aktuelle Lnge einer bereits geffneten Datei ermittelt die Funktion LOF.
Beispiel

................................................... Beis piel


' muss grer 1024 Bytes sein

Print FileLen("C:\Msdos.sys")
Verwandte Befehle

................................................... Verwa ndte Befehle

FileDateTime, GetAttr, LOF

FreeFile- Funktion
Function FreeFile[(iBereich As Integer)]
Beschreibung

................................................... Bes c hreibung

Die Funktion FreeFile liefert jeweils die kleinste freie Dateinummer im Block iBereich. Fehlt der optionale Parameter iBereich oder hat er den Standardwert 0, entstammt die gelieferte Dateinummer dem Block 0 bis 255, ansonsten dem Block 256 bis 512.
Anwendung

................................................... Anwendung

Nachdem Dateinummern globale Gren in einem Modul sind, ist es in greren Programmen oft schwierig, den berblick darber zu behalten, welche bereits vergeben sind und welche nicht. Indem Sie sich neue Dateinummern von FreeFile zuteilen lassen, entlasten Sie sich von der gesamten Problematik.

1 39

Dateiorientierte Funktionen und Anweisungen

Beispiel

................................................... Beis piel

iBer = FreeFile Open sDatei For Input As iBer ... Close iBer

Vgl. auch das Beispiel im Abschnitt Fehlerbehandlung (S. 43).


Verwandte Befehle

................................................... Verwa ndte Befehle

Dateiorientierte Funktionen und Anweisungen

Open

Get- Anweisung
Get [#]iDateiNr, [lSatzNr], Variable
Beschreibung

................................................... Bes c hreibung

Die Anweisung Get ist das Gegenstck zur Anweisung Put. Sie liest Daten aus der Datei mit der Dateinummer iDateiNr und weist diese der Datensatzvariablen Variable als Wert zu. Bei Angabe einer Satznummer lSatzNr liest die Anweisung im Modus Random den entsprechenden Datensatz unter Bercksichtigung der bei der Open-Anweisung vereinbarten Datensatzlnge und im Modus Binary ab der Byteposition lSatzNr. Fehlt lSatzNr, liest die Anweisung jeweils den nchsten Datensatz (Random) bzw. ab der aktuellen Leseposition (Binary) und aktualisiert danach den Datensatzzeiger bzw. die aktuelle Leseposition. Die Datensatzvariable kann einen beliebigen Typ tragen. Objekte lassen sich mittels Get jedoch nicht en bloc einlesen.
Anwendung

................................................... Anwendung

Wenn es um das Schreiben und Lesen von Dateiformaten ging, waren Get und Put schon immer die Arbeitspferde der Sprache Basic. Die Arbeitsweise dieser Anweisungen ist traditionell auf indexsequenzielle Dateien zugeschnitten, deren Bearbeitung im Modus Random erfolgt. Get und Put werden aber auch jedoch mit leicht modifizierter Arbeitsweise im Modus Binary eingesetzt.

Der Modus Random


Beim ffnen von Dateien im Modus Random wird normalerweise eine Datensatzlnge in Bytes festgelegt, die fortan bestimmt, wie viele Byte mit jeder Get- bzw. Put-Operation je Datensatz gelesen bzw. geschrieben werden. Die Zhlung der Datenstze beginnt bei 1. Den Bytebedarf der elementaren Datentypen entnehmen Sie der Tabelle im Abschnitt Elementare Datentypen (S. 49); den von Datentypen mit fester Lnge sowie von benutzerdefinierten Datentypen ermittelt man am besten mittels LenB, da die Speicherausrichtung der Datenfelder noch eine zustzliche Rolle spielt. Trgt die Datensatzvariable einen Typ variabler Lnge (bzw. einen Typ, der Felder variabler Lnge enthlt), muss der Datensatz einen Deskriptor (lies: Lngenangabe) enthalten. Dabei gilt, dass ein Deskriptor dem Wert unmittelbar vorausgeht. Mithin muss also der Lngenbedarf eines oder mehrerer Deskriptoren bei der Berechnung der Datensatzlnge bercksichtigt werden. Fr Zeichenfolgen variabler Lnge schlagen dabei 2 Lngenbyte (!) zu Buche, fr Variant-Variablen gleichfalls zunchst 2 Bytes fr den VarType-Typ plus gegebenenfalls weitere Lngenbyte fr Wertanteile mit variablen Lngen. Dynamische Arrays schlagen mit 2 Bytes fr den Array-Deskriptor zu Buche plus 8 Bytes je Dimension. Die maximale Datensatzlnge betrgt 32.767.

1 40

Get- Anw eisung

Die Wertzuweisung an Variablen mit Datentypen fester Lnge erfolgt als linksbndige Prokrustes-Zuweisung (vgl. LSet-Anweisung, S. 80), wenn die Datensatzlnge nicht dem Lngenbedarf der Variablen entspricht.

Der Modus Binary


Fr den Modus Binary gilt im Wesentlichen dasselbe, mit folgenden Abweichungen: Eine Datensatzlnge wird nicht bercksichtigt, und die Anweisung liest ab der aktuellen Position bzw. der Position lSatzNr so viele Bytes, wie fr den Wert der Datensatzvariablen erforderlich sind. Zeichenfolgen variabler Lnge behandelt Get daher wie Zeichenfolgen fester Lnge und liest nur so viele Zeichen, wie der Wert der String-Variablen aktuell enthlt ein Deskriptoranteil entfllt somit. Analoges gilt auch fr Arrays. Im Zusammenhang mit benutzerdefinierten Datentypen finden Deskriptoranteile einzelner Datenfelder jedoch sehr wohl Bercksichtigung.
Warnung

Dateiorientierte Funktionen und Anweisungen

................................................... Wa rnung

Get liest ANSI-Zeichenfolgen als Unicode und Put schreibt Unicode-Zeichenfolgen als ANSICode.
Beispiel

................................................... Beis piel

Der folgende Code schreibt eine Zeichenfolge und einen Double-Wert in eine indexsequenzielle Datei und liest diese Werte dann einmal im Modus Random und einmal im Modus Binary:
' Schreiben der Daten Open "Test.Idx" For Random As 1 Len = 8 Dim sDatenSatz As String ' Zeichenfolge (Unicode!) Dim a As Double ' Double-Wert sDatenSatz = "abc" ' Initialisierung a = 2.1E-122 Put 1, , sDatenSatz ' erster Datensatz wird geschrieben Put 1, 17, a ' 17ter Datensatz Close 1 ' Lesen der Daten im Modus Random sDatenSatz = "" a = 0 Open "Test.Idx" For Random As 1 Len Get 1, , sDatenSatz Print Len(sDatenSatz); sDatenSatz Get 1, 17, a Print a Close 1 ' Lesen der Daten im Modus Binary sDatenSatz = Space(3) a = 0 Open "Test.Idx" For Binary As 1 Get 1, 3, sDatenSatz Print Len(sDatenSatz), sDatenSatz Get 1, (17 1) * 8 + 1, a Print a Close 1

' Initialisierung = 8 ' erster Datensatz wird gelesen ' Ausgabe: "3 abc" (Deskriptor!) ' Doublewert braucht 8 Bytes! ' Ausgabe: 2,1E-122

' drei Unicodezeichen sind zu lesen ' Initialisierung ' ' ' ' Deskriptoranteil berspringen! Ausgabe: "3 abc" (Deskriptor!) Datensatzlnge 8 einberechnen Ausgabe: 2,1E-122

1 41

Dateiorientierte Funktionen und Anw eisungen

Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Input, Input#, Line Input#, Open, LenB, LSet, Print#, Put


Verwandte Themen

Elementare Datentypen (S. 49); Benutzerdefinierte Datentypen (S. 60)

GetAttr- Funktion
Function GetAttr(sPfad As String) As Integer

Dateiorientierte Funktionen und Anweisungen

Beschreibung

................................................... Bes c hreibung

Die Funktion GetAttr liefert die Attribute der Datei oder des Verzeichnisses sPfad als Attributvektor.
Anwendung

................................................... Anwendung

Um festzustellen, ob in dem Attributvektor ein bestimmtes Attribut (als Bit) gesetzt ist, fhren Sie eine And-Operation mit dem fr das Attribut definierten Wert durch. Als Element des Aufzhlungstyps VbFileAttribute ist fr ihn eine Konstante definiert. Zur Auswahl stehen: Konstante vbNormal vbReadOnly vbHidden vbSystem vbVolume vbDirectory vbArchive Wert 0 1 2 4 8 16 32 Beschreibung Keines der Bits im Attributvektor ist gesetzt. Es handelt sich um eine gewhnliche Datei. Datei/Verzeichnis ist schreibgeschtzt. Datei/Verzeichnis ist verborgen. Datei ist Systemdatei bzw. Verzeichnis ist Systemverzeichnis. Logischer Datentrger (wird von GetAttr nicht geliefert) Verzeichnis Datei wurde seit der letzten Datensicherung gendert

Konstanten fr Dateiattribute
Beispiel

................................................... Beis piel

Dim Attribut As VbFileAttribut Attribut = vbHidden If Attribut And GetAttr(sDatei) Then

' Datei ist verborgen

Wie man das Vorhandensein mehrerer Attribute prft, zeigt das Beispiel zur Dir-Funktion (S. 135).
Verwandte Befehle

................................................... Verwa ndte Befehle

Dir, FileAttr, SetAttr

Input- und InputB- Funktion


Function Input(lZeichenAnz, [#]iDateiNr) As String Function InputB(lBytes, [#]iDateiNr) As String

1 42

Input #- Anweisung
Beschreibung

................................................... Bes c hreibung

Die Funktion Input liest lBytes Bytes aus der unter der Dateinummer iDateiNr im Modus Input oder Binary geffneten Datei und liefert diese als Unicode-Zeichenfolge, wobei aus jedem Byte ein Unicode-Zeichen wird. In Abweichung dazu liefert InputB ein echtes Byte-Array in Form einer ANSI-Zeichenfolge.
Anwendung

................................................... Anwendung

Traditionell ist Input (heute InputB genannt) die Leseoperation fr Binrdateien (Modus: Binary), Get die Leseoperation fr indexsequenzielle Dateien (Modus: Random) und Input# die Leseoperation fr Textdateien (Modus: Input). Binrdateien lassen sich aber genauso gut auch mit Get lesen und Textdateien mit Input. Im Gegensatz zu Input# liefert Input alle gelesenen Zeichen, einschlielich Kommas, Wagenrcklaufzeichen (Chr(13) bzw. vbCr), Zeilenvorschubzeichen (Chr(10) bzw. vbLf), Anfhrungszeichen und fhrende Leerzeichen.
Warnung

Dateiorientierte Funktionen und Anweisungen

................................................... Wa rnung

Fallen Sie nicht darauf herein, dass Input einzelne Bytes in Unicode-Zeichen umwandelt und somit aus einem Byte zwei Bytes macht. Um wirklich die gelesene Bytefolge zu erhalten, mssen Sie mit InputB arbeiten. Wenn Sie Input oder InputB beim Lesen einer Textdatei mittels EOF kontrollieren wollen, riskieren Sie einen Laufzeitfehler, sobald die Funktion mehr als ein Byte auf einmal lesen muss. Man arbeitet in diesem Fall besser mit dem Wert von LOF bzw. der Differenz aus den Werten von LOF und Seek.
Beispiel

................................................... Beis piel


' Textdatei ' Gesamte Datei auf einmal lesen ' Binrdatei ' Gesamte Datei als Bytearray lesen

Open sTextDatei For Input As 1 sGesamteDatei = Input(LOF(1), 1) Close 1 Open sBinrDatei For Binary As 1 sGesamteDatei = InputB(LOF(1), 1) Close 1
Verwandte Befehle

................................................... Verwa ndte Befehle

Get, Print#, Put, LOF, EOF

Input #- Anweisung
Input #iDateiNr, Variable[, Variable ...]
Beschreibung

................................................... Bes c hreibung

Die Anweisung Input# liest den im literalen Standardformat reprsentierten Wert einer oder mehrerer Variablen aus einer sequenziellen Datei, die im Modus Input oder Binary geffnet wurde. Als Trennzeichen zwischen zwei aufeinander folgenden Werten wertet die Anweisung ein Komma oder ein Wagenrcklaufzeichen Chr(13) bzw. vbCr sowie die Kombination Chr(13)+Chr(10) bzw. vbCrLf. Fhrende und abschlieende Leerzeichen sowie doppelte Anfhrungszeichen schneidet die Anweisung ab.

1 43

Dateiorientierte Funktionen und Anw eisungen

Anwendung

................................................... Anwendung

Der traditionelle Zweck der Anweisung Input# ist, Daten aus sequenziellen Dateien zu lesen, denen unterschiedliche Datentypen zugrunde gelegt sind. Die Anweisung nimmt daher beim Lesen des Werts fr eine Variable eines bestimmten Datentyps von sich aus eine entsprechende Typumwandlung vor.
Warnung

................................................... Wa rnung

Dateiorientierte Funktionen und Anweisungen

Im Unterschied zu Line Input# interpretiert Input# auch Kommas als Trennzeichen, wenn diese nicht von Anfhrungszeichen eingeschlossen sind. Daher hat die Funktion insbesondere Schwierigkeiten mit dem Einlesen von Dezimalzahlen mit Nachkommaanteil sowie Datumswerten, wenn diese mit Print# geschrieben wurden. Print# legt der textuellen Darstellung von Zahlen- und Datumswerten nmlich das gebietsspezifische Format zugrunde. Fr das Gebietsschema Deutsch (Standard) ist das Dezimaltrennzeichen ein Komma, und das Datumsformat ist komplett anders als das amerikanische. Sie sollten die Daten daher mit der Write#-Anweisung in die Datei schreiben, weil diese grundstzlich das internationale Standardformat benutzt, das auch fr die Notation von Literalen im Quelltext verwendet wird.
Beispiel

................................................... Beis piel

' Daten schreiben Open "test.seq" For Output As 1 Write #1, 270; "Er sagte, ""Hi!""" ' Die Anweisung schreibt 2 Werte (!) Close 1 ' Daten lesen Dim i As Integer, a As String, b As String Open "test.seq" For Input As 1 Print Input(24, 1) ' So steht es in der Datei: 270,"Er sagte, ""Hi!""" Seek 1, 1 ' Lesezeiger wieder an den Anfang Input #1, i, a, b ' Die Anweisung liest drei Werte (!), wegen " Print i, a, b ' Ausgabe: 270 Er sagte, Hi!
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

EOF, Get, Line Input#, Input, Print#, Put, Write#


Verwandte Themen

Literale und Konstanten (S. 27)

Kill- Anweisung
Sub Kill(sSuchmuster As String)
Beschreibung

................................................... Bes c hreibung

Die Anweisung Kill lscht alle Dateien, deren Dateiname auf das Suchmuster sSuchmuster passt.
Anwendung

................................................... Anwendung

Das Suchmuster besteht aus einem Pfadanteil (absolut oder relativ notiert) und einem Dateianteil, wobei der Pfadanteil das Verzeichnis spezifiziert, das durchsucht wird, und der Dateianteil ein Dateinamensmuster, das auch die Platzhalter ? (Zeichen an dieser Stelle wird nicht unter-

1 44

Line Input #- Anweisung


schieden) und * (Zeichen ab dieser Stelle werden nicht unterschieden) enthalten kann. Fehlt der Pfadanteil oder ist er relativ notiert, bezieht die Anweisung den Pfad auf das standardmige Arbeitsverzeichnis (vgl. CurDir-Funktion, S. 134).
Beispiel

................................................... Beis piel

sPfad = Environ("Temp") if sPfad <> "" Then Kill(sPfad + "*.tmp")


Verwandte Befehle

................................................... Verwa ndte Befehle

RmDir

Dateiorientierte Funktionen und Anweisungen

Line Input #- Anweisung


Line Input #iDateiNr, sVariable
Beschreibung

................................................... Bes c hreibung

Die Anweisung Line Input# liest eine Textzeile aus einer sequenziellen Datei, die im Modus Input oder Binary geffnet wurde, und weist diese der Zeichenfolgenvariablen sVariable als Wert zu. Als Trennzeichen zwischen zwei aufeinander folgenden Textzeilen wertet die Anweisung das Wagenrcklaufzeichen Chr(13) bzw. vbCr sowie die Kombination Chr(13)+Chr(10) bzw. vbCrLf.
Anwendung

................................................... Anwendung

Der traditionelle Zweck der Anweisung Line Input# ist, Zeichenfolgen fr die Textverarbeitung aus sequenziellen Dateien zu lesen. Im Unterschied zu Input# behandelt Line Input# weder Kommas als Trennzeichen, noch schneidet die Anweisung Leerzeichen und doppelte Anfhrungszeichen ab. Zum Schreiben der Daten, die mit Line Input# gelesen werden sollen, verwenden Sie am besten Print#.
Beispiel

................................................... Beis piel

Der folgende Code liest eine Textdatei zeilenweise in ein dynamisches Zeichenfolgenarray.
Dim sZeilen() As String Dim lZeilen As Long Open "Textdatei.txt" For Input As 1 While Not EOF(1) ReDim Preserve sZeilen(lZeilen + 1) As String Line Input #1, sZeilen(UBound(sZeilen)) lZeilen = UBound(sZeilen) Wend
Verwandte Befehle

................................................... Verwa ndte Befehle

EOF, Get, Input, Input#, Print#, Put, Write#

1 45

Dateiorientierte Funktionen und Anw eisungen

Loc- Funktion
Function Loc(iDateiNr As Integer) As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion Loc liefert abhngig vom Modus, in dem die Datei mit der DateiNr geffnet wurde, die Nummer des zuletzt bearbeiteten Datensatzes oder die Position des zuletzt gelesenen oder geschriebenen Bytes.
Anwendung

................................................... Anwendung

Dateiorientierte Funktionen und Anweisungen

Visual Basic verwaltet fr jede Datei einen Dateizeiger, der die aktuelle Schreib-/Leseposition angibt. Den nackten Wert dieses Zeigers liefert die Funktion Seek als Byte-Nummer, gleich in welchem Modus eine Datei geffnet wurde. Loc liefert dagegen den logischen Dateizeiger. Im Modus Binary unterscheidet sich der Wert des logischen Dateizeigers von dem des gewhnlichen Dateizeigers dahingehend, dass er um 1 kleiner ist als dieser. Im Modus Random hat der logische Dateizeiger dagegen den Wert des zuletzt gelesenen oder geschriebenen Datensatzes. Es gilt die Formel: ( Dateizeiger 1 ) Datensatznummer = ---------------------------------------------Datensatzlnge Mithin liefert Loc vor der ersten Dateioperation den Wert 0.
Warnung

................................................... Wa rnung

Loc liefert fr sequenzielle Dateien zwar einen Wert, dieser ist aber unbrauchbar, da er auf eine Datensatzlnge von 128 gemnzt ist. Sie arbeiten in diesem Fall besser mit Seek.
Beispiel

................................................... Beis piel

Open "test.idx" For Random As 1 Len = Datensatzlnge For i = 1 To iDatenstze Put 1, , bdt(i) Next Print Loc(1) ' Wert von iDatenstze Close1
Verwandte Befehle

................................................... Verwa ndte Befehle

EOF, LOF, Seek

Lock- Anweisung
Sub Lock([#]iDateiNr As Integer[, lDatensatz As Long]) Sub Lock([#]iDateiNr As Integer, [lStartNr As Long] To lEndNr As Long)
Beschreibung

................................................... Bes c hreibung

Die Anweisung Lock sperrt einen einzelnen Datensatz lDatensatz oder einen Bereich von Datenstzen lStartNr bis lEndNr in der Datei mit der Dateinummer iDateiNr vor dem Zugriff durch andere Prozesse. Fehlt bei Gebrauch der ersten Syntax der optionale Parameter lDatensatz, verhngt die Anweisung die Sperre ber die gesamte Datei. Fehlt bei Gebrauch der zweiten Syntax der optionale Parameter lStartNr, sperrt die Anweisung alle Datenstze von der Nummer 1 bis zur Nummer lEndNr. Bei Dateien, die im Modus Binary geffnet wurden, beziehen sich die Bereichsangaben auf Positionen des Dateizeigers.

1 46

LOF- Funktion

Anwendung

................................................... Anwendung

Wenn in einem System oder in einem Netzwerk mehrere Programme gleichzeitig Schreibzugriffe auf dieselbe Datei durchfhren, kann das recht unangenehme Inkonsistenzen zur Folge haben. Das Anweisungspaar Lock/Unlock ermglicht es einem Programm, sich temporr die Exklusivrechte fr das Beschreiben eines gewissen Teils der Datei zu sichern. Lock lst den Laufzeitfehler 70, Zugriff verweigert, aus, wenn ein anderes Programm bereits eine Sperre auf einen Bereich hlt, der mit dem angegebenen Bereich berlappt.
Warnung

................................................... Wa rnung

Dateiorientierte Funktionen und Anweisungen

Bei Lock/Unlock-Anweisungen fr sequenzielle Dateien (Input, Output, Append) ignoriert Visual Basic Bereichsangaben und sperrt immer die gesamte Datei. Entgegen anders lautenden Informationen in der Online-Hilfe zu Visual Basic 6.0 entfernt Close (respektive das Programmende) jedoch alle Sperren, die mit Lock gesetzt und nicht explizit mit Unlock freigegeben wurden. Sie sollten aber dennoch darauf achten, jede Lock-Anweisung mit einer Unlock-Anweisung zu paaren, um errichtete Sperren zum frhestmglichen Zeitpunkt wieder aufzuheben.
Beispiel

................................................... Beis piel

Der folgende Code schreibt eine Reihe von Datenstzen in die gemeinsame genutzte Datei Kunden.idx:
Open "Kunden.idx" For Random As 1 Len = Datensatzlnge On Error GoTo Fehler70 Lock 1, lStartBereich To lEndBereich ' Sperre errichten On Error GoTo 0 For i = lStartBereich To lEndBereich Put 1, i, bdt(i) Next Unlock 1, lStartBereich To lEndBereich ' Sperre aufheben Close 1
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Open, Unlock
Verwandte Themen

Fehlerbehandlung (S. 43)

LOF- Funktion
Function LOF(iDateiNummer As Integer) As Long
Beschreibung

................................................... Bes c hreibung

Die Funktion LOF liefert die Lnge der unter der Nummer iDateiNummer geffneten Datei in Bytes.
Anwendung

................................................... Anwendung

Wo immer die Lnge einer geffneten Datei eine Rolle spielt, beispielsweise wenn es darum geht, eine Datei en bloc mittels Input einzulesen oder die Anzahl der bereits geschriebenen Bytes (nicht jedoch Datenstze) zu ermitteln, ist LOF das Mittel zum Zweck.

1 47

Dateiorientierte Funktionen und Anw eisungen

Tipp

................................................... Tipp ................................................... Beis piel

Die Lnge einer noch nicht geffneten Datei ermittelt die Funktion FileLen.
Beispiel

Der folgende Code liest die unter der Dateinummer 1 geffnete Datei in einem Stck:
sDatei = Input(LOF(1), 1)
Verwandte Befehle

................................................... Verwa ndte Befehle

Dateiorientierte Funktionen und Anweisungen

Loc, FileLen, Get, Input, Line Input, Open, Seek

LSet- Anweisung
LSet sString1 = sString2 LSet bdtVar = bdtWert Siehe LSet-Anweisung (S. 80).

MkDir- Anweisung
Sub MkDir(sVerzeichnisname As String)
Beschreibung

................................................... Bes c hreibung ................................................... Anwendung

Die Anweisung MkDir legt unter dem Namen sVerzeichnisname ein neues Verzeichnis an.
Anwendung

Der Wert des Parameters sVerzeichnisname kann ein (absoluter oder relativer) UNC-Pfad oder Laufwerkspfad sein. Enthlt sVerzeichnisname keinen Pfadanteil, legt die Anweisung das Verzeichnis als Unterverzeichnis des standardmigen Verzeichnisses an (vgl. CurDir-Funktion, S. 134). Falls das Verzeichnis bereits existiert oder die Rechte fr das Anlegen des Verzeichnisses nicht ausreichen, lst die Anweisung den Laufzeitfehler 75, Fehler beim Zugriff auf Pfad/ Datei, aus.
Beispiel

................................................... Beis piel

MkDir "C:\Visual-Basic-Daten\MeineDaten" ' Laufwerkspfad MkDir "\\Tiger\c\Visual-Basic-Daten\MeineDaten" ' UNC-Pfad


Verwandte Befehle

................................................... Verwa ndte Befehle

ChDir, CurDir, RmDir

Name- Anweisung
Name sAlterDateiname As sNeuerDateiname
Beschreibung

................................................... Bes c hreibung

Die Anweisung Name ndert den Namen der Datei oder des Verzeichnisses sAlterDateiname in sNeuerDateiname. Falls sich die Pfadanteile von sAlterDateiname und sNeuerDateiname unterscheiden, wird die Datei bzw. das Verzeichnis verschoben.

1 48

Open- Anw eisung

Anwendung

................................................... Anwendung

Die Werte der Parameter sAlterDateiname und sNeuerDateiname knnen (absolute oder relative) UNC-Pfade oder Laufwerkspfade sein. Fehlt ein Pfadanteil, bezieht sich die Anweisung auf das standardmige Verzeichnis (CurDir-Funktion, S. 134). Name lsst sich nur auf einzelne Dateien und Verzeichnisse anwenden, Platzhalterzeichen wie * oder ? kann die Anweisung nicht interpretieren sie lsen den Laufzeitfehler 52, Dateiname oder -Nummer falsch, aus. Falls die Datei oder das Verzeichnis sAlterDateiname nicht existiert, lst die Anwendung den Laufzeitfehler 53, Datei nicht gefunden, aus. Existiert dagegen sNeuerDateiname bereits als Datei oder Verzeichnis, kommt es zum Laufzeitfehler 58, Datei existiert bereits.

Dateiorientierte Funktionen und Anweisungen

Beispiel

................................................... Beis piel

Kill sPfad + "Daten.dat" Name sPfad + "Daten.tmp" As sPfad + "Daten.dat


Verwandte Befehle

................................................... Verwa ndte Befehle

Kill

Open- Anweisung
Open sName For Modus [Access Zugriffsart] [Sperre] As [#] iNr [Len = lDatensatzlnge]
Beschreibung

................................................... Bes c hreibung

Die Anweisung Open ffnet die Datei sName und ordnet ihr fr den weiteren Zugriff die Dateinummer iNr zu. Zugleich legt die Anweisung einen Bearbeitungsmodus Modus fest, der als Input, Output, Random oder Binary anzugeben ist. Mittels des optionalen Schlsselwortes Access gefolgt von Read, Write oder Read Write fr Zugriff lsst sich zudem die Art des Zugriffs genauer festlegen. Darber hinaus besteht die Mglichkeit, fr den indexsequenziellen Zugriff im Modus Random eine Datensatzlnge lDatensatzlnge zwischen 1 und 32767 als Len-Zusatz anzugeben.
Anwendung

................................................... Anwendung

Fr den schreibenden oder lesenden Zugriff auf eine Datei ist es erforderlich, diese zuvor mit Open unter Angabe des entsprechenden UNC- oder Laufwerkspfades zu ffnen. Dabei kann es sich um einen absoluten oder relativen Pfad handeln. Ist sName nur als Dateiname ohne Pfadanteil spezifiziert, geht die Anweisung davon aus, dass die Datei im standardmigen Verzeichnis zu finden ist. Als Dateinummer iNr lsst sich ein Wert zwischen 1 und 511 whlen, der fortan als Alias der Datei fr jegliche Zugriffe fungiert, bis diese mittels Close wieder geschlossen wird. Bei der Vergabe der Dateinummer ist zu beachten, dass diese nicht bereits einer anderen Datei zugeordnet wurde (vgl. FreeFile-Funktion, S. 139). Open ordnet der Datei je nach Bearbeitungsmodus und Zugriffsart auch einen Schreib- und/oder Lesepuffer sowie einen Dateizeiger zu, wobei der Dateizeiger die jeweils aktuelle Position fr die nchste Dateioperation wiedergibt, falls diese nicht explizit die Angabe einer Startposition enthlt. Fr Modus kennt Visual Basic als reine Textmodi Input, Output und Append, wobei mit Input nur ein lesender Zugriff mglich ist und mit Output und Append nur ein schreibender. Ein AccessZusatz fr diese Modi ergibt keinen Sinn, da die Zugriffsart ja bereits feststeht. Daneben gibt es noch den indexsequenziellen Zugriffsmodus Random fr den rein datensatzorientierten Zugriff sowie den binren Zugriffsmodus Binary, der als flexibelster Modus sowohl fr den textorien-

1 49

Dateiorientierte Funktionen und Anweisungen

tierten als auch fr den datensatzorientierten Zugriff geeignet ist. Dateioperationen finden im Allgemeinen mit Bezug auf eine Byteposition statt, einzig Operationen im Modus Random liegt eine Datensatznummer zugrunde, bei der die Datensatzlnge lDatensatzlnge eine Rolle spielt. Der Dateizeiger gibt in diesem Fall die Datensatznummer an und nicht die Byteposition. In allen anderen Modi hat die Angabe einer Datensatzlnge keinen Effekt. Fr den Modus Append setzt Open den Dateizeiger an das Ende der Datei, ansonsten an den Anfang. Wird eine Datei im Modus Binary oder Random mit dem Zusatz Access Read geffnet, fhrt jeder Versuch, eine Schreiboperation darauf auszufhren, zu dem Laufzeitfehler 75, Fehler bei Zugriff auf Datei. Analoges gilt fr den Zusatz Access Write und Lesezugriffe. Lautet der Zusatz Access Read Write oder fehlt der Access-Zusatz, ffnet Open die Datei in diesen beiden Modi fr den Schreib- und Lesezugriff. Ein- und Ausgabeoperationen beziehen sich in diesem Fall auf den gleichen Puffer und den gleichen Dateizeiger. Eine Datei lsst sich auch mehrfach ffnen, sofern sie nicht in einem der Modi Input, Output oder Append geffnet wird. In diesem Fall verwendet Visual Basic fr die zugehrigen Dateinummern den gleichen Puffer, so dass zu jeder Zeit ber jede der Dateinummern ein und derselbe Dateiinhalt verfgbar ist. Dateizeiger gibt es aber je Dateinummer einen eigenen (vgl. Beispiel). Gleich, in welchem Modus Sie eine Datei ffnen, Visual Basic verwendet standardmig die Zugriffsart Shared, denn diese Zugriffsart erlegt Programmen die geringsten Einschrnkungen fr den gemeinsamen Zugriff auf dieselbe Datei auf. Vom Prinzip her ist das zwar erwnscht, im Einzelfall kann es aber dazu fhren, dass sich Programme gegenseitig ins Handwerk pfuschen, weil ihre Puffer unter ungnstigen Bedingungen unterschiedliche Versionen des gleichen Datensatzes oder des gleichen Dateibereichs enthalten knnen. Es gibt drei Mglichkeiten, dem entgegenzuwirken: Die erste ist das hrteste Geschtz und besteht darin, die Datei gleich beim ffnen durch Angabe einer der Zugriffsarten Lock Read, Lock Write oder Lock Read Write fr den exklusiven Lesezugriff, Schreibzugriff oder Schreib-/Lesezugriff zu ffnen. Die zweite besteht darin, sich die gesamte Datei unmittelbar vor einem Schreib- bzw. Lesezugriff mittels Lock fr den exklusiven Zugriff zu reservieren. Diese beiden Techniken knnen natrlich scheitern, wenn ein anderes Programm seinerseits eine Sperre auf die Datei errichtet hat sei es auch nur eine Sperre fr einen einzelnen Datensatz respektive fr einen kleinen Bereich der Datei. Die dritte und moderateste Mglichkeit, auf einen bestimmten Datensatz oder Dateibereich ungestrt zugreifen zu knnen, ist das Sperren genau dieses Datensatzes oder Bereichs mittels Lock und das sofortige Entsperren mittels Unlock nach dem Zugriff. Die Wahrscheinlichkeit, dass diese Technik scheitert, ist am geringsten, da es nur dann zu dem Laufzeitfehler 70, Zugriff verweigert, kommt, wenn ein anderes Programm eine Sperre auf die gesamte Datei oder auf genau denselben Datensatz bzw. Dateibereich errichtet hat. Insbesondere, wenn auch die anderen Programme mit der gleichen Technik arbeiten, sind kaum Kollisionen zu befrchten was natrlich eine Fehlerbehandlung nicht entbehrlich macht. Auch wenn Visual Basic bei Programmende offene Dateien automatisch schliet, sollten Sie generell darauf achten, eine Datei unmittelbar nach der letzten Dateioperation mittels Close zu schlieen. Das gibt die Dateinummer und den Puffer frei und ermglicht anderen Programmen wieder den uneingeschrnkten Zugriff auf die Datei. Insbesondere entfernt Close auch alle Sperren, die mit Lock gesetzt und nicht explizit mit Unlock freigegeben wurden.
Beispiel

Dateiorientierte Funktionen und Anweisungen

................................................... Beis piel

Der folgende Codeauszug demonstriert zum einen die Fehlerbehandlung im Zusammenhang mit der Open-Anweisung und verschiedenen Dateioperationen. Die Variable sDateipfad enthlt die leere Zeichenfolge als Wert. Daher scheitern alle dateibezogenen Operationen. Der Benutzer kann den Vorgang abbrechen, wiederholen oder berspringen (ignorieren). Letzteres ist zu empfehlen, um die verschiedenen Fehlermeldungen zu erhalten. Lscht man das erste Kommen-

1 50

Print #- Anweisung
tarzeichen in der zweiten Zeile, luft der Code fehlerlos und demonstriert, wie es sich mit den Dateizeigern verhlt, wenn eine Datei im Modus Binary zweimal geffnet wird.
sDateipfad = "" ' Als Dateiname nicht erlaubt! ' sDateipfad = "Test1" ' Dateiname ist OK On Error GoTo OpenFehler ' Fehlerbehandlung einrichten Open sDateipfad For Binary As 1 Open sDateipfad For Binary As 2 Put 1, 1, "abcd" Print Seek(1), Seek(2) ' Dateizeiger #1 = 5, #2 = Put 2, 1, StrReverse(Input(LOF(2), 2)) Print Seek(1), Seek(2) ' Dateizeiger #1 = 5, #2 = Seek 1, 1 ' Dateizeiger #1 = 1, #2 = Seek 2, 1 ' Dateizeiger #1 = 1, #2 = Print LOF(1), Input(LOF(1), 1) ' Ausgabe: 4, "dcba" Print LOF(2), Input(LOF(2), 2) ' Ausgabe: 4, "dcba" On Error GoTo 0 ' Fehlerbehandlung beenden Close 1, 2 Exit Sub

1 5 5 1

Dateiorientierte Funktionen und Anweisungen

OpenFehler: ' Routine fr Fehlerbehandlung sFehler = "Fehler" + Str(Err.Number) + ": " + Err.Description Select Case MsgBox(sFehler, vbAbortRetryIgnore, "Fehler") Case vbAbort: Error 1001 Case vbRetry: Resume Case vbIgnore: Resume Next End Select

Vgl. auch die Beispiele in Close-Anweisung (S. 133), EOF-Funktion (S. 137), FileAttrFunktion (S. 138), FreeFile-Funktion (S. 139), Get-Anweisung (S. 140), Input- und InputB-Funktion (S. 142), Input #-Anweisung (S. 143) und Loc-Funktion (S. 146) sowie das Beispiel im Abschnitt Fehlerbehandlung (S. 43).
Verwandte Befehle

................................................... Verwa ndte Befehle

Close, FreeFile

Print #- Anweisung
Print #iDateiNr[, Ausdr1[Trennz [Ausdr2] ... ]]
Beschreibung

................................................... Bes c hreibung

Die Anweisung Print # fhrt Ausgaben im gebietsspezifischen Format in die unter der Dateinummer iDateiNr geffnete sequenzielle Datei durch. Die auf die Dateinummer folgende Parameterliste Ausdr1, Ausdr2 usw. darf Werte beliebiger Standardtypen enthalten. Print # gibt diese Werte unter Beachtung des jeweils zwischen den Parametern stehenden Trennzeichens Trennz aus.
Anwendung

................................................... Anwendung

Whrend Print nur noch als Methode eines Form-, UserControl- und Debug-Objekts verfgbar und somit sozusagen zur objektorientierten Seite von Visual Basic bergelaufen ist, ist Print#

1 51

Dateiorientierte Funktionen und Anw eisungen

Dateiorientierte Funktionen und Anweisungen

nach wie vor auf der traditionellen Seite der Sprache verblieben. Charakteristikum fr die Ausgabe von Print# im Gegensatz zu Write# ist, dass die literale Darstellung der Werte im Allgemeinen im gebietsspezifischen Format erfolgt. Im Allgemeinen deshalb, weil es auch Werte gibt, die ungeachtet des Gebietsschemas nicht bersetzt werden. So die Werte True und False des Datentyps Boolean und das Wort Error in der Ausgabe eines Error-Werts. Und obwohl die Anweisung Null als Null in eine Datei schreibt, gibt sie den Wert Empty als leere Zeichenfolge und somit gar nicht aus. Als Trennzeichen Trennz sind das Semikolon und das Komma erlaubt. Bei Angabe eines Semikolons setzt die Anweisung den folgenden Wert unmittelbar hinter den vorigen, wie bei der Verkettung von Zeichenfolgen. Das Komma hingegen bewirkt, dass Print# den folgenden Wert an die nchste Tabulatorposition setzt und den Zwischenraum gegebenenfalls mit Leerzeichen auffllt. Der Abstand zwischen je zwei Tabulatorpositionen betrgt 14 Zeichen. Ist im Anschluss an den letzten Parameter der Liste kein Trennzeichen spezifiziert, ergnzt die Anweisung einen Wagenrcklauf Chr(13) und einen Zeilenvorschub Chr(10) bzw. vbCrLf. Als Werte in der Parameterliste sind auch die Ausdrcke Spc(n) und Tab(n) zulssig, die jedoch keine eigenstndigen Zeichenfolgenfunktionen darstellen, sondern als Argument von Print, Print# und Write# zulssig sind. Spc(n) fgt n Leerzeichen ein, und Tab(n) fllt die aktuelle Zeile bis zur Tabulatorposition n mit Leerzeichen.
Warnung

................................................... Wa rnung

Die Anweisung gibt Zeichenfolgen im ANSI-Code und nicht im Unicode aus. Es ist im Allgemeinen nicht mglich, Fliekommawerte und Datumswerte, die mit Print# geschrieben wurden, mittels Input # wieder in Variablen des gleichen Typs einzulesen, da Print # seinen Ausgaben das gebietsspezifische Format verpasst, Input# aber Literale im standardisierten Format erwartet. Damit das klappt, mssen Sie die Daten mit Write# und nicht mit Print# schreiben.
Tipp

................................................... Tipp

Im Gegensatz zu Write# versieht Print# Zeichenfolgen nicht automatisch mit Anfhrungszeichen. Wenn Sie ausschlielich Zeichenfolgen ausgeben, also reine Textverarbeitung betreiben, ist Print# in jedem Fall die bessere Lsung. Zum zeilenweisen Lesen der Daten verwenden Sie dann die Anweisung Line Input#.
Beispiel

................................................... Beis piel

Die Prozedur Ersetze sucht in einer Textdatei alle Vorkommen der Zeichenfolge sSuch und ersetzt diese gegen die Zeichenfolge sErsetz.
Function Ersetze(sDatei As String, sSuch As String, sErsetz As String) Dim sZeile As String Open sDatei For Input As 1 Open "Ersetz.tmp" For Output As 2 ' Temporre Ausgabedatei anlegen While Not EOF(1) Line Input #1, sZeile ' Zeile lesen Print #2, Replace(sZeile, sSuch, sErsetz) ' Ersetzen und schreiben Wend Close 1, 2 ' beide Dateien schlieen Kill sDatei ' Ausgangsdatei lschen Name "Ersetz.tmp" As sDatei ' Temporre Datei umbenennen End Function

1 52

Put- Anw eisung

Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Input, Input#, Line Input#, Print, Write#


Verwandte Themen

Literale und Konstanten (S. 27)

Put- Anweisung
Put [#]iDateiNr, [lSatzNr], Wert

Dateiorientierte Funktionen und Anweisungen

Beschreibung

................................................... Bes c hreibung

Die Anweisung Put ist das Gegenstck zur Anweisung Get. Sie schreibt die ber den Parameter Wert spezifizierten Daten in der gegebenen Reprsentation (typerhaltend) in die Datei mit der Dateinummer iDateiNr. Ist eine Satznummer lSatzNr angegeben, schreibt die Anweisung im Modus Random den Wert Wert als Datensatz unter Bercksichtigung der bei der Open-Anweisung vereinbarten Datensatzlnge und im Modus Binary als schlichte Bytefolge ab der Byteposition lSatzNr. Fehlt lSatzNr, schreibt die Anweisung den Wert als nchsten Datensatz (Random) bzw. an der jeweils aktuellen Schreibposition (Binary) und aktualisiert danach den Datensatzzeiger bzw. die aktuelle Schreibposition. Der Parameter Wert kann einen beliebigen Typ tragen, nicht jedoch einen Objekttyp.
Anwendung

................................................... Anwendung

Wenn es um das Schreiben und Lesen von Dateiformaten ging, waren Get und Put schon immer die Arbeitspferde der Sprache Basic. Die Arbeitsweise dieser Anweisungen ist traditionell auf indexsequenzielle Dateien zugeschnitten, deren Bearbeitung im Modus Random erfolgt. Get und Put werden aber auch jedoch mit leicht modifizierter Arbeitsweise im Modus Binary eingesetzt.

Der Modus Random


Beim ffnen von Dateien im Modus Random wird normalerweise eine Datensatzlnge in Bytes festgelegt, die fortan bestimmt, wie viele Bytes mit jeder Get- bzw. Put-Operation je Datensatz gelesen bzw. geschrieben werden. Die Zhlung der Datenstze beginnt bei 1. Den Bytebedarf der elementaren Datentypen entnehmen Sie der Tabelle im Abschnitt Elementare Datentypen (S. 49); den von Datentypen mit fester Lnge sowie von benutzerdefinierten Datentypen ermittelt man am besten mittels LenB, da die Speicherausrichtung der Datenfelder noch eine zustzliche Rolle spielt. Liegt Wert ein Typ variabler Lnge zugrunde (bzw. ein Typ, der Felder variabler Lnge enthlt), erweitert das den Datensatz um einen Deskriptor (lies: Lngenangabe). Dabei gilt, dass ein Deskriptor dem Wert unmittelbar vorausgeht. Mithin muss also der Lngenbedarf eines oder mehrerer Deskriptoren bei der Berechnung der Datensatzlnge bercksichtigt werden. Fr Zeichenfolgen variabler Lnge schlagen dabei 2 Lngenbytes (!) zu Buche (Zeichenfolgen drfen demnach nicht lnger als 65.535 Zeichen sein), fr Variant-Variablen gleichfalls zunchst 2 Bytes fr den VarType-Typ plus gegebenenfalls weitere Lngenbytes fr Wertanteile mit variablen Lngen. Dynamische Arrays schlagen mit 2 Bytes fr den Array-Deskriptor zu Buche plus 8 Bytes je Dimension. Die maximale Datensatzlnge betrgt 32.767. Put schreibt Wert linksbndig in den Datensatz, ohne Fllbytes anzuhngen, wenn die Reprsentation von Wert krzer als die Datensatzlnge ist. Sollte die Reprsentation von Wert lnger sein als die bei Open angegebene Datensatzlnge, kommt es zum Laufzeitfehler 59, Falsche Datensatzlnge.

1 53

Dateiorientierte Funktionen und Anw eisungen

Der Modus Binary


Fr den Modus Binary gilt im Wesentlichen dasselbe, mit folgenden Abweichungen: Eine Datensatzlnge wird nicht bercksichtigt, und die Anweisung schreibt ab der aktuellen Position bzw. der Position lSatzNr so viele Bytes, wie die Darstellung von Wert bentigt. Zeichenfolgen variabler Lnge behandelt Put wie Zeichenfolgen fester Lnge, schreibt also nur so viele Bytes wie der Wert an Zeichen enthlt ein Deskriptoranteil entfllt somit. Analoges gilt auch fr Arrays. Im Zusammenhang mit benutzerdefinierten Datentypen finden Deskriptoranteile einzelner Datenfelder jedoch sehr wohl Bercksichtigung.
Warnung

Dateiorientierte Funktionen und Anweisungen

................................................... Wa rnung

Put schreibt Unicode-Zeichenfolgen als ANSI-Code und Get liest ANSI-Zeichenfolgen als Unicode.
Beispiel

................................................... Beis piel

Die folgende Prozedur Crypt32 nimmt eine einfache 32 Bit-Verschlsselung einer Datei sDatei mit dem Wert lKennzahl vor. Der gleiche Wert entschlsselt die Datei auch wieder; probieren Sie es aus.
Sub Crypt32(lKennzahl As Long, sDatei As String) Dim lData As Long Open sDatei For Binary As 1 For i = 1 To LOF(1) Len(lData) + 1 Get 1, i, lData Put 1, i, lData Xor lData Next i Close 1 End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Get, Input, Input#, LenB, Line Input#, LSet, Open, Print#


Verwandte Themen

Elementare Datentypen (S. 49); Benutzerdefinierte Datentypen (S. 60)

Reset- Anweisung
Reset
Beschreibung

................................................... Bes c hreibung

Die Anweisung Reset schliet alle offenen Dateien, die mittels Open-Anweisungen geffnet wurden.
Anwendung

................................................... Anwendung

Sinn und Zweck dieser Anweisung ist es, im Fehlerfall oder bei einem berraschenden Programmabbruch schnell aufrumen zu knnen. Reset erzwingt insbesondere die Ausgabe von Pufferinhalten in Dateien, die zum Schreiben geffnet wurden. Es besteht kein Unterschied zwischen dem parameterlosen Aufruf von Close und Reset.

1 54

RmDir- Anw eisung

Verwandte Befehle

................................................... Verwa ndte Befehle

Close, End

RmDir- Anweisung
Sub RmDir(sVerzeichnisname As String)
Beschreibung

................................................... Bes c hreibung

Die Anweisung RmDir lscht das Verzeichnis sVerzeichnisName.

Dateiorientierte Funktionen und Anweisungen

Anwendung

................................................... Anwendung

Der Wert des Parameters sVerzeichnisName kann ein (absoluter oder relativer) UNC-Pfad oder Laufwerkspfad sein. Enthlt sVerzeichnisName keinen Pfadanteil, geht die Anweisung davon aus, dass das Verzeichnis ein Unterverzeichnis des standardmigen Verzeichnisses (vgl. CurDir-Funktion, S. 134) ist. Falls das Verzeichnis noch Dateien enthlt, lst die Anweisung den Laufzeitfehler 75, Fehler beim Zugriff auf Pfad/Datei, aus. Existiert das Verzeichnis berhaupt nicht, kommt es zum Laufzeitfehler 76, Pfad nicht gefunden.
Beispiel

................................................... Beis piel

Die rekursive Prozedur DelTree lscht ein Verzeichnis mit allen Dateien und Unterverzeichnissen.
Sub DelTree(sPfad As String) Dim sUVz As String If Right(sPfad, 1) = "\" Then sPfad = Left(sPfad, Len(sPfad) 1) End On Error GoTo Fehlerbehandlung Kill sPfad + "\*.*" sUVz = Dir(sPfad + "\", vbDirectory) While sUVz <> "" If sUVz <> "." And sUVz <> ".." Then DelTree (sPfad + "\" + sUVz) sUVz = Dir(sPfad + "\", vbDirectory) Else sUVz = Dir End If Wend RmDir sPfad On Error GoTo 0 Exit Sub Fehlerbehandlung: Resume Next End Sub
Verwandte Befehle

' "\" am Ende? ' Abschneiden ' Falls Kill scheitert ' oder Schreibschutz

' Unterverz. abklappern ' Rekursion ' da Dir nicht rekursiv ' arbeitet ' Nchstes Verzeichnis lschen

................................................... Verwa ndte Befehle

ChrDir, CurDir, Kill, MkDir

1 55

Dateiorientierte Funktionen und Anw eisungen

Seek- Anweisung und Seek- Funktion


Function Seek(iDateiNr As Integer) As Long Seek [#]iDateiNr, lPosition
Beschreibung

................................................... Bes c hreibung

Dateiorientierte Funktionen und Anweisungen

Als Funktion liefert Seek die aktuelle Position des Dateizeigers der unter der Dateinummer iDateiNr geffneten Datei. Fr den Modus Random gibt diese Angabe die Nummer des nchsten zu lesenden oder zu schreibenden Datensatzes ab Dateianfang wieder, fr alle anderen Modi die Nummer des nchsten zu lesenden oder zu schreibenden Bytes ab Dateianfang. Das erste Byte bzw. der erste Datensatz trgt die Nummer 1. Als Anweisung setzt Seek den Wert lPosition als neue Position des Dateizeigers. Im Modus Random ist diese Position eine Datensatznummer, in allen anderen Modi eine Bytenummer.
Anwendung

................................................... Anwendung

Lese- und Schreiboperationen verschieben den Dateizeiger jeweils immer nur um die gelesene Anzahl von Bytes bzw. Datenstzen, was dem Muster fr den sequenziellen Dateizugriff entspricht. Seek ermglicht die Orientierung und Positionierung innerhalb von Dateien, wenn indexsequenzielle Dateizugriffe erforderlich sind.
Warnung

................................................... Wa rnung

Als Anweisung setzt Seek nichts weiter als den Dateizeiger. Falls der Wert von lPosition grer als die von LOF gelieferte Dateilnge ist, bewirkt die nchste Schreiboperation einer zum Schreiben geffneten Datei eine entsprechende Verlngerung. Dagegen fhrt die nchste Leseoperation, gleich im welchem Modus die Datei geffnet wurde, zum Laufzeitfehler 62, Einlesen hinter Dateiende.
Tipp

................................................... Tipp

Die Syntax fr die Dateioperationen Get und Put sieht die Angabe expliziter Positionsangaben vor, so dass auf Seek verzichtet werden kann.
Beispiel

................................................... Beis piel

Open sDatei For Output As 1 Seek 1, lOffs ' Dateizeiger auf bestimmte Zeile Line Input #1, sZeile ' Zeile lesen Print Seek(1) ' Dateizeiger abfragen

Die folgende Zeile zeigt, was passiert, wenn Seek ber das Dateiende hinausschiet:
Open "Test" For Input As 1 ' Die Datei enthlt 4 Bytes! Seek 1, 10000 ' Dateizeiger auf 10000 setzen Print Loc(1) ' Ausgabe: 9999 Print Seek(1) ' Ausgabe: 10000 Input #1, a ' Laufzeitfehler 62 Close

Vgl. auch das Beispiel zu Open-Anweisung (S. 149).


Verwandte Befehle

................................................... Verwa ndte Befehle

Get, Loc, Open, Put

1 56

SetAttr- Anw eisung

SetAttr- Anweisung
Sub SetAttr(sPfad As String, iAttributvektor As Integer)
Beschreibung

................................................... Bes c hreibung

Die Anweisung SetAttr setzt die Attribute der Datei oder des Verzeichnisses sPfad entsprechend dem Attributvektor iAttributvektor.
Anwendung

................................................... Anwendung

Das Dateisystem pflegt fr jeden Namenseintrag einen Attributvektor (Bytewert), dessen Elemente (Bits des Bytewerts) eine genauere Aussage darber machen, welcher Art die zugeordnete Datei (bzw. das Verzeichnis) ist. Die folgende Tabelle gibt einen berblick ber die mglichen Attribute sowie ber die Konstanten, die in Visual Basic als Elemente des Aufzhlungstyps VbFileAttribute fr diese Attribute definiert sind. SetAttr ignoriert Attribute, die es nicht setzen kann so ist es beispielsweise nicht mglich, mittels SetAttr aus einer Datei ein Verzeichnis zu machen. Konstante vbNormal (0) vbReadOnly (1) vbHidden (2) vbSystem (4) vbVolume (8) vbDirectory (16) vbArchive (32) Beschreibung Keines der Bits im Attributvektor ist gesetzt, es handelt sich um eine gewhnliche Datei Datei/Verzeichnis ist schreibgeschtzt Datei/Verzeichnis ist verborgen Datei ist Systemdatei bzw. Verzeichnis ist Systemverzeichnis Logischer Datentrger (wird von SetAttr nicht gesetzt) Verzeichnis (wird von SetAttr nicht gesetzt) Datei wurde seit der letzten Datensicherung gendert

Dateiorientierte Funktionen und Anweisungen

Konstanten fr Dateiattribute
Beispiel

................................................... Beis piel

Die folgenden Zeilen zeigen, wie man temporr einen Schreibschutz auf eine Datei entfernt und dann wieder errichtet:
SetAttr sDateName, GetAttr(sDateiname) And Not vbReadOnly ... SetAttr sDateName, GetAttr(sDateiname) Or vbReadOnly

Falls nicht klar ist, ob eine Datei schreibgeschtzt ist oder nicht, schreiben Sie vorsichtiger:
AttrVekt = GetAttr(sDateiname) SetAttr sDateName, AttrVekt And Not vbReadOnly ... SetAttr sDateName, AttrVekt
Verwandte Befehle

................................................... Verwa ndte Befehle

Dir, FileAttr, GetAttr

1 57

Dateiorientierte Funktionen und Anw eisungen

Shell- Anweisung
Function Shell( _ sAnwendName As String, _ [FensterStil As VbAppWinStyle = vbMinimizedFocus]) _ As Double
Beschreibung

................................................... Bes c hreibung

Dateiorientierte Funktionen und Anweisungen

Die Funktion Shell ermglicht den Start einer anderen Anwendung sAnwendName als eigenstndige Anwendung und liefert als Funktionswert die Task-ID des zugehrigen Prozesses respektive 0, wenn der Start nicht erfolgreich verlaufen ist. Die Bedeutung der Werte fr den optionalen Parameter FensterStil listet die folgende Tabelle auf. Konstante vbHide (0) vbNormalFocus (1) vbMinimizedFocus (2) vbMaximizedFocus (3) vbNormalNoFocus (4) vbMinimizedNoFocus (6) Beschreibung Das Fenster der Anwendung ist nicht sichtbar, erhlt aber den Fokus. Das Fenster der Anwendung ist sichtbar, hat Normalgre und erhlt den Fokus. Die Anwendung startet als Symbol, erhlt aber den Fokus (Standardwert). Die Anwendung startet mit maximiertem Fenster und erhlt den Fokus. Das Fenster der Anwendung ist sichtbar, hat Normalgre, erhlt aber nicht den Fokus. Die Anwendung startet als Symbol, ohne den Fokus zu erhalten.

Fensterstile fr den Start einer Anwendung aus Visual Basic heraus


Anwendung

................................................... Anwendung

Das gestartete Programm erbt das standardmige Verzeichnis des aufrufenden Programms (vgl. CurDir-Funktion, S. 134). Mit der von Shell gelieferten Task-ID lsst sich mit den inhrenten Mitteln von Visual Basic nicht anderes anfangen, auer sie der Anweisung AppActivate zu bergeben, um der gestarteten Anwendung den Fokus zuzuschanzen. Das knnte etwa geschehen, um diese Anwendung mittels der Anweisung SendKeys fernzusteuern. Auf diese Weise lassen sich die Geister, die man rief beispielsweise auch wieder loswerden.
Tipp

................................................... Tipp

Um eine Anwendung unter Vorgabe eines bestimmten Arbeitsverzeichnisses zu starten, stellen Sie dieses Verzeichnis vor dem Shell-Aufruf mittels ChDrive und ChDir als standardmiges Arbeitsverzeichnis ein.
Beispiel

................................................... Beis piel

Vgl. das Beispiel zur Date-Funktion und Date-Anweisung (S. 116).

1 58

Unlock- Anw eisung

Unlock- Anweisung
Sub Unlock([#]iDateiNr As Integer[, lDatensatz As Long]) Sub Lock([#]iDateiNr As Integer, [lStartNr As Long] To lEndNr As Long)
Beschreibung

................................................... Bes c hreibung

Die Anweisung Unlock hebt bestehende (programmeigene) Sperren fr einen einzelnen Datensatz lDatensatz oder einen Bereich von Datenstzen lStartNr bis lEndNr auf, die fr die Datei mit der Dateinummer iDateiNr mittels eines vorangegangenen Lock-Aufrufs errichtet wurden. Fehlt bei Gebrauch der ersten Syntax der optionale Parameter lDatensatz, hebt Unlock eine Sperre auf, die fr die gesamte Datei errichtet wurde. Fehlt bei Gebrauch der zweiten Syntax der optionale Parameter lStartNr, entsperrt die Anweisung alle Datenstze von der Nummer 1 bis zur Nummer lEndNr. Bei Dateien, die im Modus Binary geffnet wurden, beziehen sich die Bereichsangaben auf Positionen des Dateizeigers.
Anwendung

Dateiorientierte Funktionen und Anweisungen

................................................... Anwendung

Wenn in einem System oder in einem Netzwerk mehrere Programme gleichzeitig Schreibzugriffe auf dieselbe Datei durchfhren, kann das recht unangenehme Inkonsistenzen zur Folge haben. Das Anweisungspaar Lock/Unlock ermglicht es einem Programm, sich temporr die Exklusivrechte fr das Beschreiben eines gewissen Teils der Datei zu sichern. Jeder Unlock-Anweisung muss eine gleichlautende Lock-Anweisung vorangegangen sein, sonst lst diese den Laufzeitfehler 70, Zugriff verweigert aus.
Warnung

................................................... Wa rnung

Bei Lock/Unlock-Anweisungen fr sequenzielle Dateien (Input, Output, Append) ignoriert Visual Basic Bereichsangaben und sperrt immer die gesamte Datei. Entgegen anders lautenden Informationen in der Online-Hilfe zu Visual Basic 6.0 entfernt Close (respektive das Programmende) jedoch alle Sperren, die mit Lock gesetzt und nicht explizit mit Unlock wieder freigegeben wurden.
Beispiel

................................................... Beis piel

Der folgende Code schreibt eine Reihe von Datenstzen in die gemeinsame genutzte Datei Kunden.idx:
Open "Kunden.idx" For Random As 1 Len = Datensatzlnge On Error GoTo Fehler70 Lock 1, lStartBereich To lEndBereich ' Sperre errichten On Error GoTo 0 For i = lStartBereich To lEndBereich Put 1, i, bdt(i) Next Unlock 1, lStartBereich To lEndBereich ' Sperre aufheben Close 1
Verwandte Befehle

................................................... Verwa ndte Befehle

Lock, Open

W rite #- Anweisung
Write #iDateiNr[, Ausdr1[Trennz [Ausdr2] ... ]]

1 59

Dateiorientierte Funktionen und Anweisungen

Beschreibung

................................................... Bes c hreibung

Die Anweisung Write # schreibt Daten im Standardformat fr literale Werte in die unter der Dateinummer iDateiNr geffnete sequenzielle Datei. Die auf die Dateinummer folgende Parameterliste Ausdr1, Ausdr2 usw. darf Werte beliebiger Standardtypen enthalten. Write # gibt diese Werte unter Beachtung des jeweils zwischen den Parametern stehenden Trennzeichens Trennz aus.
Anwendung

................................................... Anwendung

Dateiorientierte Funktionen und Anweisungen

Da Print# Daten im gebietsspezifischen Format schreibt, wird Write# immer dann anstelle von Print# eingesetzt, wenn die geschriebenen Daten spter mittels Input# wieder eingelesen werden sollen. Das Standardformat fr literale Werte sieht insbesondere vor, dass Zeichenfolgen in Anfhrungszeichen und Datumswerte im Format #mm/tt/jjjj# notiert werden. Als Trennzeichen Trennz sind das Semikolon und das Komma erlaubt. Im Gegensatz zu Print # unterscheidet Write# nicht zwischen den beiden Trennzeichen und trennt aufeinanderfolgende Werte der Parameterliste durch ein Komma. Ist im Anschluss an den letzten Parameter der Liste kein Trennzeichen spezifiziert, ergnzt die Anweisung einen Wagenrcklauf Chr(13) und einen Zeilenvorschub Chr(10) bzw. vbCrLf.
Warnung

................................................... Wa rnung ................................................... Tipp

Write# gibt Zeichenfolgen im ANSI-Code und nicht im Unicode aus.


Tipp

Im Gegensatz zu Write# versieht Print# Zeichenfolgen nicht automatisch mit Anfhrungszeichen. Wenn Sie ausschlielich Zeichenfolgen ausgeben, also reine Textverarbeitung betreiben, ist Print# in jedem Fall die bessere Lsung. Zum zeilenweisen Lesen der Daten verwenden Sie dann die Anweisung Line Input#.
Beispiel

................................................... Beis piel ................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Vgl. das Beispiel zu Input #-Anweisung (S. 143).


Verwandte Befehle

Input#, Open, Print#


Verwandte Themen

Literale und Konstanten (S. 27)

1 60

Variablen
Eine Variable ist ein auf einen bestimmten Datentyp (Datenformat) zugeschnittener Behlter, der einen Bezeichner (lies: einen Namen) trgt und einen (in dem Datenformat gehaltenen) Wert enthlt.
Beschreibung

................................................... Bes c hreibung

Charakteristikum der Variable ist, dass ihr Wert vernderlich ist, das heit, er kann nach Belieben zur Laufzeit im Rahmen von Zuweisungsoperationen sowie von Funktions- und Prozeduraufrufen gendert werden. Mit dieser Eigenschaft ist die Variable unverzichtbarer Bestandteil einer jeden Programmiersprache und Medium fr den formalen Umgang mit Daten jeglicher Art.
Anwendung

................................................... Anwendung

Fr die Wahl des Variablenbezeichners gelten die blichen Vorschriften fr die Bezeichnerwahl (vgl. Bezeichner und Namensraum, S. 34). Variablen erhalten ihren Wert durch Zuweisung eines Literals, einer Konstante, einer anderen gleichartigen Variablen, eines Funktionswerts oder eines Ausdrucks, wobei die jeweiligen Datenformate miteinander vertrglich sein mssen.
Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer Dim MyVar4 As Integer MyVar1 = 17 ' Variable MyVar1 erhlt Literal als Wert MyVar2 = MyVar1 ' Variable MyVar2 erhlt Wert von MyVar1 MyVar3 = MyVar1 + 17 ' Variable MyVar3 erhlt Ergebnis von Berechnung MyVar4 = Max(MyVar1, MyVar3) ' Variable MyVar4 erhlt Funktionswert

Somit knnen Variablen fr alles stehen, was einen in einen Datentyp gefassten Wert darstellt. Auch wenn es die Sprache Visual Basic im Vergleich zu anderen Programmiersprachen nicht gerade offensichtlich macht: Es besteht ein gewisser Unterschied zwischen Variablen, die einen einfachen Datentyp, und solchen, die einen komplexen Datentyp tragen. Zu den einfachen Datentypen zhlen: alle elementaren Datentypen (vgl. Elementare Datentypen, S. 49), ausgenommen String und Variant; weiterhin: Aufzhlungsdatentypen (vgl. Enum-Aufzhlungen, S. 62), alle benutzerdefinierten Datentypen, die ihrerseits nur einfache Datentypen als Felder enthalten; der Typ String* fr Zeichenfolgen fester Lnge und Datenfelder fester Gre, deren Elemente einen einfachen Datentyp tragen. Diese Datentypen zeichnen sich dadurch aus, dass sich ihre Reprsentation whrend des Programmablaufs von der Lnge her nicht verndert und sie deshalb als kompakte Bytefolge gespeichert werden knnen. Die einfachen Datentypen noch abgerechnet, die als spezielle ffentliche Datentypen im Objektkatalog des Systems registriert sind und ihrerseits aus einfachen Datentypen ausgebaut sind, rechnet man alle anderen Datentypen zu den komplexen Datentypen. Insbesondere zhlen dynamische Zeichenfolgen des Typs String, der flexible Datentyp Variant, dynamische Arrays sowie alle zu Objekten gehrigen Datentypen (Klassen) zu den komplexen Datentypen. Komplexe Datentypen lassen sich nicht kompakt speichern, sondern bestehen aus Deskriptoranteilen (Verweisen, Lngen etc.) und Wertanteilen. Whrend die komplexen Datentypen String und Variant mit einem elementaren Datentyp als Untertyp noch relativ einfach und grtenteils intuitiv zu handhaben sind, ist der Umgang mit dynamischen Arrays und Objekten nicht ohne ein gewisses Verstndnis fr die Natur der dahinter liegenden Gren zu bewerkstelligen. Obwohl andere Programmiersprachen hier eine recht klare Linie zwischen Variablen ziehen, die fr eine konkrete Gre stehen und solchen, die nur einen Verweis auf eine andere Gre darstellen, gibt es in Visual Basic das Konzept des Verweises offiziell nur in Bezug auf die Parameterbergabe bei Funktionsaufrufen.

 $

Variablendeklaration

Variablendeklaration

Hinter den Kulissen arbeitet aber auch Visual Basic massiv mit Verweisen. Deutlich wird das beispielsweise, wenn man eine Objektvariable einer abstrakten Klasse (etwa der Klasse Form) vereinbart, der man zwar konkrete via Set ins Leben gerufene und von Form abstammende Objekte als Werte zuweisen kann, nicht jedoch via Set einen Wert der Klasse Form selbst einen solchen gibt es nmlich nicht als konkreten Wert, weil eine Objektvariable des Typs Form ein reiner Verweis ist. Verstndnis fr die Natur eines Werts zu haben, bedeutet fr den Visual-Basic-Programmierer natrlich nicht, dass er bis auf das Genaueste wissen muss, wie Visual Basic Objekte reprsentiert (das ist auch C++-Programmierern im Allgemeinen nicht bis auf das Letzte klar, weil es letztlich vom Compiler abhngt, wie er ein Objekt reprsentiert). Das genau ist ja die Strke der abstrakten Datentypen, deren Implementationen hinter Objekten verborgen bleiben. Es bedeutet aber sehr wohl, dass man bei der Verwendung von Variablen nicht alle Werte in einen Topf schmeien darf und insbesondere wissen muss, ob man es mit einer Variablen fr einen einfachen Datentyp, einen dynamischen Datentyp, ein konkretes Objekt oder ein abstraktes Objekt zu tun hat.

Variablendeklaration
Dim [WithEvents] VarName[([Indizes])] [As Typ] Dim VarName[([Indizes])] [As [New] Typ] Dim [WithEvents] VarName[...], [WithEvents] VarName[...][, ...] Private VarName[([Indizes])] [As [New] Typ] Private [WithEvents] VarName[([Indizes])] [As Typ] Private [WithEvents] VarName[...], VarName[...][, ...] Public VarName[([Indizes])] [As [New] Typ] Public [WithEvents] VarName[([Indizes])] [As Typ] Public [WithEvents] VarName[...], VarName[...][, ...] Static VarName[([Indizes])] [As [New] Typ] Static VarName[...], VarName [...][, ...] Option Explicit
Beschreibung

................................................... Bes c hreibung

Visual Basic ist eine typisierende Programmiersprache. Zwar nimmt der Compiler von sich aus eine fr den Programmierer weitgehend transparente implizite Typzuordnung und Typumwandlung von Werten je nach Erfordernis vor, doch dieses Standardverhalten berdeckt nur einen kleinen Teil der mit Visual Basic verfgbaren Typenvielfalt. Der volle Umfang der von Visual Basic untersttzten Datentypen mit allen ihren Reprsentationsformen und Geltungsbereichen lsst sich nur bei Verwendung der expliziten Variablendeklaration nutzen. Jede Deklaration impliziert eine Initialisierung mit dem Standardwert des implizit oder explizit vereinbarten Datentyps.
Anwendung

................................................... Anwendung

Bei der expliziten Deklaration von Variablen unterscheiden Programmiersprachen traditionell zwischen der statischen und der automatischen Vereinbarung. Statische Variablen, fr deren Deklaration das Schlsselwort Static erforderlich ist, finden ihre Reprsentation im Datensegment des Prozesses, whrend automatische Variablen ihr (meist kurzes) Dasein auf dem Stack fristen. Visual Basic erlaubt die Vereinbarung statischer Variablen nur auf Prozedurebene

1 62

Variablendeklaration

(innerhalb von Prozedur- bzw. Funktionskrpern) und ermglicht damit Prozeduren mit Gedchtnis: Im Gegensatz zur automatischen Variablen, die bei jedem Aufruf neu auf dem Stack angelegt wird, bleibt eine statische Variable und damit auch ihr Wert von einem Aufruf zum nchsten erhalten. Bei der Darstellung komplexer Datentypen, so beispielsweise von dynamischen Arrays und Objekten, kommt bei beiden Vereinbarungsarten ein dritter Speicherbereich ins Spiel, der Heap. In diesem Fall stellt die statisch oder automatisch vereinbarte Variable eine Referenz auf den eigentlichen Wert dar, der seinerseits auf dem Heap liegt. Der Variablendeklaration muss dann eine explizite oder implizite Initialisierung mit New folgen, damit die Variable einen von Empty, Nothing bzw. Null abweichenden Wert erhlt. Implizit erfolgt die Initialisierung, wenn bei der Deklaration der Variablen das Schlsselwort New auftaucht. quivalent sind daher: Dim myForm As Form1 Set MyForm = New Form1 MyForm.Show und Dim myForm As New Form1 MyForm.Show In diesem Fall kann also eine implizite Initialisierung durch Nennung erfolgen. Visual Basic unterscheidet bei der expliziten, automatischen Variablendeklaration weiterhin zwischen einer Vereinbarung auf Prozedurebene und einer Vereinbarung auf Modulebene (im Bereich ALLGEMEIN). Vereinbarungen auf Prozedurebene und auf Modulebene lassen sich mit dem traditionellen Basic-Schlsselwort Dim treffen. Vereinbarungen auf Modulebene lassen sich alternativ auch mittels der neuen Visual-Basic-Schlsselwrter Private und Public treffen. Private entspricht dabei dem Schlsselwort Dim und begrenzt den Geltungsbereich der Variablen auf das aktuelle Modul. Public dehnt dagegen den Geltungsbereich der Variablen auf alle Module aus. Bei der Deklaration einer Objektvariablen auf Modulebene ist der Zusatz WithEvents mglich. Er spezifiziert, dass die Objektvariable auf ein Objekt verweisen wird, das von sich aus (mittels RaiseEvent) Ereignisse generiert und die der Besitzer (das ist die Ebene, auf der die Objektvariable bekannt ist) behandeln oder weiterreichen sollte. Zur Behandlung solcher Ereignisse lassen sich dann in dem jeweiligen Modul unter dem Namen der Objektvariablen Behandlungsroutinen bereitstellen so wie man das von Steuerelementen, die auf einem Formular platziert wurden, oder von Meneintrgen her gewhnt ist.
' Bereich Allgemein Private WithEvents myObject As MyClass ... Private Sub myObject_EventOfMyClass() ...

Variablendeklaration

In der Tat nimmt Visual Basic fr jedes Steuerelement, das auf einem Formular platziert wird, implizit nichts anderes als eine WithEvents-Deklaration vor und vereinbart dabei den unter der Eigenschaft Name des Steuerelements genannten Bezeichner als Objektvariable. WithEvents lsst sich nur bei der Vereinbarung von Instanzen konkreter Klassen verwenden und schliet eine gleichzeitige Verwendung des Spezifizierers New aus.

1 63

Variablendeklaration

Abkrzungen
Visual Basic vereinbart Variablen bei schlichter Nennung implizit als automatische Variablen und ordnet ihnen den Datentyp Variant zu:
Private Sub Form_Click() Set f = Me For i = 1 to 10 s = s + CStr(i) Next i f.Caption = s End Sub ' f ist Variant mit Objektreferenz ' i ist Variant mit numerischem Wert ' a ist Variant mit Stringwert ' Fenstertitel ndert sich zu 12345678910

Variablendeklaration

Ein weitere, recht praktische Mglichkeit fr die Abkrzung von Variablendeklarationen liefern die traditionellen Typkennzeichen $, %, &, !, # der Sprache Basic. Mehr dazu unter Typkennzeichen und Bezeichnerbereiche fr Typen (S. 167).
Beispiele

................................................... Beis piele

Das Projekt DMzuEuroRechner benutzt die explizite Variablendeklaration mit dem Datentyp Long fr die Rundung auf zwei Stellen hinter dem Komma. Das Formular enthlt die Textfelder TextDM und TextEuro, die bei Verlust des Eingabefokus den Wert des jeweils anderen Feldes an ihren eigenen Wert anpassen.
' Projekt: DMzuEuroRechner Private Const iKurs As Single = 1.95583 Private Sub TextDM_LostFocus() Dim l As Long l = TextDM.Text * 100 / iKurs TextEuro.Text = l / 100 End Sub

' implizite Typumwandlung ' Typumwandlung und Rundung

Private Sub TextEuro_LostFocus() Dim l As Long l = TextEuro.Text * iKurs * 100 ' implizite Typumwandlung TextDM.Text = l / 100 ' Typumwandlung und Rundung End Sub

Im folgenden Beispielprojekt NewForm erzeugt das von Visual Basic automatisch gestartete Formular bei jedem Mausklick eine weitere Instanz seiner selbst. Die zustndige Variable frmVar wird implizit durch Nennung initialisiert. Jede Formularinstanz zhlt die Mausklicks, auf die es bereits reagiert hat, und gibt sie aus. Fr das Zhlen der Klicks ist iKlicks als statische Variable vereinbart.
' Projekt: NewForm Private frmVar As New Form1 Private Sub Form_Click() Static iKlicks As Integer ' mit 0 initialisiert iKlicks = iKlicks + 1 Print iKlicks; ". Klick in dieses Formular" frmVar.Show ' implizite Initialisierung End Sub

1 64

Variablendeklaration

Das kleine Programm zeigt sehr schn, dass jedes Formularobjekt auch von dieser statischen Variablen seine eigene Kopie erhlt. Von jedem Formular aus lsst sich immer nur ein weiteres Formular starten, da fVar global deklariert ist. Schliet der Benutzer ein Fenster, bleibt das Formularobjekt erhalten und sein Fenster kommt durch den nchsten Klick in das jeweils vorgeordnete Formular erneut zur Anzeige. Man erkennt das an dem erhaltenen Wert von iKlicks, den ein Mausklick in das wieder sichtbare Formular zu Tage frdert.
Warnung

................................................... Warnung

Die Syntax von Visual Basic fr die akkumulierende Variablenvereinbarung ist leider in fehlertrchtiger Abweichung zu anderen Programmiersprachen (etwa zu C/C++, Pascal, Delphi) gestaltet, was gerade gebten Programmierern, die in vielen Sprachen zu Hause sind, gerne zum Stolperstein wird. Die resultierenden Bugs sind nicht nur extrem schwer zu finden, sie sind noch dazu ziemlich lstig, weil die implizite Typumwandlung des Compilers zuweilen die seltsamsten Kapriolen auf Lager hat. Wer glaubt, mit der Formulierung
Dim s1, s2, s3, s4 As String Dim i1, i2 As Integer

Variablendeklaration

vier String-Variablen und zwei Integer-Variablen zu vereinbaren, ist bereits auf dem Holzweg, wie der folgende Code zeigt:
i1 = 1234 i2 = 5678 s1 = i1 ' s2 = i2 ' s3 = s1 + s2 ' s4 = CStr(i1) + CStr(i2) ' Print s3, s4 '

erwartet: s1 = "1234" erwartet: s2 = "5678" erwartet: Stringaddition Stringaddition nach expliziter Typumwandlung unerwartete Ausgabe: 6912 12345678

Tatschlich betrachtet der Compiler in diesem Codefragment i1, s1, s2 und s3 als Variablen vom Typ Variant, wie der Debugger schnell anhand des Initialisierungswerts Leer enthllt. Die korrekte Formulierung lautet:
Dim s1 As String, s2 As String, s3 As String, s4 As String Dim i1 As Integer, i2 As Integer i1 = 1234 i2 = 5678 s1 = i1 ' s1 = "1234" s2 = i2 s3 = s1 + s2 ' Stringaddition s4 = CStr(i1) + CStr(i2) ' CStr ist nun eigentlich unntig Print s3, s4 ' erwartete Ausgabe: 12345678 12345678

Wrde man den impliziten Typumwandlungsmechanismus nutzen, liee sich die gesamte Variablendeklaration auf die Zeile
Dim s1 As String, s2 As String

beschrnken. Wenn nmlich s1 und s2 Zeichenfolgen sind, nimmt Visual Basic bei den Zuweisungen
s1 = i1 s2 = i2 ' Typumwandlung: von Variant mit numerischen ' Daten in String

eine implizite Typumwandlung in den Datentyp String vor.

1 65

Variablendeklaration

Generell merke man sich die einfache Regel: Visual Basic ordnet jeder Variablen, die nicht explizit und mit unmittelbar anschlieender Nennung eines Datentyps deklariert wurde, den Datentyp Variant zu. Auf diese Weise werden auch schlichte Schreibfehler schnell zur Falle. Visual Basic vereinbart fr den vertippten Bezeichner eine eigene Variable des Typs Variant.
Tipp

................................................... Tipp

Variablendeklaration

Gewhnen Sie sich an, Variablen explizit zu vereinbaren und auch explizite Typumwandlungen hinzuschreiben. Das hilft, unliebsame berraschungen durch falsche Typisierung und durch ungewollte Doppelverwendung weitgehend zu vermeiden. Sie erhalten eine bessere Kontrolle ber die Datentypen und gleichzeitig auch einen schnelleren Code. Wenn Sie wollen, dass Sie der Compiler zur expliziten Typdeklaration zwingt, fgen Sie die Anweisung
Option Explicit

in den Bereich ALLGEMEIN des jeweiligen Moduls ein. Auf diese Weise schtzen Sie sich (und ihre Kunden) vor unbemerkten Tippfehlern in Bezeichnern, die Visual Basic sonst ungefragt als eigenstndige Variablen des Typs Variant vereinbart und mit dem jeweiligen Standardwert initialisiert. Wenn Sie in der Entwicklungsumgebung von Visual Basic ber das Men EXTRAS/ OPTIONEN auf der Eigenschaftsseite EDITOR die Einstellung VARIABLENDEKLARATION ERFORDERLICH treffen, setzt der Editor diese Anweisung automatisch in jedes neue Modul, das Sie anlegen. Wenn Sie es lieber auf die sanfte Art beigebracht haben wollen: Streuen Sie bei der Deklaration (explizit oder implizit) Grobuchstaben in die Variablenbezeichner ein und tippen Sie die Bezeichner spter in Kleinbuchstaben. Der Editor von Visual Basic wandelt den Bezeichner bei Verlassen der Zeile automatisch in die bei der Deklaration gewhlte Schreibweise um. Bleibt die Kleinschreibung erhalten, weist dies auf einen Tippfehler hin.
Const cMinLnge = 1 Const cMaxLnge = 1000 Private lFileLength As Long ... ' Bei Schreibfehlern korrigiert Visual Basic die Schreibweise nicht! If lFileLength < cMaxLnge And lfilelenght > cminlng Then

Nachdem Dim-Anweisungen an beliebiger Stelle im Programm stehen drfen, ist es darber hinaus eine Frage des Programmierstils, wo Sie Ihre Variablen explizit deklarieren:
q q

direkt vor Ort, unmittelbar vor der Initialisierung (popul r) gleich zu Anfang der Prozedur (klassisch)

Die Deklaration vor Ort wird zwar immer populrer, weil sie angeblich die Lesbarkeit von Programmen verbessern soll, meines Erachtens bewirkt sie aber eher das Gegenteil: Deklarationen, die irgendwo mitten im Programmtext versteckt sind, lassen sich schwer auffinden, wenn der Typ der Variablen an spterer Stelle einmal unklar ist. Dagegen ist die Deklaration zu Beginn ein klare Sache man wei immer, wo die Deklaration einer Variablen zu finden ist. Welchen Stil auch immer Sie bevorzugen, bleiben Sie ihm treu. Es hat wenig Sinn, beide zu mischen, dann ist die Verwirrung nmlich komplett. Eine Variable mit eingestreuter Deklaration liest sich schnell als Variant, wenn einige zu Beginn deklarierte Variablen auf den klassischen Deklarationsstil hindeuten
Verwandte Befehle

................................................... Verwa ndte Befehle

ReDim

1 66

Typkennzeichen und Bezeichnerbereiche fr Typen

Verwandte Themen

................................................... Verwandte Them en

ActiveX-Steuerelemente (OCX) Windows-Standardsteuerelemente (S. 433); Arrays (S. 55); Datentypen und ihre Operationen (S. 49); Funktionen selbst definieren (S. 181); Geltungsbereiche von Variablen (S. 173); Klassen als Datentypen fr Objektvariablen (S. 196); Objekte und Klassen (S. 195); Prozeduren selbst definieren (S. 183); Typkennzeichen und Bezeichnerbereiche fr Typen (S. 167); Variableninitialisierung (S. 168)

Typkennzeichen und Bezeichnerbereiche fr Typen


$, %, &, !, #

Variablendeklaration

DefTyp AbisZ [, AbisZ[, ...]] DefBool, DefByte, DefInt, DefLng, DefCur, DefSng, DefDbl, DefDec, DefDate, DefStr, DefObj, DefVar
Beschreibung

................................................... Bes c hreibung

Neben der expliziten Typdeklaration untersttzt Visual Basic natrlich auch die traditionellen impliziten Mglichkeiten der Typdeklaration durch frei definierbare Prfixe (Bezeichnerbereiche) und durch vordefinierte Suffixe (Typkennzeichen).
Anwendung

................................................... Anwendung

Syntaktisch gesehen findet die Deklaration hier durch Erweiterung des Bezeichners um ein Zeichen statt. Die Suffixlsung einst die populrere muss mit einem festen Vorrat an Typkennzeichen auskommen: $ fr String, % fr Integer, & fr Long, ! fr Single, # fr Double. Selbst angesichts der reicheren Typenvielfalt von Visual Basic ist dieser Vorrat nicht mehr aufgestockt worden (nicht zuletzt mangels weiterer Sonderzeichen). Verwendung findet am ehesten noch das Zeichenfolgenzeichen $
For i% = 1 to 100 ' Implizite Deklaration durch Typkennzeichen a$ = a$ + Val(i%) Next i%

Die Prfixlsung erfordert eine Deklaration, die festlegt, welches Prfix welchen Datentyp kennzeichnen soll. Prfixe sind aus der Menge der fr Bezeichner zulssigen Zeichen zu whlen. Dabei knnen auch mehrere Prfixe, ja sogar Buchstabenbereiche, ein und denselben Datentyp kennzeichnen. Der Compiler bemngelt allerdings, wenn Sie versuchen, einen Buchstaben mehreren Datentypen zuzuordnen.
' Bereich Allgemein DefLng L,X-Z DefStr S DefBool B DefCur C DefObj O

Damit erhalten alle Variablen, deren Bezeichner mit einem der Zeichen L, X, Y oder Z beginnt, bei schlichter Nennung (implizite Deklaration) automatisch den Typ Long. Zeichenfolgenvariablen werden dagegen durch einen mit S beginnenden Bezeichner implizit vereinbart usw. Bei expliziter Typdeklaration oder Verwendung eines vordefinierten Suffix ist diese Namenskonvention auer Kraft.
DefCur C ...

1 67

Variableninitialisierung

cWertInEuro c$ = "DM" Dim cents As Integer

' Typ ist Currency ' Typ ist String ' Typ ist Integer

Visual Basic verwendet implizit die Vereinbarung


DefVar A-Z

das heit, alle Variablen erhalten bei impliziter Deklaration den Standardtyp Variant. Um Long als neuen Standardtypen zu vereinbaren, schreiben Sie:
DefLong A-Z

Variableninitialisierung

Eine solche Vereinbarung kann durchaus sinnvoll sein, weil sie nicht nur den Code schneller macht, sondern auch eine explizite Deklaration des komplizierten Typs Variant erzwingt.
Tipp

................................................... Tipp

Um den Typ einer Variablen mittels Suffix festzulegen, gengt es, das Suffix bei erstmaliger Nennung des Variablenbezeichners zu gebrauchen. Fr weitere Nennungen ist ein Suffix nicht mehr erforderlich aber auch nicht schdlich. Wenn Sie nicht wissen, welchen Typ eine Variable hat, knnen Sie den Typ mittels TypeName in Erfahrung bringen.
a$ = 10 Print a, TypeName(a)
Verwandte Befehle

' implizite Deklaration als String, 10 ist "10" ' Ausgabe: 10 String

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Option Base, Option Explicit


Verwandte Themen

Elementare Datentypen (S. 49); Variableninitialisierung (S. 168); Geltungsbereiche von Variablen (S. 173); Arrays (S. 55); Funktionen selbst definieren (S. 181); Prozeduren selbst definieren (S. 183)

Variableninitialisierung
[Let] SimpleVar = Ausdruck Set ObjektVar = [New] ObjektAusdr Set ObjektVar = Nothing
Beschreibung

................................................... Bes c hreibung

Im klassischen Programmiermodell fr typisierende Sprachen muss eine Variable vor ihrem ersten Einsatz als Rechtswert (lies: auf der rechten Seite des Gleichheitszeichens oder als Parameter bei einem Funktions-/Prozeduraufruf) geeignet deklariert und initialisiert werden. Basic war in dieser Hinsicht schon immer etwas legerer, weil es weder die Deklaration noch die Initialisierung zwingend vorschreibt, sondern bei Nennung eines Bezeichners eine implizite Deklaration und im selben Aufwasch auch eine Initialisierung mit dem Standardwert des jeweiligen Datentyps vornimmt. Somit kann der Basic-Programmierer im Allgemeinen davon ausgehen, dass jede Variable zu jedem Zeitpunkt einen definierten Zustand besitzt (das ist nicht in allen Sprachen so). Dennoch wird in den meisten Fllen eine explizite Variableninitialisierung nicht nur die Lesbarkeit verbessern, sondern auch vonnten sein.

1 68

Variableninitialisierung

Anwendung

................................................... Anwendung

Die Initialisierung von Variablen, die keine Objektvariablen sind, erfolgt grundstzlich durch eine einfache Let-Zuweisung, wobei das optionale Schlsselwort Let so gut wie immer der Einfachheit halber weggelassen wird. Visual Basic nimmt bei einer solchen Zuweisung gegebenenfalls erforderliche Typumwandlungen von sich aus vor was nicht gerade immer zum gewnschten Ergebnis fhrt. Anders sieht die Sache bei Objektvariablen aus. Erfolgt die Deklaration einer Objektvariablen unter Angabe von New, erzeugt Visual Basic das entsprechende Objekt umgehend, das heit, die Variable wird im Rahmen der Deklaration vollstndig initialisiert (lies: an ein vollstndig initialisiertes Objekt gebunden). Fehlt der Spezifizierer New, initialisiert Visual Basic die Objektvariable zunchst mit dem Standardwert Empty fr den Datentyp Object (welcher fr Objekte aller Klassen benutzt werden kann). Dem muss an spterer Stelle eine explizite Initialisierung der Objektvariablen im Rahmen einer Set-Anweisung unter Angabe des Schlsselwortes New sowie einer konkreten Klasse folgen, die das Objekt schlielich ins Leben ruft:
Dim myObject As Object ... Set myObject = New Form1
Warnung

Variableninitialisierung

' Deklaration ' an spterer Stelle ...

................................................... Wa rnung

Wie schon angedeutet, spielt Visual Basic dem Programmierer gerne mal den einen oder anderen Streich, indem es von sich aus implizite Typzuordnungen und -umwandlungen vornimmt. Eine notorische Ursache fr Ungereimtheiten im Programmverhalten ist die auf die gebietsspezifische Zahlendarstellung (Lndereinstellungen des Systems) zurckzufhrende Punkt-/KommaProblematik bei der Initialisierung mit numerischen Literalen und literalen Zeichenfolgen. Wer mit der Gebietseinstellung Deutsch (Standard) auf seinem System einen Zahlenwert als literale Zeichenfolge spezifiziert, muss darauf achten, das Dezimalsymbol als echtes Komma zu schreiben. Punkte in literalen Zeichenfolgen ignoriert Visual Basic geflissentlich. Diese Problematik ist inzwischen fast schon lter als des Kaisers Bart, und man muss sich wahrlich die Frage stellen, warum Microsoft die Sprache inzwischen nicht um einen entsprechenden Schalter erweitert hat (etwa Option Locale), der es erlaubt, das Problem mit globaler Wirkung schlicht abzuschalten. Ein weiteres Problem wirft zuweilen die Initialisierung mit literalen Werten in hexadezimaler Darstellung auf. Visual Basic betrachtet ein vierstelliges Hex-Literal grundstzlich als Wert vom Typ Integer, auch wenn der Linkswert vom Typ Long ist. Somit konvertiert Visual Basic beispielsweise den Wert &HFFFF in -1 und nicht in 65.535. Als Lsung bietet es sich an, dem Literal entweder eine (oder mehrere) fhrende Null(en) zu verpassen oder das Typkennzeichen & anzuhngen (vgl. unter Beispiele).
Tipp

................................................... Tipp

Mit Visual Basic 6 hat sich zumindest etwas getan, was die Beilegung der Punkt-/Komma-Problematik betrifft, wenn auch nicht gerade viel. Die neue Funktion StrConv ermglicht unter anderem die Angabe einer Gebietsschema-ID fr die Umwandlung einer Zeichenfolge in den Typ Variant mit Untertyp String. Damit lsst sich ein bestimmtes Gebietsschema als Referenzschema verwenden, was eine gewisse Unabhngigkeit von den Systemeinstellungen bedeutet. Sollte eine Variable trotz sorgfltig geprfter Deklaration und Initialisierung ihren Wert aus unerklrlichen Grnden pltzlich ndern, sind Sie aller Wahrscheinlichkeit nach einer Verletzung der Regeln fr den Geltungsbereich aufgesessen. In den meisten Fllen wurde ein Prozedurparameter genauso benannt wie eine globale Variable.

1 69

Variableninitialisierung

Beispiele

................................................... Beis piele


' ' ' ' ' ' "" (Standardwert) "" (Standardwert) "Literal" "LiteralLiteral" "100" implizite Str-Umwandlung "41"

' String Dim A As String Dim B As String A = "Literal" B = A + A A = 100 A = Hex$(65)

Variableninitialisierung

' String * Dim A As String * 6 ' A = "String" ' A = "Integer" ' A = "DM" ' ' Byte Dim A As Byte A = i% A = AscB(s$) A = Asc(s$) ' Integer Dim A As Integer Dim B As Integer A = 10 A = &HFFFF A = 10.5 A = -10.5 B = A B = "10.5"

' "||||||" (Standardwert mit | als Nullzeichen) "String" "Intege" Wert ist abgeschnitten "DM " mit Leerzeichen aufgefllt

' ' ' ' '

0 (Standardwert) 0 (implizite Typumwandlung geht gut, solange i% < 256) geht immer gut geht nicht immer gut, wenn s$ Unicode

' ' ' ' ' ' ' ' '

0 (Standardwert) 0 (Standardwert) 10 -1 (Zweierkomplement) 10 (Nachkommastellen abgeschnitten) -10 (Nachkommastellen abgeschnitten) 10 105 (implizite Val-Umwandlung, Punkt nicht als Komma erkannt, wegen Lndereinstellungen!)

' Long Dim A As Long A = 123456789& A = &HFFFF

' ' ' ' A = &HFFFF& ' A = &HFFFFFFFF ' b% = 10: A = b% ' A = "123,456789" ' ' A = "123.456789" ' '

0 (Standardwert) 123456789 (Long-Literal wegen &) -1 (Zweierkomplement und Interpretation als Integer-Literal) 65535 (Long-Literal) -1 (Zweierkomplement) 10 (implizite Typumwandlung) 123 (implizite Val-Umwandlung Nachkommastellen abgeschnitten) 123456789 (implizite Val-Umwandlung und Punkt nicht als Komma erkannt, wegen Lndereinstellungen!)

' Single Dim A As Single ' 0.0 (Standardwert) A = 1023.1234567 ' 1023.123 (nicht mehr als 7 Stellen)

1 70

Variableninitialisierung

A = 1E-23 ' A = "123,123456" ' A = "123.456789" ' ' ' Double Dim A As Double A = 1023.1234567 A = &HFFFFFFFF A = "123,123456" A = "123.456789"

1E-23 123.1234 (implizite Val-Umwandlung) 1.234568E+8 (Rundung und Punkt wird wegen Lndereinstellungen nicht als Komma erkannt!)

' ' ' ' ' '

0.0 (Standardwert) 1023.1234567 (maximal 14 Stellen) -1 (Hexzahl zuerst als Long, Zweierkomplement) 123.1234 (implizite Val-Umwandlung) 1.234568E+8 (Rundung! Punkt wird wegen Lndereinstellungen nicht als Komma erkannt!)

Variableninitialisierung

' Boolean Dim A As Boolean Dim B As Boolean A = True A = (A <> True) A = 1234 A = 0

' ' ' ' ' '

False (Standardwert) False (Standardwert) True False True False

' Currency Dim A As Currency ' 0 (Standardwert) A = 12345.1234 ' 12345.1234 (Literal) A = "12345.1234" ' 123451234 (implizite Val-Umwandlung, Punkt wird ' wegen Lndereinstellungen nicht als Komma erkannt!) A = 12.123456 ' 12.1235 (Rundung auf vier Stellen hinter dem Komma) A = &HFFFFFFFF ' -1 (Longliteral und Zweierkomplement) ' Decimal Dim A As Variant ' Datentyp kann nicht direkt vereinbart werden! A = CDec("123456789012345678901234567890") ' 29 Stellen erlaubt A = CDec("12.12") ' 1212 (implizite Val-Umwandlung, Punkt wird

' wegen Lndereinstellungen nicht als Komma erkannt!) A = CDec("12,12") ' 12.12 A = CDec(12.12) ' 12.12 (Wandlung ber Single) A = CDec(&HFFFF) ' -1 (Zweierkomplement und Interpretation als ' Integer -Literal)
' Date Dim A As Date ' 00:00:00 A = "01.01.2000" ' 01.01.00 A = "1.1.00" ' 01.01.00 A = 12.12 ' 11.01.1900 02:52:48 (Wandlung ber Single) A = "1.1" ' 01.01.00 (aktuelles Jahr wird ergnzt) A = &HFFFF ' 29.12.1899 (Hausnummer, Wandlung ber Integer) A = "11.11.11 11:11" ' Faschingsbeginn im Jahre 2011 A = "12:23:01" ' 12:23:01 (Uhrzeit!) ' Object Dim A As Object

' Nothing (Standardwert)

1 71

Variableninitialisierung

Dim B As New Form1 ' B ist Objekt der Klasse Form1 Set A = New Form1 ' A ist Objektvariable und verweist auf neues Objekt ' der Klasse Form1. New ist erforderlich! B.Hide ' Set oder New ist nicht erforderlich! Set A = B ' Altes Objekt von A stirbt, und A wird Objektvariable ' fr B. Set ist erforderlich! A.Show ' B-Formular wird angezeigt B.Caption = "B" ' Titelleiste von B-Formular ndert sich in "B", denn ' Objektvariable A ist Synonym fr Objekt B

Variableninitialisierung

' Variant Dim A As Variant Dim B Dim C As Object B = Null A = C A = "1234" A = 1234 A = TypeName(A)

' ' ' ' ' ' ' '

Empty (Standardwert) Empty (Standardwert) Nothing (Standardwert) Null Nothing "1234" 1234 "Integer"

' Arrays Dim A(20) As Integer

' ' ' ' Dim B(3 To 30) As Date ' ' ' ' Dim C(10,2) As Integer ' Dim D() ' ' ' ReDim D(2) ' ' '
Verwandte Befehle

A ist Arrayvariable fr Array mit 21 Feldern bei standardmiger Indexzhlung ab 0, sonst mit 20 Feldern. Alle Feldwerte sind mit 0 (Standardwert fr Integer) initialisiert. B ist Arrayvariable fr Array mit 28 Feldern. Die Indexzhlung beginnt ab 3 und geht bis 30. Alle Feldwerte sind mit 00:00:00, dem Standardwert fr Date, initialisiert. C ist Arrayvariable fr zweidimensionales Array D wird als dynamisches Datenfeld des Typs Variant vereinbart (Visual Basic nimmt keine Initialisierung vor) D wird dimensioniert, dabei erhalten alle Felder den Wert Empty (Standardwert fr Variant).

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Property Let, Property Set


Verwandte Themen

Datentypen und ihre Operationen (S. 49); Geltungsbereiche von Variablen (S. 173); Variablendeklaration (S. 162)

1 72

Geltungsbereiche von Variablen

Geltungsbereiche von Variablen


Private, Public, Dim
Beschreibung

................................................... Bes c hreibung

Der Geltungsbereich oder Gltigkeitsbereich einer Variablen ist der Teil des Codes, in dem eine Variable und ihr Wert bekannt sind. Der engste Geltungsbereich ist die Prozedurebene. Er gilt fr Variablen, die innerhalb einer Prozedur bzw. Funktion als automatische oder statische Variablen vereinbart werden, sowie fr alle Argumentvariablen. Der nchstgrere Geltungsbereich ist die Modulebene. Er gilt fr automatische Variablen, die mittels Private oder Dim auerhalb eines Prozedurkrpers vereinbart werden. Den grten Geltungsbereich, die Programmebene, haben Variablen, wenn sie auf Modulebene mittels Public als ffentliche Variablen vereinbart werden. Wird ein Variablenbezeichner in zwei unterschiedlichen Geltungsbereichen eingefhrt, wovon der eine den anderen berlappt, bezeichnet er zwei unterschiedliche Variablen, von denen die eine nur im kleineren Geltungsbereich sichtbar ist und die andere im gesamten greren Geltungsbereich, abzglich des kleineren. Es besteht aber die Mglichkeit, von der Prozedurebene aus gleichnamige Variablen anzusprechen, die der Programmebene angehren, indem man den Bezeichner mit dem Modulnamen qualifiziert:
' Modul Form1 Public iWert As Integer Sub MeineSub() Dim iWert As Integer ... iWert = Form1.iWert ...
Anwendung

Geltungsbereiche von Variablen

' auf Programmebene vereinbart ' auf Prozedurebene vereinbart ' Mit Modulnamen qualifiziert

................................................... Anwendung

In der geschilderten Weise klingt das zunchst einmal recht abstrakt. Die Geltungsbereiche haben aber groe Vorteile. Zunchst einmal unterliegt man bei der Programmierung von Prozeduren und Funktionen so gut wie keinen Einschrnkungen, was die Wahl der Bezeichner betrifft. Zu beachten ist lediglich, dass man keinen Bezeichner erwischt, der auf Modulebene als Private vereinbart wurde und dessen aktueller Wert innerhalb der Prozedur bentigt wird. Die auf Modulebene gelegene Variable, Funktion oder Prozedur wre dann nmlich nicht ansprechbar. Fr ffentliche Bezeichner lsst sich die Herkunft dagegen jederzeit durch Qualifizierung ausdrcken, so dass hier keine Schwierigkeiten zu befrchten sind. Das ermglicht es insbesondere Objekten, ihre ffentlichen Elementvariablen und Methoden gegenseitig anzusprechen:
Sub Form1_Load() Dim frm2 As New Form2 frm2.ShowInTaskBar = False
Tipp

' Qualifizierung

................................................... Tipp

Die Bezeichner der ffentlichen Elemente von ffentlichen Datentypen lassen sich ber den Objektkatalog (Taste (F2)) herausfinden.
Verwandte Themen

................................................... Verwandte Them en

Bezeichner und Namensraum (S. 34)

1 73

Funktionen und Prozeduren


ProzedurBez [ParamListe] Call ProzedurBez [(WerteListe)] [Let] Var = FunktionsBez[(WerteListe)] := (Operator fr benannte Parameter) Man kann sagen, was mal will, einem Basic-Programmierer der sechziger Jahre wrde ein heutiges Visual-Basic-Programm nicht nur ausgesprochen spanisch vorkommen, er wrde es wahrscheinlich gar nicht als solches erkennen. In der Tat hat die Einfhrung von Funktionen und Prozeduren den Charakter der Sprache von Grund auf und nachhaltig verndert SpagettiCode ade, es lebe die strukturierte Programmierung. Das mit Visual Basic vorliegende Funktions- und Prozedurkonzept ist inzwischen soweit mit dem der Sprache C/C++ kompatibel, dass Visual Basic vollen Zugriff auf Bibliotheken bietet, die dem Standard fr DLLs gengen. Dazu zhlen natrlich in erster Linie die Systembibliotheken von Windows (Windows-APIs), aber auch die gesamte Palette an DLLs, die zur Untersttzung der einen oder anderen Anwendung geschrieben wurden. Ein eingefleischter C/C++-Programmierer wird aber immer noch das Konzept des Funktionszeigers vermissen, das Visual Basic wohl deshalb nicht explizit untersttzt, weil noch nicht einmal das Konzept des Zeigers an sich seinen Weg in die Sprache gefunden hat. Erfreulicherweise kann Visual Basic aber dennoch Systemdienste nutzen, fr deren Aufruf die Angabe einer Rckruffunktion erforderlich ist es gibt ein Hintertrchen, wenn auch nur ein recht schmales.
Beschreibung

................................................... Bes c hreibung

Funktionen/Prozeduren stellen ein eigenstndiges Stck Code dar, das eine definierte Schnittstelle zum restlichen Teil des Programms hat. Auf diese Weise erreichen Funktionen und Prozeduren eine weitgehende semantische Geschlossenheit, die fr die strukturierte Programmierung eine wichtige Voraussetzung ist. Die Definition der Schnittstelle findet sich im so genannten Funktionskopf bzw. Prozedurkopf. Ein solcher Kopf enthlt einen Bezeichner mit optionalem Spezifizierer fr den Geltungsbereich, eine formale Auflistung mit Deklaration aller Argumentvariablen, in der fr jede Variable festgelegt wird, ob der entsprechende Parameter als Wert oder als Verweis bergeben wird, sowie im Falle einer Funktion den Typ des Rckgabewerts. Die Definition dessen, was eine Prozedur/Funktion macht (ihr Code), findet sich schlielich als Anweisungsfolge im Prozedurkrper bzw. Funktionskrper. Das dem Bezeichnerwesen von Visual Basic zugrunde liegende Qualifizierungsmodell ordnet eine Funktion/Prozedur immer dem Modul als privates oder ffentliches Element zu, das seinen Krper enthlt. Im Zusammenhang mit Objekten und Klassen spricht man statt von Funktionen und Prozeduren von Methoden. Um auf eine Funktion/Prozedur von DLLs zugreifen zu knnen, die nicht standardmig von Visual Basic untersttzt werden, sind in dem jeweiligen Modul explizite Importdeklarationen ntig (vgl. Routinen aus DLLs und der Windows-API einsetzen, S. 185)
Anwendung

................................................... Anwendung

In Visual Basic ist die Unterscheidung zwischen Prozeduren und Funktionen sehr streng. Eine Prozedur verkrpert eine Anweisung und wird wie eine solche notiert. Eine Funktion ist dagegen eine Operation, die einen Wert mit einem zugrunde liegenden Datentyp verkrpert. Mithin lsst sich eine Funktion also berall da notieren, wo ein Wert erwartet wird: als Rechtswert bei Zuweisungen und in Ausdrcken. Rein formal gesehen besteht der Unterschied zwischen Prozeduren und Funktionen somit darin, dass Prozeduren keinen Wert zurckgeben, whrend Funk-

 %#

Geltungsbereiche von Variablen

tionen einen Funktionswert liefern. In allen anderen Aspekten sind sich die beiden mehr hnlich als dass sie sich unterscheiden. So lsst sich eine Anweisung ohne Schwierigkeiten als Funktion formulieren und eine Funktion ebenso einfach als Prozedur die Wertbergabe lsst sich ja ber Parameter lsen.

Aufruf
Der Aufruf einer Funktion kann berall dort erfolgen, wo ein Wert mit dem Ergebnistyp der Funktion stehen kann. Man notiert dazu einfach den Funktionsbezeichner gefolgt von einer geklammerten Werteliste mit Komma als Trennzeichen, welche der Reihenfolge nach die einzelnen Parameter mit Werten versorgt.
sDateiname = Left(sDateiname,10)

Geltungsbereiche von Variablen

Fr den Aufruf von Prozeduren kennt Visual Basic dagegen zwei unterschiedliche Notationen: das Anweisungsformat oder das Call-Format. Das Anweisungsformat sieht die Nennung des Prozedurbezeichners mit nachfolgender nicht geklammerter Werteliste als eigenstndige Anweisung vor.
Rnd 1.1234

Das Call-Format berlsst der Anweisung Call den Aufruf der Prozedur, wobei diese im Anschluss an das Schlsselwort Call wie eine Funktion also mit geklammerter Werteliste notiert wird.
Call Rnd (1.1234)

Die Werteliste kann auch fehlen, wenn die Funktions-/Prozedurdefinition dies zulsst. Ein leeres Klammerpaar ist dann nicht zu notieren:
datZeit = Now Rnd ' Now ist parameterlose Funktion (Eigenschaft) ' Prozedur ist fr parameterlosen Aufruf definiert

Benannte Argumente
Seit noch nicht langer Zeit untersttzt Visual Basic auch das Konzept der benannten Argumente fr Funktionen und Prozeduren (genauer: Visual Basic 6.0 (SP3) untersttzt das Konzept in zunehmendem Mae, da die Objektbibliothek VB dem Konzept bisher noch nicht angepasst wurde). Es sieht vor, dass fr den Aufruf einer Funktion/Prozedur anstelle einer Werteliste auch eine Wertzuordnungsliste bergeben werden kann, deren Eintrge eine explizite Wertzuordnung zwischen dem Bezeichner eines Parameters und seinem Wert vorschreiben. Das hat den Vorteil, dass die Reihenfolge der Elemente in der Liste nicht mehr an die Vereinbarungsreihenfolge angepasst sein muss, erspart aber nicht die Versorgung obligatorischer Parameter mit Werten. Whrend in einfachen Wertelisten weggelassene optionale Parameter zumindest durch ein Komma zu notieren sind, es sei denn, sie stehen am Schluss der Liste, mssen in Wertzuordnungslisten tatschlich nur so viele Eintrge enthalten sein, wie es obligatorische Parameter gibt. Die ganze Sache sieht dann so aus:
Sub MeineProzedur(a, Optional b = 0, Optional c = 0, Optional d = 2) ... End Sub Sub Demo() MeineProzedur 2, , , 1 ' Aufruf mit Werteliste MeineProzedur d:= 1, a:= 2 ' Aufruf mit Wertzuordnungsliste End Sub

1 76

Geltungsbereiche von Variablen

Gegenseitiger und rekursiver Aufruf


Funktionen und Prozeduren knnen jederzeit andere Funktionen und Prozeduren aufrufen, deren Bezeichner im jeweiligen Geltungsbereich bekannt sind. Erlaubt ist auch der Selbstaufruf man spricht dann von einer rekursiven Funktion oder einer rekursiven Prozedur. Bei rekursivem Aufruf ist allerdings auf einen sicheren Abbruch der Rekursion zu achten, damit kein Laufzeitfehler wegen berlaufs des Stapelspeichers auftritt. Die Festlegung des Funktionswerts einer Funktion erfolgt durch Zuweisung eines Werts an den Funktionsbezeichner innerhalb des Funktionskrpers. Als Linkswert verkrpert der Funktionsbezeichner nichts weiter als eine Variable mit dem Rckgabetyp der Funktion als Rechtswert dagegen einen rekursiven Aufruf!
Function Fakultt(a) If a < 2 Then Fakultt = 1 Else Fakultt = a * Fakultt(a-1) End If End Function

Geltungsbereiche von Variablen

In allen Fllen ist anstelle der rekursiven aber auch eine iterative Formulierung mglich, die zwar weniger elegant aussieht, dafr aber sicherer und meist auch schneller ist:
Function Fakultt(zahl) Dim Erg Erg = 1 while zahl > 1 Erg = Erg * zahl zahl = zahl -1 Wend Fakultt = Erg End Function
Tipp

................................................... Tipp

Es lohnt sich, beim Programmentwurf auf eine gute Strukturierung durch Funktionen und Prozeduren zu achten. Wer zu viel in eine Funktion/Prozedur packt, verschenkt Universalitt. Fassen Sie Ihren Code daher am besten in viele kleine mglichst allgemein und bersichtlich gehaltene Funktionen/Prozeduren und dokumentieren Sie die Aufrufschnittstellen gut in Form von Kommentaren.
Warnungen

................................................... Wa rnungen
Da in Visual Basic sowohl Sprungmarken als auch mehrere Befehle in einer Zeile durch einen Doppelpunkt notiert werden, ist folgender Aufruf zweideutig:
Save: Print " Me"

Der Compiler betrachtet Save hier als Sprungmarke, wie folgendes Programm zeigt:
Private Sub Form_Load() Save: Print " Me" Call Save: Print "Me", End Sub Sub Save() ' Ausgabe: Me ' Ausgabe: Save Me

1 77

Parameterbergabe an Funktionen und Prozeduren

Print "Save "; End Sub

Parameterbergabe an Funktionen und Prozeduren

Ein kleiner Tipp: Der Editor der Entwicklungsumgebung zieht Sprungmarken automatisch an den Zeilenanfang. Daran mssten Sie bereits merken, dass etwas nicht stimmt. Am besten aber, Sie gewhnen sich an, keine Anweisungen hinter Sprungmarken zu setzen, das erhht auch die Lesbarkeit des Programms. Der Compiler von Visual Basic kann arithmetische Ausdrcke aus Optimierungsgrnden intern umstellen. Vermeiden Sie daher Function-Aufrufe innerhalb eines arithmetischen Ausdrucks, wenn die Funktion als Seiteneffekt den Wert von Variablen ndert, die in diesem Ausdruck auftreten.
Verwandte Themen

................................................... Verwa ndte Them en

Methoden (S. 199); Eigenschaften (S. 201); Ereignisroutinen (S. 204)

Parameterbergabe an Funktionen und Prozeduren


[Geltungsbereich] [Static] Function FuncName ([ParamListe]) [As Typ] ... End Function [Geltungsbereich] [Static] Sub ProcName ([ParamListe]) ... End Sub Function IsMissing(ArgumentName) As Boolean Funktionen/Prozeduren lassen sich als parametergesteuerte Unterprogramme auffassen, die aus den Werten ihrer Parameter weitere Werte generieren und zudem gewisse Seiteneffekte haben. Die Sichtbarkeit des Bezeichners FuncName bzw. ProcName beschrnkt sich auf den vereinbarten Geltungsbereich Geltungsbereich. Geltungsbereich = Public | Private | Friend Fehlt die Angabe eines Geltungsbereichs oder lautet der Spezifizierer Public, ist der Bezeichner auf Programmebene bekannt. Lautet der Spezifizierer dagegen Private, ist der Bezeichner nur auf Modulebene bekannt. In Klassenmodulen ist weiterhin die Angabe des Spezifizierers Friend mglich, der die Sichtbarkeit der Methode auf das aktuelle Projekt beschrnkt und einen expliziten Aufruf durch Besitzer von Objekten dieser Klasse vereitelt. Die zustzliche Angabe des Spezifizierers Static bewirkt, dass alle innerhalb der Funktion/Prozedur implizit oder explizit deklarierten Variablen generell als statische Variablen vereinbart werden, so dass diese von einem Aufruf zum nchsten ihren Wert behalten und nur beim ersten Aufruf automatisch initialisiert werden. Jeder Funktion/Prozedur ist eine Parameterliste ParamListe zugeordnet, die bis zu 59 Parametervereinbarungen umfassen, aber auch leer sein kann. ParamListe = [Param[, Param ...]] Die Vereinbarung eines einzelnen Parameters Param hat die Gestalt Param = [Optional][ByVal | ByRef][ParamArray] Var[()] As Typ [= Vorgabe] Ein Parameter kann als Platzhalter fr einen Eingabewert, einen Ausgabewert oder einen Ein-/ Ausgabewert fungieren, der innerhalb der Funktion/Prozedur ber die Argumentvariable Var verfgbar wird. Die Deklaration von Argumentvariablen fr reine Eingabeparameter erfordert

1 78

Parameterbergabe an Funktionen und Prozeduren

den Spezifizierer ByVal, die von Argumentvariablen fr Ausgabe- bzw. Ein-/Ausgabeparameter den Spezifizierer ByRef. Letzterer ist optional, da Visual Basic Argumentvariablen auch implizit mit dem Zusatz ByRef vereinbart. Arrays und Objekte lassen sich ausschlielich als ByRef-Parameter bergeben. Parameter sind im Allgemeinen obligatorisch, es sei denn, die zugehrige Argumentvariable wird mit dem Zusatz Optional vereinbart. Ein obligatorischer Parameter muss beim Aufruf der Funktion/Prozedur mit einem Wert versorgt werden, ein optionaler kann auch weggelassen werden. Als Vorgabewert fr optionale Parameter nimmt Visual Basic den standardmigen Initialisierungswert des Datentyps Typ, sofern keine explizite Zuweisung eines Vorgabewerts Vorgabe deklariert ist. Um innerhalb der Funktion/Prozedur festzustellen, ob fr einen optionalen Variant-Parameter beim Aufruf ein Wert spezifiziert wurde, lsst sich die Funktion IsMissing einsetzen. Sie ist vom Typ Boolean und liefert den Wert True, wenn der im Argument genannte optionale Parameter beim Aufruf weggelassen wurde.
Sub TestProc(Optional OptParam) If IsMissing(OptParam) Then ... End Sub

Parameterbergabe an Funktionen und Prozeduren

Fr den letzten Parameter in einer Parameterliste ist darber hinaus der Spezifizierer ParamArray erlaubt unter der Voraussetzung jedoch, dass die Argumentvariable als dynamisches Array des Typs Variant ohne weitere Spezifizierer vereinbart wird. Eine Funktion/Prozedur, fr die ein ParamArray-Parameter vereinbart ist, kann beliebig lange Parameterlisten verarbeiten (vgl. Print).
Anwendung

................................................... Anwendung

Fr die Reihenfolge der Parameter gibt es keine Vorschriften. Es ist aber blich, Eingabeparameter an den Beginn der Parameterliste zu setzen, Ein-/Ausgabeparameter in der Mitte und die Ausgabeparameter an den Schluss. Allerdings hat die exakt umgekehrte Reihenfolge den Vorteil, dass sich optionale Parameter an den Schluss setzen lassen, damit sie nicht notiert werden mssen. Wenn Sie jedoch die Aufrufsyntax der benannten Argumente benutzen, spielt die Reihenfolge ohnehin keine Rolle. Der Unterschied zwischen reinen Eingabeparametern und Parametern mit Ein- und Ausgabefunktion bzw. reiner Ausgabefunktion ist konzeptueller Natur und erfordert aufseiten des Programmierers eine gewisse Disziplin. Da ByVal-Variablen beim Aufruf Kopien der bergebenen Werte erhalten, kann die Funktion/Prozedur damit anstellen, was sie will: Eventuelle Wertnderungen verbleiben auf der Prozedurebene und sind fr den Aufrufer generell unsichtbar. Anders verhlt es sich, wenn die Deklaration einer Argumentvariablen mit dem standardmigen Spezifizierer ByRef erfolgt. In diesem Fall wird aus der Argumentvariablen eine Zeigervariable, deren Wert die Adresse des in dem entsprechenden Parameter bergebenen Werts ist ein Konzept, das als solches in Visual Basic nirgendwo sonst so offen zu Tage tritt. Am Gebrauch der Argumentvariablen ndert sich uerlich dadurch nichts, auer dass sie als Platzhalter fr einen Ausgabewert bzw. Ein-/Ausgabewert fungieren kann. Nach auen hin wirksame Wertnderungen sind sinnvollerweise nur mglich, wenn als Parameter eine Variable (also ein Linkswert) bergeben wurde, da diese das indirekte Ziel jeglicher Wertnderungen seitens der Argumentvariablen ist. Wird einem ByRef-Parameter ein literaler Wert, eine Konstante, ein Funktionswert oder der Wert eines berechneten Ausdrucks bergeben, steht dieser nur als Eingabewert zur Verfgung; der Versuch einer nderung fhrt zwar zu keinem Laufzeitfehler, bleibt aber wirkungslos.

1 79

Parameterbergabe an Funktionen und Prozeduren

Warnung

................................................... Wa rnung

Nachdem Visual Basic alle Parameter, die nicht explizit mit ByVal spezifiziert werden, als ByRefParameter vereinbart, sind bei sorglosem Umgang mit Argumentvariablen fr Eingabewerte unerwnschte Rckwirkungen auf die Ebene des Aufrufers mglich ein Eingabewert kann so unbemerkt zum Ein-/Ausgabewert mutieren. Fehler dieser Art sind meist schwer zu finden. Um sie auszuschlieen, besteht auch die Mglichkeit, Variablen, die nur Eingabewerte bereitstellen, in der Werteliste zu klammern. Visual Basic sieht einen geklammerten Wert als Ausdruck an und verhindert so Rckwirkungen auf die Variable.
Beispiele

Parameterbergabe an Funktionen und Prozeduren

................................................... Beis piele

Die Funktion Standardabweichung berechnet die Standardabweichung einer Messreihe mit der Menge der Messwerte als Grundgesamtheit. Die Anzahl der Parameter fr den Aufruf der Funktion ist nicht festgelegt, wie die Aufrufe zeigen.
... Print Standardabweichung(15.2, 11.1, 13.4,12.2, 18.3) ' 2,517... Print Standardabweichung(15.2, 11.1, 13.4,12.2, 18.3, 12.1) ' 2,417... ... Function Standardabweichung(ParamArray MessWerte()) Dim iAnz As Integer iAnz = UBound(MessWerte) + 1 For Each i In MessWerte Sum = Sum + i Qsum = Qsum + i * i Next i Standardabweichung = Sqr((iAnz * Qsum Sum * Sum) / (iAnz * iAnz)) End Function

Die folgende Prozedur demonstriert den Unterschied zwischen einem ByRef- und einem ByValParameter sowie die Wirkung eines Ausdrucks auf einen ByRef-Parameter:
... Dim iWert1, iWert2 As Integer iWert1 = 10 iWert2 = 10 ByValByRef iWert1, iWert2 Print iWert1, iWert2 iWert2 = 10 ByValByRef iWert1, (iWert2) Print iWert1, iWert2 ... Sub ByValByRef(ByVal a As Integer, b a = a * a b = b * b End Sub
Verwandte Themen

' Ausgabe: 10

100

' (iWert2) ist Ausdruck! ' Ausgabe: 10 10 As Integer)

................................................... Verwandte Them en

Ereignisroutinen (S. 204)

1 80

Funktionen selbst definieren

Funktionen selbst definieren


[Public| Private | Friend][Static] Function Name [(ParamListe)][ As Typ] [Anweisungsfolge] [Name = Ausdruck] [Exit Function] [Anweisungsfolge] [Name = Ausdruck] End Function
Beschreibung

................................................... Bes c hreibung

Funktionen selbst definieren

Die Definition einer eigenen Funktion (Methode) gliedert sich in drei Schritte: 1. Deklaration der prozeduralen Schnittstelle 2. Deklaration eines Rckgabetyps 3. Definition des Funktionskrpers mit Zuweisung des Funktionswerts Die prozedurale Schnittstelle einer Funktion umfasst die Spezifikation des Funktionsbezeichners sowie die Deklaration der Parameterliste. Dieser Schritt ist im Abschnitt Parameterbergabe an Funktionen und Prozeduren (S. 178) ausfhrlich beschrieben. Da eine Funktion im Gegensatz zu einer Prozedur einen Wert verkrpert, den sie als Funktionswert zurckliefert, definiert der Rckgabetyp Typ den Datentyp des Werts, den die Funktion zurckgibt. Fehlt die Angabe eines Rckgabetyps, lautet die Voreinstellung Variant. Zu den mglichen Rckgabetypen zhlen die elementaren Datentypen Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (Decimal wird derzeit nur als Untertyp von Variant untersttzt), benutzerdefinierte Datentypen, Variant sowie Objektverweise des Typs Object. Darber hinaus kann eine Funktion auch ein dynamisches Array mit einem der genannten Datentypen als Elementtyp zurckgeben. Der Funktionskrper kann eine beliebige Anweisungsfolge enthalten, die fr die Berechnung des Funktionswerts sowie der gegebenenfalls ber Argumentvariablen zurckzugebenden Ausgabewerte erforderlich ist. Der Funktionswert Ausdruck wird dem Funktionsbezeichner Name zugewiesen und die anderen Ausgabewerte den entsprechenden Argumentvariablen. Die an beliebiger Stelle erlaubte Anweisung Exit Function gibt die Kontrolle unmittelbar an den Aufrufer zurck. Falls dem Funktionsbezeichner bis dahin noch kein Rckgabewert zugewiesen wurde, liefert die Funktion den standardmigen Initialisierungswert des Rckgabetyps.
Anwendung

................................................... Anwendung

Der Unterschied zwischen einem Ausdruck und einer Funktion ist gar nicht so gro. Beide liefern einen Wert, den sie auf Basis anderer Werte berechnen. Im Gegensatz zu einem Ausdruck legt eine Funktion im Allgemeinen aber ihre Schnittstelle mit der Auenwelt en bloc in Form der prozeduralen Schnittstelle offen so zumindest der hehre Anspruch. In der Praxis sieht es oft anders aus: Um Aufrufparameter zu sparen, wird viel mit globalen Variablen hantiert, was zwar das Laufzeitverhalten der Funktion verbessern kann, jedoch gegen die goldenen Regeln fr die strukturierte Programmierung verstt und nicht selten zu schwer auffindbaren Bugs im Code fhrt. Gewhnen Sie sich an, nach Mglichkeit alle Werte, die eine Funktion vom Aufrufer bentigt, ber die prozedurale Schnittstelle zugnglich zu machen und gegebenenfalls als optionalen Parameter mit sinnvollem Vorgabewert zu deklarieren. Der Gebrauch von globalen Variablen sollte weitgehend auf das Wesentliche beschrnkt bleiben. ByVal-Parameter schtzen zwar vor ungewollten Seiteneffekten, kosten aber aufgrund der zu erstellenden Kopien bei Werten mit umfangreichen Reprsentationen etwa bei Zeichenfolgen oder benutzerdefinierten Datentypen wertvolle Laufzeit. ByRef-Parameter sind dann oft die bessere Wahl.

1 81

Funktionen selbst definieren

Funktionen selbst definieren

Die grte Kunst bei der Programmierung besteht darin, es einer potenziellen Anweisungsfolge anzusehen, dass sie eine gute Funktion abgibt, und dann die Schnittstelle dieser Funktion geeignet festzulegen. Das Motto dafr lautet, wie schon einst bei Csar: Teile und herrsche. Je allgemeiner und je krzer eine Funktion, desto besser. Das erleichtert die Fehlersuche ebenso wie die sptere Codepflege. Zu guter Letzt noch ein Wort zum Gebrauch der Anweisung Exit Function. Eine weitere goldene Regel der strukturierten Programmierung besagt, dass Routinen mglichst nur einen Ausgang haben sollten. Gegen den berlegten Gebrauch von Exit Function ist natrlich nichts einzuwenden. Je komplizierter die Logik jedoch wird, desto unbersichtlicher und schwerer lesbar wird eine Funktion, wenn sie zu viele Ausgnge hat. Am besten, Sie spalten den Code dann in mehrere kleine Funktionen auf.
Tipp

................................................... Tipp

Bei Problemstellungen, in denen die Laufzeit eine Rolle spielt, knnen Funktionsaufrufe zum Hemmschuh werden, insbesondere wenn noch ByVal-Parameter im Spiel sind. In einigen Fllen verbessert sich das Laufzeitverhalten, wenn man zu Inline-Formulierungen bergeht, also anstelle eines Funktionsaufrufs den eigentlichen Code der Funktion setzt. Allerdings ist auch der Visual-Basic-Compiler in der Lage, von sich aus Funktionen in Inline-Code zu verwandeln, sofern der Compilerschalter CODE-AUSFHRUNGSGESCHWINDIGKEIT OPTIMIEREN gesetzt ist, so dass sich Vergleichsmessungen lohnen.
Beispiel

................................................... Beis piel

Die rekursive Funktion NextPrim ermittelt die nchste Primzahl, die kleiner oder gleich dem Eingabeparameter lZahl ist. Fr negative Werte und 0 liefert die Funktion den Wert 0.
Function NextPrim(ByVal lZahl As Long) Dim i As Long If lZahl <= 3 Then If lZahl <= 0 Then NextPrim = 0 Else NextPrim = lZahl End If Else For i = 2 To Sqr(lZahl) If lZahl Mod i = 0 Then NextPrim = NextPrim(lZahl 1) Exit Function End If Next NextPrim = lZahl End If End Function
Verwandte Befehle

As Long

' ' ' '

Alle mglichen Teiler prfen Ist i Teiler? Ja: Rekursion liefert Ergebnis Das war's schon

' Kein Teiler, lZahl ist Primzahl

................................................... Verwa ndte Befehle

Sub
Verwandte Themen

................................................... Verwandte Them en

Ereignisroutinen (S. 230)

1 82

Prozeduren selbst definieren

Prozeduren selbst definieren


[Private | Public][Static] Sub Name [(ParamListe)] [Anweisungsfolge] [Exit Sub] [Anweisungsfolge] End Sub
Beschreibung

................................................... Bes c hreibung

Die Definition einer eigenen Prozedur (Methode) gliedert sich in zwei Schritte:

Prozeduren selbst definieren

1. Deklaration der prozeduralen Schnittstelle 2. Definition des Prozedurkrpers Die prozedurale Schnittstelle einer Prozedur umfasst die Spezifikation des Prozedurbezeichners sowie die Deklaration der Parameterliste. Dieser Schritt ist im Abschnitt Parameterbergabe an Funktionen und Prozeduren (S. 178) ausfhrlich beschrieben. Der Prozedurkrper kann eine beliebige Anweisungsfolge enthalten, die fr die Berechnung der gegebenenfalls ber Argumentvariablen zurckzugebenden Ausgabewerte erforderlich ist. Ausgabewerte werden einfach den entsprechenden Argumentvariablen zugewiesen. Die an beliebiger Stelle erlaubte Anweisung Exit Sub unterbricht die Ausfhrung der Prozedur und gibt die Kontrolle unmittelbar an den Aufrufer zurck.
Anwendung

................................................... Anwendung

Der gesamte Code eines Visual-Basic-Programms liegt in Form von Prozeduren und Funktionen vor, die sich teils gegenseitig aufrufen, teils vom Laufzeitsystem aufgrund entsprechender Benutzerinteraktionen im Zuge der Ereignisbehandlung (Ereignisprozeduren) aufgerufen werden. Whrend eine Funktion einen Rckgabewert liefern muss und somit als Wert zu betrachten ist, erweitert eine Prozedur das Spektrum der in Visual Basic verfgbaren Anweisungen. Da Prozeduren aber genau wie Funktionen ber Ein-/Ausgabeparameter mit ihren Aufrufern kommunizieren, ist der Unterschied zwischen Funktionen und Prozeduren mehr eine Frage der Formulierung einer Lsung und damit des persnlichen Stils als des Einsatzzwecks, denn jede Funktion lsst sich letztlich auch als Prozedur schreiben und umgekehrt. Eine Prozedur legt genauso wie eine Funktion ihre Schnittstelle mit der Auenwelt en bloc in Form der prozeduralen Schnittstelle offen. Gewhnen Sie sich an, nach Mglichkeit alle Werte, die eine Prozedur vom Aufrufer bentigt, ber die prozedurale Schnittstelle zugnglich zu machen und gegebenenfalls als optionalen Parameter mit sinnvollem Vorgabewert zu deklarieren. Das vereinfacht die Handhabung der Prozedur. Der Gebrauch von globalen Variablen sollte weitgehend auf das Wesentliche beschrnkt bleiben. ByVal-Parameter schtzen zwar vor ungewollten Seiteneffekten, kosten aber aufgrund der zu erstellenden Kopien bei Werten mit umfangreichen Reprsentationen etwa bei Zeichenfolgen oder benutzerdefinierten Datentypen wertvolle Laufzeit. ByRef-Parameter sind dann meist die bessere Wahl.

Sub Main
In einem Standardmodul kommt der Prozedur mit dem Bezeichner Main eine spezielle Bedeutung zu: Sie lsst sich im Dialog PROJEKTEIGENSCHAFTEN eines Projekts anstelle eines Formularobjekts als Startroutine einer Komponente (lies: ausfhrbare Datei oder Bibliothek) festlegen. Lassen Sie sich dabei nicht durch die unglcklich gewhlte deutsche Beschriftung Startobjekt verwirren. Startobjekt ist in dem Fall das Standardmodul, das die Prozedur Main bereitstellt. Enthlt ein Projekt mehrere Standardmodule, darf jeweils nur in einem die Prozedur Main definiert sein.

1 83

Prozeduren selbst definieren

Prozeduren selbst definieren

Sub Main eines Standardmoduls als Startroutine festlegen


Das Laufzeitsystem von Visual Basic fhrt Main in diesem Fall bei jedem Start der Komponente als Startcode aus. Main ist dann gegebenenfalls fr den Aufruf des Startformulars verantwortlich, wenn die Komponente im Stand-alone-Modus und nicht als Automatisierungsobjekt ausgefhrt wird.
Sub Main() ... If App.StartMode = vbSModeStandalone Then StartForm.Show ...
Beispiel

................................................... Beis piel

Das folgende Beispiel ist eine recht ntzliche Sortierroutine fr Arrays mit beliebigem Elementtyp. Sie arbeitet nach dem Bubble-Sort-Algorithmus. Die Routine selbst ist eine Prozedur, bedient sich aber einer Funktion fr den Vergleich und einer Prozedur fr das Vertauschen von Werten. Obwohl die Routine bereits recht allgemein formuliert ist sie funktioniert mit allen elementaren Datentypen sind noch Anpassungen an andere Datentypen denkbar. Haben Sie beispielsweise schon einmal Bilder nach Farben sortiert?
... Dim b() b() = Array("Essig", "Fliege", "Apfel", "Gold") BubbleSort b() For Each i In b Print i; " "; ' Ausgabe: Apfel Essig Fliege Gold Next Print b() = Array(23.3, 45.2, 15.3, 893.2, 123, 12.123) BubbleSort b() For Each i In b Print i; " "; ' Ausgabe: 893,2 123 45,2 15,3 12,123 Next ...

1 84

Routinen aus DLLs und der W indow s- API einsetzen

Sub BubbleSort(Werte()) ' ByRef! For j = UBound(Werte) To 1 Step -1 ' rckwrts durch Array For i = 0 To j 1 ' vorwrts durch unsort. Teil If Vgl(Werte(i), Werte(i + 1)) Then Vertausche Werte(i), Werte(i + 1) End If Next i Next j End Sub

Prozeduren selbst definieren

Function Vgl(a, b) As Boolean ' Select Case VarType(a) ' Case vbString If StrComp(a, b, vbTextCompare) Case vbInteger To vbBoolean If a < b Then Vgl = True ' End Select End Function Sub Vertausche(a, b) c = a: a = b: b = c End Sub
Verwandte Befehle

Vergleichsoperation ByRef-Parameter Abhngig von Untertyp = 1 Then Vgl = True Vergleich knnte auch anders lauten

' ByRef-Parameter!

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Function
Verwandte Themen

Ereignisroutinen (S. 204)

Routinen aus DLLs und der W indows- API einsetzen


[Public | Private] Declare Function APIFkt Lib "API" _ [Alias "APIRoutine"][(ParamListe)] As Typ [Public | Private] Declare Sub APIProc Lib "API" [Alias "APIRoutine"][(ParamListe)]
Beschreibung

................................................... Bes c hreibung

Bei der Windows-API handelt es sich um die Menge der Betriebssystemroutinen, die Windows fr die Anwendungsprogrammierung zur Verfgung stellt. Obwohl Visual Basic an sich eine geschlossene Programmierwelt mit integrierter Automatisierungsschnittstelle zu ActiveXSteuerelementen und ActiveX-Komponenten ist, stellt die Sprache aber auch Mittel und Wege bereit, in gewhnlichen DLLs beheimatete Routinen anzusprechen, die nicht in Visual Basic programmiert sind. Dazu zhlen nicht nur die gut tausend Funktionen und Prozeduren der Win32-API, von denen nur wenige in der standardmigen Bibliothek von Visual Basic eine Entsprechung gefunden haben, sondern auch die gesamte Vielfalt der Bibliotheksprodukte zahlloser Drittanbieter, die sich auf dem Windows-Markt tummeln. Sich bei der Visual-Basic-Programmierung auf bereits bestehende DLL-Routinen zu sttzen, hat nicht nur Vorteile, sondern auch ganz klare Nachteile: Aufrufe von DLL-Routinen bzw. der Einsatz von API-Funktionen fhren aus der Geborgenheit der Visual-Basic-Umgebung heraus.

1 85

Prozeduren selbst definieren

Die Umsicht des Compilers endet nmlich mit den Schnittstellendeklarationen fr die externen Routinen. Da die Routinen in einer anderen Programmiersprache geschrieben sind fr die Windows-API ist das C/C++ , gilt es, sich an die Regeln dieser Sprache zu halten. Es ist zwar nicht unbedingt erforderlich, diese Sprache selbst zu knnen, vorteilhaft ist es aber allemal. Um ein gewisses Verstndnis der Sprache und der von ihr verwendeten Reprsentationen fr die elementaren Datentypen kommt man daher nicht herum, damit die bergabe von Parametern und Funktionswerten auch klappt. Darber hinaus ist natrlich auch ein Verstndnis der verwendeten Bibliothek in ihrem Funktionszusammenhang erforderlich. Auf die Windows-API bezogen bedeutet das, dass man zunchst einmal wissen muss, welche Funktionen es gibt, in welcher Bibliothek diese zu finden sind (dafr gibt es das Add-In API-VIEWER), mit welchen Konzepten und Datentypen diese Funktionen arbeiten, welche Seiteneffekte sie haben und welche Pflichten mit ihrer Benutzung verbunden sind. Letzteres ist ein recht heikles Thema, da das Laufzeitsystem von Visual Basic smtliche Verwaltungsarbeiten im Zusammenhang mit komplexen Datentypen, ins Leben gerufenen Objekten, geffneten Dateien usw. von sich aus bernimmt und notfalls auch einmal hinterher rumt, wenn etwa eine Datei nicht geschlossen oder gesperrte Datenstze nicht wieder entsperrt wurden. Die Windows-API weist da bei weitem keine solche Toleranz auf und fordert einen wahrhaft peniblen Umgang mit den angeforderten Ressourcen, seien es Handles, Laufzeitinstanzen oder sonstige Gren, die aufseiten des Betriebssystems eine Speicherbelegung bewirken. DLLs werden im selben Prozess wie die Visual-Basic-Anwendung ausgefhrt. Fehler durch Angabe falscher Parameterwerte knnen sich daher katastrophal auswirken und nicht nur das Programm zum Absturz bringen, sondern zuweilen auch Windows. Leider kann der VisualBasic-Compiler im Zusammenhang mit DLL-Routinen nur eine sehr unvollstndige Typberprfung durchfhren, die ber das Grobformale nicht hinausgeht. Obwohl die Abbildung der elementaren Datentypen zwischen C/C++ und Visual Basic noch halbwegs geradlinig ist, treten bereits die ersten Komplikationen auf, wenn Zeichenfolgen ins Spiel kommen. Da stellt sich die Frage, ob Unicode oder ANSI-Code und ob ein C-String mit Nullbyte am Ende oder ein PascalString mit Deskriptor erwartet wird. Richtig schwierig kann es bei den benutzerdefinierten Datentypen werden, wenn nicht klar ist, mit welcher Speicherausrichtung (8, 16 oder 32 Bit) eine DLL in Bezug auf die zusammengesetzten Datentypen, die sie verwendet, kompiliert worden ist. In anderer Hinsicht problematisch ist der Umgang mit Zeigern, einem Konzept, das es in Visual Basic offiziell gar nicht gibt und das gewissermaen nur ber die Hintertr in Form von ByRef-Parametern bei Funktionen/Prozeduren zugnglich wird. Ein noch offensichtlicheres Hintertrchen ist der AddressOf-Operator, mit dessen Hilfe sich schlielich sogar Funktionszeiger auf Visual-Basic-Routinen gewinnen lassen, wenn Rckrufroutinen gefordert sind. Um eine DLL-Routine in einem Modul ansprechen zu knnen, muss diese im Bereich ALLGEMEIN ber eine geeignete Declare-Anweisung als ffentliche (Public) oder moduleigene (Private) Funktion (Function) oder Prozedur (Sub) deklariert sein (ffentliche Vereinbarungen importierter Routinen sind in Visual Basic 6.0 nur in Standardmodulen erlaubt). Der Bezeichner APIFkt bzw. APIProc ermglicht es, die importierte Routine innerhalb des vereinbarten Geltungsbereichs wie eine ganz gewhnliche Funktion oder Prozedur aufzurufen. Falls dieser Bezeichner mit dem Bezeichner APIRoutine der Routine bereinstimmt, kann der optionale Alias-Zusatz entfallen, ansonsten nicht. Ein Alias-Zusatz ermglicht es insbesondere, auch Routinen einzufhren, deren Bezeichner in Visual Basic keine gltigen Bezeichner wren, etwa weil sie mit einem Unterstrich beginnen. Der obligatorische Lib-Zusatz macht den Namen der DLL bekannt, in der die Routine enthalten ist. Er muss als literale Zeichenfolge notiert sein. Die optionale Parameterliste ParamListe und der bei Funktionsdeklarationen zustzlich anzugebende Rckgabetyp Typ unterliegen den gleichen Anforderungen wie bei der Definition einer gewhnlichen Funktion/Prozedur (vgl. Parameterbergabe an Funktionen und Prozeduren,

Prozeduren selbst definieren

1 86

Routinen aus DLLs und der W indow s- API einsetzen

S. 178). Fr einen ordnungsgemen Aufruf der Bibliotheksroutine ist es aber unerlsslich, dass Sie die Parameter- und Typanforderungen der Routine mit den sprachlichen Mitteln von Visual Basic exakt abbilden.
Anwendung

................................................... Anwendung

Eines vorweg: Der Einsatz von API-Routinen wird nur Programmierern empfohlen, die bereits eine gewisse Vorstellung davon haben, was einen bei der Programmierung mit der Win32-API erwartet. Vom Prinzip her ist es ist zwar denkbar, sich der Win32-API von Visual Basic aus zu nhern, fr die ernsthafte Programmierung ist der Weg aber zu steinig. Wer sich dagegen einen Vorgeschmack holen oder die Win32-API zur Lsung spezifischer Probleme in Anspruch nehmen will, der kann dies von Visual Basic aus tun und muss nicht gleich die Programmiersprache wechseln.

Prozeduren selbst definieren

W in32- API
Fr die Windows-API liegt mit der zum Lieferumfang von Visual Basic gehrenden Datei Win32api.txt eine Deklarationsdatei vor, die alle fr die Programmierung mit der Win32-API erforderlichen Konstantendefinitionen, Funktionsdeklarationen und Typvereinbarungen bereitstellt. ffnet man diese Datei im API-Viewer, nachdem dieser ber den Add-In-Manager des Mens ADD-INS der Visual-Basic-Entwicklungsumgebung geladen wurde, wird die Handhabung von API-Funktionen aus Visual Basic heraus zu einer rein formalen Angelegenheit: Man sucht sich die bentigten Definitionen heraus, stellt eine Auswahl zusammen und kopiert diese ber die Zwischenablage in den Bereich ALLGEMEIN des betroffenen Moduls. (Beachten Sie, dass fr bestimmte API-Funktionen auch Typvereinbarungen erforderlich sein knnen, um den einen oder anderen Parameter mit einem Wert zu versorgen.)

Der API- Viewer liefert die Deklarationen fr drei API- Funktionen und eine Typvereinbarung

1 87

Prozeduren selbst definieren

Prozeduren selbst definieren

Worauf Sie beim Aufruf einer so deklarierten Routine wirklich peinlich achten sollten: Setzen Sie nicht auf implizite Typumwandlungen, sondern bedienen Sie jeden Parameter mit dem richtigen Datentyp. In besonderen Fllen, wenn eine API-Routine unterschiedliche Datentypen fr denselben Parameter akzeptiert und Ihr Programm die Routine mit mehr als einem Parametertyp aufruft, bleibt der Datentyp Any als einziger Ausweg, der Typberprfung von Visual Basic zu entrinnen. Beachten Sie jedoch, dass Sie dann fr die Einhaltung des Datentyps selbst verantwortlich sind. Die Deklarationen einiger Routinen in Win32api.txt enthalten As Any-Vereinbarungen. Sollten Sie die entsprechenden Routinen nur mit einem bestimmten Parametertyp aufrufen, knnen Sie die Deklaration auf diesen Typ zuschneiden, um von der Typberprfung des Compilers zu profitieren. Vielfach ist es auch sinnvoll, eine Routine mit einem As Any-Parameter fr jeden der bentigten Parametertypen spezifisch zu deklarieren jeweils unter Verwendung eines anderen Bezeichners. Die folgende Tabelle gibt einen berblick darber, wie verschiedene von der Win32-API verwendete C/C++-Datentypen in Visual Basic deklariert sind und welche Art von Wert fr den Aufruf erforderlich ist. API-Datentyp ATOM BOOL, BOOLEAN BYTE CHAR COLORREF DWORD HWND, HDC, HMENU INT, UINT LONG LPARAM LPDWORD LPINT, LPUINT LPRECT LPSTR, LPCSTR LPVOID Visual-Basic-Deklaration ByVal Var As Integer ByVal Var As Long ByVal Var As Byte ByVal Var As Byte ByVal Var As Long ByVal Var As Long ByVal Var As Long Parameter verlangt ... Wert, Variable oder Ausdruck mit Datentyp Integer Wert, Variable oder Ausdruck mit Datentyp Long Wert, Variable oder Ausdruck mit Datentyp Byte Wert, Variable oder Ausdruck mit Datentyp Byte Wert, Variable oder Ausdruck mit Datentyp Long Wert, Variable oder Ausdruck mit Datentyp Long Wert, Variable oder Ausdruck mit Datentyp Long (von Windows vergebener Handle fr Fenster, Gertekontext, Men) Wert, Variable oder Ausdruck mit Datentyp Long Wert, Variable oder Ausdruck mit Datentyp Long Wert, Variable oder Ausdruck mit Datentyp Long Variable vom Datentyp Long Variable vom Datentyp Long Variable vom Datentyp bdtTyp (benutzerdefinierter Typ) Wert, Variable oder Ausdruck mit Datentyp String Variable des entsprechenden Typs (bei bergabe einer Variablen vom Typ String ist dem Wert das Schlsselwort ByVal voranzustellen) Variable mit Datentyp Integer Wert, Variable oder Ausdruck mit Datentyp Long

ByVal Var As Long ByVal Var As Long ByVal Var As Long [ByRef] Var As Long [ByRef] Var As Long [ByRef] Var As bdtTyp ByVal Var As String [ByRef] Var As Any

LPWORD LRESULT

[ByRef] Var As Integer ByVal Var As Long

Deklaration grundlegender Datentypen der W in32- API in Visual Basic

1 88

Routinen aus DLLs und der W indow s- API einsetzen

API-Datentyp NULL SHORT VOID WORD WPARAM

Visual-Basic-Deklaration As Any oder ByVal Var As Long ByVal Var As Integer ByVal Var As Integer ByVal Var As Long

Parameter verlangt ... ByVal Nothing oder ByVal 0& oder vbNullString Wert, Variable oder Ausdruck mit Datentyp Integer (Rckgabetyp einer Prozedur) Wert, Variable oder Ausdruck mit Datentyp Integer

Prozeduren selbst definieren

Wert, Variable oder Ausdruck mit Datentyp Long

Deklaration grundlegender Datentypen der W in32- API in Visual Basic

Zeichenfolgen und ihre Besonderheiten


Bei Durchsicht der in der obigen Tabelle aufgelisteten Datentypen wird Ihnen vielleicht aufgefallen sein, dass Zeichenfolgen berraschenderweise eine ByVal-Deklaration erfordern. Das ist kein Druckfehler, sondern eine gewisse Ungereimtheit, die Visual Basic im Umgang mit Zeichenfolgen anhaftet die berhmte Ausnahme von der Regel also. Whrend der ByVal-Zeichenfolgenparameter lpBuffer nach allen Regeln der Kunst in dem Szenario
... a = "ByVal!" TestByVal a Print a ' Ausgabe: "ByVal!" ... Sub TestByVal(ByVal lpBuffer As String) lpBuffer = "ByRef?" End Sub

nur als Eingabeparameter taugt, behandelt Visual Basic den gleichen Parameter als Ein-/Ausgabewert, wenn eine Declare-Vereinbarung vorliegt:
Private Declare Function GetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long ... Dim sUN As String, lLen As Long sUN = Space(20) ' String der Lnge 20 generieren lLen = Len(sUN) ' Stringlnge in Variable If GetUserName(sUN, lLen) Then ' Benutzername (hier: Rudi) Print lLen, Len(sUN), sUN ' Ausgabe: 20 5 "Rudi|" sUN = Left(sUN, lLen 1) ' Lnge anpassen, Nullbyte abschneiden ...

Dieser Code zeigt bereits recht eindrucksvoll, mit welchen Besonderheiten man bei der Verwendung von Routinen der Win32-API zu rechnen hat, wenn Zeichenfolgen mit im Spiel sind. Da Visual Basic fr Zeichenfolgen intern den fr die Automatisierung erforderlichen C/C++-Datentyp BSTR verwendet, treffen hier zwei recht unterschiedliche Reprsentationen aufeinander. Die auf das gewhnliche Zeichenfolgenformat der Sprache C/C++ eingestellte Routine GetUserName erwartet die Adresse eines Puffers, in den sie den Namen des Computers (im ANSI-Format) ohne Deskriptor und mit anhngendem Nullbyte schreiben kann. Die Lnge des bereitgestellten Puffers erfhrt sie ber den Parameter nSize er nimmt die Funktion des Lngendeskriptors ein. Ist der Puffer zu klein dimensioniert, um den Namen des Computers aufnehmen zu knnen,

1 89

Prozeduren selbst definieren

liefert die Funktion das Ergebnis 0 und gibt die bentigte Pufferlnge ber den Ein-/Ausgabeparameter nSize zurck. Bei ausreichender Pufferlnge bertrgt die Routine den Namen des Computers in den Puffer, setzt nSize auf die Lnge der geschriebenen Zeichenfolge unter Bercksichtigung des angehngten Nullbytes und gibt den Funktionswert 1 zurck. Das von Visual Basic verwendete Zeichenfolgenformat BSTR setzt sich aus einem vier Bytes umfassenden Deskriptor, der die Lnge der Zeichenfolge beschreibt, und dem Puffer fr die Zeichenfolge (Unicode) zusammen. Ein Nullbyte wird weder gesetzt noch interpretiert. Damit drfte klar sein, warum als Vorbereitung fr den Aufruf der Routine die Zeile
sUserName = Space(20) ' String der Lnge 20 generieren

Prozeduren selbst definieren

erforderlich ist. Sie sorgt dafr, dass der Zeichenpuffer Platz fr 20 Zeichen bietet. Als zweite Voraussetzung fr den erfolgreichen Aufruf der Routine muss diese die Adresse des Zeichenfolgenpuffers erfahren. Da der Zeichenfolgenpuffer in Visual Basic keine eigenstndige Gre darstellt, mussten die Entwickler hier tricksen: Sie haben den Compiler so ausgelegt, dass er den ByVal-Parameter des Typs String in der Parameterliste einer via Declare importierten Routine nicht als Kopie bergibt, sondern statt dessen die Adresse eines Zeichenfolgenpuffers mit einer in ANSI gewandelten Kopie der Zeichenfolge bereitstellt (API-Routinen mit angehngtem A im Bezeichner arbeiten mit ANSI-Code, solche mit angehngtem W mit Unicode). So weit, so gut. Die Routine kann so zwar in den Puffer der bergebenen Zeichenfolge schreiben, eine Lngenanpassung ist ihr aber nicht mglich, weil das von ihr angehngte Nullbyte aufseiten von Visual Basic nicht interpretiert wird. Visual Basic wandelt somit die gesamte Zeichenfolge in ihrer ursprnglichen Lnge sofort nach dem Aufruf wieder in Unicode um. Mithin ist die Lnge der Zeichenfolge nach dem Aufruf der API-Routine unverndert und muss explizit angepasst werden:
a = Left(a, lLen 1) ' Lnge anpassen und Nullbyte abschneiden

DLL- Routinen im Allgemeinen


Zu echten Hrden wachsen sich die in der Beschreibung geschilderten Problemfelder eigentlich nur im Zusammenhang mit DLLs aus, die der Hersteller nicht eigens mittels einer Deklarationsdatei fr die Benutzung mit dem Add-In API-VIEWER der Entwicklungsumgebung auf die Zusammenarbeit mit Visual Basic vorbereitet hat. Einem gebten und in mehreren Sprachen versierten Programmierer wird es bei Kenntnis einer Bibliothek zwar nicht sehr schwer fallen, sich die entsprechenden Informationen selbst zusammenzustellen, der Arbeitsaufwand ist aber nicht zu unterschtzen. Whrend Visual Basic fr die zum Kern von Windows zhlenden Bibliotheken User32, Kernel32 und GDI32 weder eine Dateierweiterung noch einen Pfad erwartet, muss der LibAbschnitt in der Declare-Anweisung bei anderen DLLs zumindest eine Dateierweiterung enthalten und in besonderen Fllen auch einen Pfad. Beim dynamischen Binden von DLLs durchsucht Windows der Reihe nach: das Verzeichnis der Exe-Datei, die die Dienste der DLL anfordert, das standardmige Arbeitsverzeichnis, das Systemverzeichnis von Windows (meist: C:\Windows\System\) das Windows-Verzeichnis (meist: C:\Windows) und schlielich die in der DOSUmgebungsvariablen PATH spezifizierten Verzeichnisse. Sollte die DLL in keinem der genannten Verzeichnisse zu finden sein, ist der Zugriffspfad explizit zu nennen. Eine gute Orientierungshilfe fr eigene Deklarationen bietet die zum Lieferumfang von Visual Basic gehrende Deklarationsbibliothek Win32api.txt. Laden Sie die Datei am besten in einen Texteditor und vergleichen Sie die darin zu findenden Visual-Basic-Deklarationen mit den originalen C/C++-Deklarationen der Win32-API. Die folgende Tabelle zeigt, wie die Deklaration grundlegender C/C++-Datentypen in Visual Basic aussieht und welcher Wert dann jeweils erwartet wird.

1 90

Routinen aus DLLs und der W indow s- API einsetzen

C/C++-Datentyp bdt* char char*, char[] double

Visual-Basic-Deklaration [ByRef] Var As bdt ByVal Var As Byte [ByRef] Var As Byte ByVal Var As Double

Parameter verlangt ... Variable mit benutzerdefiniertem Datentyp bdt Wert, Variable oder Ausdruck mit Datentyp Byte Variable vom Datentyp Byte oder erstes Element von Byte-Array Wert, Variable oder Ausdruck mit Datentyp Double Variable mit Datentyp Double oder erstes Element von Double-Array Wert, Variable oder Ausdruck mit Datentyp Single Variable mit Datentyp Single oder erstes Element von Single-Array Wert, Variable oder Ausdruck mit benutzerdefiniertem 64-Bit-Datentyp Variable mit benutzerdefiniertem 64-BitDatentyp Variable mit Datentyp Long oder erstes Element von Long-Array Variable mit Datentyp Long oder erstes Element von Long-Array Wert, Variable oder Ausdruck mit Datentyp Long Wert, Variable oder Ausdruck mit Datentyp Integer Variable mit Datentyp Integer oder erstes Element von Integer-Array Variable mit Datentyp Long (wird als Adresse interpretiert) Wert, Variable oder Ausdruck mit Datentyp Integer Variable mit Datentyp Integer Wert, Variable oder Ausdruck mit Datentyp String bzw. Variable vom Datentyp Integer oder erstes Element von IntegerArray

Prozeduren selbst definieren

double*, double[] [ByRef] Var As Double float float*, float[] hyper hyper* int*, int[] long*, long[] int, long short short*, short[] void* wchar_t wchar_t* wchar_t* wchar_t[] ByVal Var As String, [ByRef] Var As Integer ByVal Var As Single [ByRef] Var As Single ByVal Var As bdt64 [ByRef] Var As bdt64 [ByRef] Var As Long [ByRef] Var As Long ByVal Var As Long ByVal Var As Integer [ByRef] Var As Integer [ByRef] Var As Any ByVal Var As Integer

Deklaration elementarer C/ C+ + - Datentypen in Visual Basic

Diese Aufstellung drfte gut 95 Prozent der Flle abdecken, die einem bei der Parameterdeklaration begegnen von schlichten Umbenennungen dieser Datentypen einmal abgesehen. Fehlt die Angabe ByVal oder ByRef fr einen Parameter, behandelt ihn Visual Basic als ByRef-Parame-

1 91

Prozeduren selbst definieren

Prozeduren selbst definieren

ter. In einzelnen Fllen (insbesondere im Zusammenhang mit As Any-Vereinbarungen) kann es auch ntig sein, einen ByRef-Parameter mit einem Wert oder einen ByVal-Parameter mit einer Adresse zu bedienen. In diesem Fall besteht im Zusammenhang mit Declare-Funktionen/-Prozeduren die Mglichkeit, einzelne Parameterwerte durch Voranstellen von ByVal oder ByRef explizit als Wert oder als Adresse zu bergeben. Lassen Sie aber Vorsicht walten, die bergabe eines Werts anstelle einer Adresse fhrt im Allgemeinen sicher zum Absturz der Visual-Basic-Anwendung. Verschiedentlich erwartet eine DLL-Routine auch einen Funktionszeiger als Parameter, wenn sie fr einen bestimmten Zweck eine anwendungseitige Funktion (Rckruffunktion) aufrufen muss etwa, wie im Falle der API-Routinen waveOutOpen und waveInOpen der Multimediaerweiterung Winmm.dll von Windows 9x, wo die Rckrufroutine fr die Pflege des Ein- bzw. Ausgabepuffers verantwortlich ist. Speziell fr solche Flle untersttzt Visual Basic den AddressOfOperator. Fr das Generieren von Funktionszeigern mit AddressOf sind allerdings eine Reihe von Einschrnkungen zu beachten: Der gesamte Code, der mit dem Aufruf der API-Routine zusammenhngt (Deklaration und Aufruf der API-Routine) muss in einem Standardmodul enthalten sein AddressOf-Aufrufe in Klassen- oder Formularmodulen sind nicht erlaubt. Die Routine, deren Adresse AddressOf preisgibt, muss eine benutzerdefinierte Funktion oder Prozedur sein via Declare importierte externe Routinen, sind nicht zulssig (als Work-around schreibt man eigene Routinen, die die Importroutinen umhllen).
Warnung

................................................... Wa rnung

Die ByVal-Deklaration von String-Parametern hat im Zusammenspiel mit Declare-Routinen eine andere Bedeutung als in den Parameterlisten gewhnlicher Sub- und Function-Definitionen sie dient der ByRef-bergabe des Zeichenfolgenpuffers eines String-Werts. Zudem ist eine Vor- und Nachbehandlung der Werte von Zeichenfolgenparametern ntig.
Tipps

................................................... Tipp

Falls Sie nicht ber die Datei Win32api.txt verfgen, finden Sie diese in der Version vom 3.8.1995 unter http://www.microsoft.com/OfficeDev/Articles/Exe/Win32api.exe. Wenn Ihnen die Geschichte mit den Zeichenfolgen im obigen Beispiel nicht ganz geheuer vorkommt oder Sie mit unbekannten Datentypen konfrontiert werden, knnen Sie auch mit ByteArrays arbeiten. Beachten Sie aber, dass Visual Basic dann keine automatische Umwandlung von und nach Unicode vornimmt. Der Code fr das im Abschnitt Zeichenfolgen und ihre Besonderheiten (S. 189 ) genannte Beispiel sieht dann etwa so aus:
Private Declare Function GetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (lpBuffer As Byte, nSize As Long) As Long ... Dim sUN (20) As Byte, i As Long lLen = 20 If GetUserName(sUN, lLen) Then ' Benutzername (hier: Rudi) For i = 0 to lLen 2 ' 0-Basiert, Nullbyte abschneiden Print Chr(a(i)) ' Ausgabe: "Rudi" (Kein Unicode!) Next i ...
Beispiele

................................................... Beis piele

Das folgende Beispiel zeigt eine alternative Implementation der Dir-Funktion mit Hilfe der entsprechenden Win32-API-Routinen:

1 92

Routinen aus DLLs und der W indow s- API einsetzen

Option Explicit Private Declare Function FindFirstFile Lib "kernel32" Alias _ "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData _ As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile Lib "kernel32" Alias _ "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData _ As WIN32_FIND_DATA) As Long Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile _ As Long) As Long Private Const MAX_PATH = 260 Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Private Sub TestDir() Dim a As String a = Dir("*.frm") While a <> "" a = Dir Print a Wend End Sub ' Testen der alternativen Dir-Funktion

Prozeduren selbst definieren

Private Function Dir(Optional sSuchm As String = "", Optional AttrVkt _ As VbFileAttribute = vbNormal) As String Static w32FD As WIN32_FIND_DATA Static lHandle As Long w32FD.dwFileAttributes = AttrVkt If sSuchm <> "" Then ' Erster Aufruf von Dir lHandle = FindFirstFile(sSuchm, w32FD) If lHandle Then Dir = Left(w32FD.cFileName, InStr(w32FD.cFileName, Chr(0)) 1) End If Else ' weiterer Aufruf von Dir If FindNextFile(lHandle, w32FD) Then Dir = Left(w32FD.cFileName, InStr(w32FD.cFileName, Chr(0)) 1) Else ' keine weiteren Dateinamen mehr FindClose (lHandle) ' Handle freigeben

1 93

Prozeduren selbst definieren

End If End If AttrVkt = w32FD.dwFileAttributes End Function

Die hier vorgestellte Alternative zum Dir-Befehl von Visual Basic ist gleichfalls nicht rekursiv verwendbar, liefert aber immerhin den passenden Attributvektor. Eine fr den rekursiven Aufruf taugliche Variante von Dir ergibt sich, wenn lHandle nicht als statische Variable, sondern als Ein-/Ausgabeparameter vereinbart wird:

Prozeduren selbst definieren

Private Function Dir(lHandle As Long, Optional sSuchm As String = "", _ Optional AttrVkt As VbFileAttribute = vbNormal) As String

In diesem Fall muss sich der Aufrufer um den Such-Handle kmmern. Hier noch ein Beispiel fr den Einsatz einer von Visual Basic gestellten Funktion ZhleFenster als Rckruffunktion fr die API-Funktion EnumWindows. Die Rckruffunktion wird beim Aufruf von EnumWindows installiert und dann (solange sie den Wert 1 liefert) fr jedes Fenster einmal aufgerufen.
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, _ ByVal lParam As Long) As Long Private lFenster As Long ' Rckruffunktion, zhlt Fenster in globaler Variable Function ZhleFenster (ByVal hwnd As Long, ByVal data As Long) As Long lFenster = lFenster + 1 ZhleFenster = 1 ' True, damit die Aufzhlung weitergeht End Function ' Liefert Anzahl der bei Windows registrierten Fenster Function FensterAnz() As Long Dim Dummy As Long Dummy = EnumWindows(AddressOf ZhleFenster, 0) FensterAnz = lFenster End Function

Ein Beispiel fr den Einsatz der API-Funktion SendMessage im Zusammenhang mit einem Kombinationsfeld-Steuerelement finden Sie im Abschnitt Printer-Objekt, S. 284.
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Function, Sub
Verwandte Themen

Variablendeklaration (S. 162); Elementare Datentypen (S. 49); Benutzerdefinierte Datentypen (S. 60)

1 94

Objekte und Klassen


Wenn etwas aus der heutigen Programmierwelt nicht mehr wegzudenken ist, dann sind das Objekte. Whrend die klassische imperative Programmierung mit ihrem so genannten anwendungszentrierten Ansatz noch die strikte Trennung zwischen Daten und Code predigte und weitgehend monolithische Anwendungen hervorbrachte, die ber oft sehr komplexen Datenstrukturen operierten, hat sich die objektorientierte Programmierung geradezu die gegenteilige Ansicht zu eigen gemacht: Sie geht davon aus, dass die Reprsentation und die Manipulation von Daten eng zusammengehren und nichts weiter als unterschiedliche Aspekte des gleichen Dings sind nmlich des Objekts. Wo in der imperativen Programmierung eine Variable oder ein Wert eines bestimmten Datentyps vereinbart und initialisiert wird, wird in der objektorientierten Programmierung eine Objektvariable oder ein Objekt einer bestimmten Klasse vereinbart und instanziiert. Und wo die imperative Programmierung mit einer losen Sammlung von Funktionen und Prozeduren arbeitet, die nur implizit nmlich ber die Datentypen der Ein-/Ausgabeparameter und des Funktionswerts auf einen oder mehrere Datentypen zugeschnitten sind, sorgt der Klassenbegriff bei der objektorientierten Programmierung fr eine feste Zuordnung zwischen einer konkreten Datenstruktur (Eigenschaften des Objekts) und den zugehrigen Operationen (Methoden des Objekts). Die Operation eines Objekts hat einen Ich-Bezug; das hat eine gewhnliche Funktion oder Prozedur nicht. Als eine der Altvordern heutiger Programmiersprachen hatte die einstige Interpretersprache Basic nicht nur gewisse Mhe, mit der Tradition der klassischen imperativen Programmierung aufzuschlieen, auch der bergang zur objektorientierten Programmierung verlief nicht ganz schmerzlos, wenngleich sich das Ergebnis mit Blick auf Visual Basic 6.0 wahrlich sehen lassen kann. Whrend die Integration benutzerdefinierter Funktionen und Prozeduren noch vllig geradlinig und auch ohne bleibende Narben vor sich ging (man betrachte sich die Sprache etwa auf dem Stand von QuickBasic oder QBasic), bescherte die Einfhrung des Objektbegriffs der Sprache jedoch nachhaltig eine Spaltung, die gerade bei unerfahrenen Programmierern zuweilen fr eine gewisse Verwirrung sorgt. Angesichts dessen, was die Sprache dadurch aber an Ausdruckskraft und Vielseitigkeit gewonnen hat, ist diese Spaltung jedoch leicht in Kauf zu nehmen. Im Vergleich mit anderen Programmiersprachen war der unkomplizierte Umgang mit den Windows-Steuerelementen seit jeher eine der groen Strken der integrierten Entwicklungsumgebung von Visual Basic (und wohl auch das hinter dem Produkt steckende Erfolgsrezept), insbesondere die Mglichkeit, auf relativ einfache Art und Weise zu benutzerdefinierten Steuerelementen zu gelangen, die sich auch jenseits von Visual Basic erfolgreich einsetzen lieen. Bis hin zur Version 3.0 war es noch der VBX-Standard, ein reiner 16-Bit-Standard, der fr die Implementierung der Steuerelemente mageblich war. VBX lag zweifelsohne ein Objektmodell zugrunde, wenngleich dies damals noch nicht so explizit zum Ausdruck kam, da die umgebende Landschaft fehlte. Als Microsoft Visual Basic mit der Version 4.0 an die 32-Bit-Welt anpasste, erhielt die Sprache mit VBA (Visual Basic for Applications), damals auch Object Basic genannt, einen neuen und vollstndig objektorientierten Kern. VBA unterwarf Visual Basic der Herrschaft des COM (Component Object Model) und verheiratete die objektorientierte Seite der Sprache mit OLE 2.0. VBX blieb dabei als nicht COM-konformer Standard auf der Strecke. An seiner Stelle hielt der neue 32-Bit-Standard OCX (OLE Control) seinerseits eine Erweiterung von OLE 2.0 Einzug in die Welt der Steuerelemente. Der durch das COM geschaffene Objektbegriff ist unabhngig von einer spezifischen Programmiersprache oder -plattform. Er beinhaltet:

 '#

Klassen als Datentypen fr Objektvariablen

1. Einen Standardmechanismus fr die global (= weltweit) eindeutige Benennung eines COMObjekts mit einer GUID (Globally Unique Identifier), der systemweit (auf Basis der Systemregistrierung) das Auffinden und Laden des Objekts sowie das Auffinden der fr die Bearbeitung des Objekts zustndigen Anwendungen ermglicht 2. Einen Standardmechanismus (Referenzenzhlung), durch den ein Objekt selbststndig verfolgen kann, inwieweit es noch bentigt wird 3. Einen Standardmechanismus zur Fehlermeldung und einen Satz an Fehlercodes 4. Einen Standardmechanismus fr das Ansprechen von Eigenschaften und Methoden 5. Einen Standardmechanismus fr den Austausch von Objekten

Klassen als Datentypen fr Objektvariablen

DCOM (Distributed COM) dehnt die COM-Spezifikation auf Netzwerke aus. Bei OLE 2.0, das Microsoft seit einiger Zeit mit Zielrichtung Internet unter dem Namen ActiveX vermarktet, handelt es sich um eine Sammlung verschiedener COM-konformer Technologien, die das Miteinander von Objekten und Komponenten fr die Gestaltung verteilter Anwendungen ermglichen. Nicht nur Windows bietet inzwischen immer mehr Bestandteile seiner selbst als ActiveX-Komponenten feil, ein groer Teil der gngigen Anwendungen angefangen von den Schlachtschiffen Word, Excel und Access aus der Microsoft Office Suite ber den Internet Explorer bis hin zu kleinsten Hilfsanwendungen ist mit von der Partie. War die Objektorientierung fr Visual Basic vor der Version 4.0 mehr oder minder nur die Eintrittskarte in die ereignisreiche Welt der grafisch orientierten Benutzerschnittstelle von Windows, so erschliet sie der Sprache seit der Adaption des COM-Objektbegriffs im Zuge der Version 4.0 die gesamte Welt des ActiveX und der Automatisierung darunter: ActiveX-Steuerelemente, ActiveX-Komponenten, ActiveX-Container, ActiveX-Datenobjekte (ADOs), Automatisierungsobjekte, Automatisierungsserver.

Klassen als Datentypen fr Objektvariablen


{Dim | Public | Private | Static} [WithEvents] ObjVar As ObjTyp {Dim | Public | Private | Static} ObjVar As New ObjTyp Set ObjVar = [New] {Klasse | Nothing} Set ObjVar = ObjAusdr
Beschreibung

................................................... Bes c hreibung

Seit Visual Basic Module fr die Definition eigener Objektdatentypen oder Klassen erlaubt, haben sich die Mglichkeiten fr die Definition und Ausgestaltung benutzerdefinierter Datentypen drastisch erweitert. Die Vereinbarung einer Variablen ObjVar fr einen gegebenen Objektdatentyp Klasse geschieht im Rahmen einer Dim-, Private-, Public- oder Static-Anweisung, mit den blichen Auswirkungen fr den Geltungsbereich. Falls Klasse auf die Signalisierung von Ereignissen eingerichtet ist und die Variablendeklaration auf Modulebene erfolgt, kann die Vereinbarung zustzlich das Schlsselwort WithEvents enthalten. Dies erffnet die Mglichkeit, in dem Modul Ereignisroutinen bereitzustellen, die auf Ereignisse des der Variablen zugeordneten Objekts reagieren. Ohne WithEvents besteht die Mglichkeit, das Schlsselwort New anzugeben, was den Compiler zu einer impliziten Instanziierung der Objektvariablen bei ihrem ersten Einsatz veranlasst. Fehlt das Schlsselwort New bei der Variablendeklaration, initialisiert Visual Basic die vereinbarte Objektvariable standardmig mit dem Wert Nothing. In diesem Fall ist eine explizite SetZuweisung (mit der Variablen als Linkswert) erforderlich, um ihr ein konkretes Objekt zuzuordnen. Je nach Beschaffenheit des Rechtswerts in der Anweisung erhlt die Objektvariable dabei als Wert entweder einen (weiteren) Verweis auf ein bereits bestehendes Objekt oder einen Verweis auf eine neue Instanz des Objekts. Ersteres geschieht, wenn der Rechtswert ObjAusdr in

1 96

Klassen als Datentypen fr Objektvariablen

der Zuweisung durch eine andere Objektvariable oder als Funktionsergebnis bereitgestellt wird. Zur Instanziierung eines neuen Objekts des Objektdatentyps Klasse kommt es dagegen, wenn der Rechtswert durch das Schlsselwort New gefolgt von dem Objektdatentyp gebildet wird (oder, wie gesagt, eine New-Deklaration erfolgt ist). Mit Blick auf die objektorientierte Programmierung untersttzt Visual Basic den vordefinierten Datentyp Object. Es handelt sich dabei um einen generischen (lies: universellen) Objektdatentyp, der es einer Objektvariablen ermglicht, auf Objekte einer beliebigen Klasse zu referieren und somit einen beliebigen Objektdatentyp anzunehmen. (Da Object auch als Untertyp von Variant definiert ist, gilt das hier Gesagte auch fr Variant). Einer Object-Variablen kann also mit einer Set-Zuweisung jedes beliebige Objekt zugeordnet werden um den Preis einer spten Bindung zur Laufzeit. Das Konzept des Polymorphismus ermglicht darber hinaus die Vereinbarung von Objektvariablen bergeordneter Schnittstellenklassen (beispielsweise Form oder UserControl) und deren Verwendung fr Objekte spezifischer Klassen, die Implementationen fr die jeweiligen Schnittstellen bereitstellen. Ein und dieselbe Objektvariable kann dann fr Objekte unterschiedlichen Typs verwendet werden, solange diese die gleiche Schnittstelle implementieren.
Anwendung

Klassen als Datentypen fr Objektvariablen

................................................... Anwendung

Obwohl Klassen mehr oder weniger direkte Nachfahren der benutzerdefinierten Type-Datentypen sind, existieren doch eine Reihe signifikanter Unterschiede. Die folgende Tabelle gibt einen berblick. Variable mit Type-Datentyp Benutzerdefinierter Datentyp enthlt nur Datenelemente (Element kann aber Objektvariable sein). Visual Basic initialisiert den Wert der Variablen automatisch unter Beachtung der Vorgabewerte fr die Datentypen der Elemente. Objektvariable Objekt kann neben Eigenschaften (Datenelemente) auch Methoden (Funktionen/Prozeduren mit IchBezug) haben sowie auf Ereignisse reagieren und Ereignisse auslsen. Eine frisch deklarierte Objektvariable hat den Wert Nothing, verweist also auf kein Objekt. Wertzuweisungen an eine Objektvariable erfordern das Schlsselwort Set (anstelle von Let). Wenn dabei ein neues Objekt generiert werden soll, ist entweder bei der Deklaration oder bei der Zuweisung das Schlsselwort New erforderlich. (Bei WithEvents-Deklaration darf New nur in einer Set-Anweisung stehen!)

Der Wert einer Objektvariablen ist ein Verweis auf ein Die Variable reprsentiert einen Objekt. Es knnen mehrere unterschiedliche Objektvakonkreten Wert des benutzerdefinierten Datentyps. (ByRef-Parameter riablen auf ein und dasselbe Objekt verweisen. in Funktions-/Prozeduraufrufen behandelt Visual Basic wie temporre Umbenennungen ein- und derselben Variablen). Der Wert einer benutzerdefinierten Variablen existiert so lange wie die Variable. Ein Objekt existiert so lange, wie eine Objektvariable darauf verweist. Visual Basic baut ein Objekt ab, wenn der Geltungsbereich der letzten darauf verweisenden Variablen erlischt, diese den Wert Nothing erhlt oder einen neuen Wert zugewiesen bekommt.

Vergleich zwischen Type-Datentypen und Objektdatentypen

1 97

Klassen als Datentypen fr Objektvariablen

Variable mit Type-Datentyp

Objektvariable

Zuweisungsoperator kann Kopie des Fr Objektvariablen sind nur Set-Zuweisungen defiWerts erzeugen. niert, die mit Referenzen auf ein gegebenes Objekt hantieren. Jede Set-Zuweisung erzeugt eine neue Referenz auf ein gegebenes Objekt. Die Kopie eines Objekts kann nur das Objekt selbst anfertigen. Das Objekt muss dazu eine geeignete Methode bereitstellen.

Klassen als Datentypen fr Objektvariablen

Da Visual Basic keine Vergleichsoperatoren fr benutzerdefinierte Typen kennt (das wre auch nicht sehr sinnvoll), muss beispielsweise die Gleichheit komponentenweise (Datenfeld fr Datenfeld) geprft werden. Eine Private-Definition eines benutzerdefinierter Datentyps kann in jedem Modul (im Bereich ALLGEMEIN) geschehen, eine Public-Definition nur in einem Standardmodul. Der Zugriff auf Datenelemente erfolgt durch Notation des Punktoperators oder durch With-Qualifizierung. Alle Datenelemente haben den gleichen Geltungsbereich.

Fr den Vergleich von Objektreferenzen ist der Is-Operator definiert. Er liefert den Wert True, wenn zwei Objektvariablen auf ein und dasselbe Objekt verweisen, ansonsten False.

Der Objektdatentyp ist in einem eigenen Klassenmodul definiert und somit im gesamten Projekt sichtbar. Darber hinaus kann er verffentlicht (registriert) werden was ihn fr alle Projekte auf dem jeweiligen System sichtbar macht. Der Zugriff auf Eigenschaften und Methoden erfolgt durch Notation des Punktoperators oder durch WithQualifizierung. Der Besitzer eines Objekts (lies: der Besitzer einer Objektvariablen mit einer gltigen Referenz auf das Objekt) kann nur die als Public oder innerhalb ein und desselben Projekts Friend deklarieren Eigenschaften und Methoden ansprechen. Als Private deklarierte Eigenschaften oder Methoden sind nur im Codemodul des Objektdatentyps bekannt. Innerhalb des Codemoduls eines Objektdatentyps ist keine Qualifizierung beim Zugriff auf Eigenschaften und Methoden erforderlich. Die Qualifizierung kann jedoch optional durch Voranstellen des Bezeichners Me erfolgen (vgl. folgende Abbildung). Fr den Objektdatentyp kann eine Standardeigenschaft definiert sein. Der Zugriff darauf erfordert nur die Objektvariable ohne weitere Qualifizierung.

Es gibt kein Standarddatenelement.

Da fr Variant der Untertyp Object definiert ist, lassen Der Wert lsst sich einer Variantsich einer Variant-Variablen die Werte beliebiger Variablen nicht zuweisen. ZuweiObjektvariablen mittels Set zuweisen. sungen (nicht jedoch die LSetZuweisung) setzen fr Rechts- und Linkswert exakt den gleichen Datentyp voraus.
Vergleich zwischen Type-Datentypen und Objektdatentypen

1 98

Klassen als Datentypen fr Objektvariablen

Wann immer Sie mit einer Gre arbeiten wollen, die nur als Objektdatentyp zur Verfgung steht und das sind so gut wie alle in Visual Basic definierten Datentypen jenseits der elementaren und benutzerdefinierten Datentypen sowie der Arrays , mssen Sie eine Objektvariable vereinbaren. Die Visual-Basic-Entwicklungsumgebung bietet Ihnen bei der Programmierung mit Objekten in recht eindrucksvoller Weise Untersttzung an, indem sie (hnlich wie bei den Funktionsparametern) die zu der Klasse einer Objektvariablen gehrigen Eigenschaften und Methoden parat hlt und Ihnen beim Tippen als Auswahlliste einblendet (vgl. die folgende Abbildung). Auf diese Weise haben Sie jederzeit einen guten berblick ber die Strukturelemente eines Objekts.

Klassen als Datentypen fr Objektvariablen

Die Entwicklungsumgebung bietet die Eigenschaften und Methoden eines Objekts whrend des Schreibens an
Fr die Definition eigener Objektdatentypen mssen Sie Klassenmodule in Ihr Projekt einfgen (mehr dazu im Abschnitt Selbst definierte Klassen, S. 318).
Tipp

................................................... Tipp

Der ber den Befehl OBJEKTKATALOG im Men ANSICHT oder die Taste (F2) aufgerufene Objektkatalog gibt einen berblick ber smtliche unter Visual Basic verfgbaren Objektdatentypen und deren Eigenschaften, Methoden und Ereignisse (siehe folgende Abbildung).
Beispiel

................................................... Beis piel

Der folgende Codeauszug aus dem Beispielprojekt FormMitEreignis zeigt die WithEvents-Vereinbarung einer privaten Objektvariablen sowie deren Set-Initialisierung im Rahmen einer Property-Routine mit dem Wert einer ffentlichen Eigenschaft, die den Objektdatentyp BasisForm trgt (das vollstndige Beispiel ist im Abschnitt Ereignisroutinen, S. 204, abgedruckt).
' Klasse: clsFormMitEreignis Private WithEvents mBasisForm As BasisForm ' Formular ist Eigenschaft Public Property Set BasisForm(ByVal newBasisForm As BasisForm) Set mBasisForm = newBasisForm ' Wert der Eigenschaft setzen End Property ' (Formularobjekt zuordnen)
Methoden

................................................... Metho den


[Public | Private | Friend][Static] Function Name [(ParmListe)][ As Typ] [Public | Private | Friend][Static] Sub Name [(ParmListe)]

1 99

Klassen als Datentypen fr Objektvariablen

Klassen als Datentypen fr Objektvariablen

Der Objektkatalog hebt die Objektdatentypen des aktuellen Projekts sow ie deren implementierte Eigensc haften, Ereignisse und M ethoden durc h Fettsc hrift hervor (vgl. Beispiel zu

Ereignisroutinen,

S. 204)

Beschreibung

................................................... Bes c hreibung

In der objektorientierten Programmierung versteht man unter Methode nichts anderes als eine zu einem spezifischen Objektdatentyp gehrige Funktion oder Prozedur, die ber der konkreten Datenstruktur eines Objekts dieses Datentyps operieren kann. Dieser Ich-Bezug auf ein spezifisches Objekt ist zugleich das aufflligste Merkmal der Methode. Eine Methode sieht alle Eigenschaften, Datenfelder und Methoden ihres Objekts, gleich welchen Geltungsbereich diese haben. Als Geltungsbereich fr eine Methode kann Public, Private oder Friend vereinbart werden. Standardmig vereinbart Visual Basic den Geltungsbereich Public. Mit Private als Geltungsbereich kann eine Methode von anderen Methoden des gleichen Objekts aufgerufen werden, nicht jedoch vom Besitzer des Objekts (Modulebene). Umgekehrt macht der Geltungsbereich Public eine Methode fr alle sichtbar, die ber eine Referenz auf das Objekt verfgen (Systemebene) insbesondere auch fr den Besitzer. Darber hinaus ist in Formular- und Klassenmodulen auch eine eingeschrnkte ffentliche Deklaration mit dem Schlsselwort Friend mglich, die den Geltungsbereich auf die Formular- und Klassenmodule des aktuellen Projekts verengt (Prozessebene). Ist bei der Deklaration einer Methode der Zusatz Static angegeben, vereinbart Visual Basic implizit alle Variablen der Methode als Static (statische Variablen vergessen ihren Wert von einem Aufruf zum nchsten nicht). Neben den gewhnlichen Methoden sieht das Objektmodell von Visual Basic zwei Arten von Methoden vor, denen eine besondere Funktionalitt zukommt: Ereignisroutinen und PropertyMethoden. Ereignisroutinen sind fr die Nachrichtenbehandlung zustndig und PropertyMethoden fr das Setzen (Set und Let) und Abfragen (Get) der Eigenschaften eines Objekts. (Mehr dazu in den folgenden beiden Abschnitten.) Ist eine Methode als Standardelement (Standardeigenschaft) eines Objektdatentyps definiert (vgl. Dialogfeld PROZEDURATTRIBUTE), kann ihr Aufruf durch alleinige Notation des Objektbezeichners unter Weglassung des Methodenbezeichners geschehen.

200

Klassen als Datentypen fr Objektvariablen

Anwendung

................................................... Anwendung

Da sich Visual Basic sptestens seit der Version 4 nicht mehr als Sprache mit Objektorientierung, sondern als objektorientierte Sprache versteht, muss man sich natrlich die Frage stellen, inwieweit nicht alle Funktionen und Prozeduren Methoden eines Objekts sind. In der Tat ist eine derartige Betrachtung ebenso richtig wie sinnlos, da auch Datentypen wie Integer und Long eine objektorientierte Sicht rechtfertigen, die konkrete Implementation jedoch anders aussieht. Auch weist der Objektkatalog so manche Funktion/Prozedur als Methode des einen oder anderen Moduls aus, das aber selbst nicht als Klasse in Erscheinung tritt. Die Grenze zwischen Methode und Funktion/Prozedur ist am einfachsten pragmatisch zu ziehen: Betrachten Sie als Methode, was sich wie eine Methode notieren lsst, und alles andere als Funktion/Prozedur. Diese Sicht ist zwar nicht immer richtig, wie ein Blick auf die Methode Print etwa des Form-Objekts offenbart (sie ist im Objektkatalog nicht zu finden), so doch aber in aller Regel. Insbesondere verbleiben so alle traditionell zu Basic gehrenden Routinen sowie alles zu den elementaren Datentypen Gehrige im Bereich der Funktionen/Prozeduren. Der Objektbezug einer Methode muss in jeder Situation gewahrt sein; im eigenen Klassenmodul ist er implizit, ansonsten explizit. Der Aufruf einer Methode innerhalb ihres Klassenmoduls unterscheidet sich syntaktisch nicht vom Aufruf einer Funktion/Prozedur, da keine Qualifizierung durch einen Objektbezeichner gefordert ist. Optional kann aber eine Qualifizierung erfolgen, indem die den Ich-Bezug ausdrckende spezielle Objektvariable Me angegeben wird bzw. eine Objektvariable, die auf das gleiche Objekt wie Me verweist (vgl. das Beispiel zu PrinterObjekt, S. 284).
[Erg =] [Me.]Methode[(ParamListe)]

Klassen als Datentypen fr Objektvariablen

Von jedem anderen Modul aus kann der Aufruf der Methode dagegen nur unter Angabe eines Objekts bzw. einer Objektvariablen erfolgen, vorausgesetzt, die Methode ist mit dem Geltungsbereich Public (bzw. Friend innerhalb des gleichen Projekts) deklariert worden:
[Erg =] MeinObjekt.MethodeVonMeinObjekt[(ParamListe)]

Ansonsten gilt fr Methoden dasselbe wie fr Funktionen/Prozeduren.


Tipp

................................................... Tipp

Wenn es Sie strt, dass Visual Basic bei Deklarationen implizit den Geltungsbereich Public annimmt, knnen Sie eine Option Private-Anweisung in das betreffende Modul setzen.
Beispiel

................................................... Beis piel ................................................... Verwandte Them en

Vgl. Eigenschaften (S. 201)


Verwandte Themen

Funktionen und Prozeduren (S. 175)


Eigenschaften

................................................... Eigens c ha ften


[Public | Private | Friend][Static] Property Get Eigenschaft () As Typ [Public | Private | Friend][Static] Property Let Eigenschaft _ (NeuerWert As Typ) [Public | Private | Friend][Static] Property Set Eigenschaft _ (NeuerWert As ObjektTyp)

201

Klassen als Datentypen fr Objektvariablen

Beschreibung

................................................... Bes c hreibung

Klassen als Datentypen fr Objektvariablen

Bei den Eigenschaften wird es am deutlichsten: Es gibt die Innensicht und die Auensicht eines Objekts. Letztere ist Teil der ersteren und offenbart die Eigenschaften des Objekts. Die Innensicht gibt den Blick frei auf die tatschliche Reprsentation der von einem Objekt gespeicherten Daten, also auf die Datenstrukturen und Datenfelder, die das Objekt ausmachen und ber denen seine Methoden operieren. Als Objektdatenfelder fungieren gewhnliche, auf (Klassen-) Modulebene deklarierte Variablen, denen ihrerseits ein Datentyp bzw. ein Objektdatentyp zugrunde liegt. Der Zugriff auf diese Datenstrukturen von innerhalb des Moduls unterscheidet sich nicht vom Zugriff auf gewhnliche Variablen und ist allen im gleichen Modul definierten Methoden ohne Einschrnkungen gestattet. Die Innensicht deckt sich also weitgehend mit der Sicht der traditionellen Programmierung. Von grerem Interesse ist die Auensicht auf ein Objekt. Visual Basic beugt sich hier inzwischen weitgehend den Regeln des COM: Property-Methoden fungieren als Schleusen fr die Abfrage und das Setzen der Werte von Eigenschaften. Was der Besitzer eines Objekts als Wert einer Eigenschaft tatschlich zu sehen bekommt, ist der Funktionswert einer Property GetFunktion, deren Bezeichner den Namen der Eigenschaft und deren Ergebnistyp den Datentyp der Eigenschaft stellt. Der Funktionswert kann zwar mit dem Wert eines Datenfelds des Objekts bereinstimmen, muss aber nicht. Mit anderen Worten, es kann genauso gut sein, dass der Wert einer Eigenschaft in Auenansicht kein Gegenstck innerhalb des Objekts in Form einer Variablen hat, sondern von der Property Get-Funktion errechnet wird. Das Gleiche, jedoch mit umgekehrten Vorzeichen, gilt fr das Setzen von Eigenschaften: Die Let- oder Set-Zuweisung eines Werts an eine Eigenschaft bersetzt der Compiler in den Aufruf einer Property Let- bzw. Property Set-Methode des Objekts, die den Namen der Eigenschaft trgt. Man sieht, es lassen sich auch unterschiedliche Geltungsbereiche fr das Lesen und Setzen einer Eigenschaft festlegen. Eigenschaften, fr die keine Property Get-Funktion definiert (oder sichtbar) ist, sind lesegeschtzt, und solche, fr die keine Property Let- bzw. Property SetMethoden existieren (oder sichtbar sind), sind schreibgeschtzt (vgl. auch: AmbientPropertiesObjekt). Da es den Methoden eines Objekts freigestellt ist, auch von den objekteigenen Property-Methoden Gebrauch zu machen, sind alle Eigenschaften eines Objekts auch in der Innensicht des Objekts bekannt.
Anwendung

................................................... Anwendung

Angesichts dieser Tatsache stellt sich natrlich die Frage, was eigentlich geschieht, wenn eine Variable auf Modulebene als Public vereinbart wird. In der Tat vereinbart der Compiler dann die entsprechenden Property-Methoden implizit, so dass Sie prinzipiell die Wahl haben, welche der Schreibweisen Sie bevorzugen. Aufgrund eines Fehlers in Visual Basic 6.0 vereinbart der Compiler die entsprechenden Property-Methoden allerdings nicht in jedem Fall, wie die entsprechende Diskussion im Abschnitt Parameterbergabe bei Funktionsaufrufen, S. 574, des Praxisteils zeigt.) Da die explizite Vereinbarung von Property-Methoden einen greren Spielraum bietet, in der Methode kann beispielsweise eine berprfung von Werten stattfinden, sollten Sie aber tendenziell diese Schreibweise benutzen. Welche Eigenschaften ein Objekt in welchem Geltungsbereich offenbart, liegt im Ermessen des Programmierers. Eine Richtlinie fr die Programmierung mit Objekten ist jedoch, dass es so wenige wie mglich sein sollten und dass der Geltungsbereich so eng wie mglich gewhlt werden sollte; das hlt die Implementation bersichtlich und beugt Unsinn vor, den andere Anwendungen mit dem Objekt treiben knnten. Da eine Private-Eigenschaft (mangels Vererbung) faktisch nichts anderes ist als eine auf Modulebene vereinbarte Private-Variable der Zugriff darauf ist ja nur mit objekteigenen Methoden mglich , stellt sich bei der Wahl des Geltungsbereichs (zur Zeit) eigentlich nur die Frage: Friend oder Public? Friend-Deklarationen sorgen

202

Klassen als Datentypen fr Objektvariablen

dafr, dass ein Bezeichner nur innerhalb des Projekts sichtbar ist, in dem die jeweilige Klasse kompiliert wird. Der Unterschied wirkt sich jedoch erst im Zusammenhang mit ActiveX-Steuerelementen und -Komponenten aus, die einer Verffentlichung unterzogen werden.
Tipp

................................................... Tipp

Angenommen, Sie schreiben ein Benutzersteuerelement und wollen eine Eigenschaft des zugrunde liegenden UserControl-Objekts bernehmen. Sie knnen dann den Bezeichner der Eigenschaft beibehalten, wenn Sie fr eine geeignete Qualifizierung sorgen. Das verhindert den rekursiven Aufruf der Methode.
Property Set Picture(NewPicture As Picture) UserControl.Picture = Picture ' Qualifizierung! End Property
Beispiel

Klassen als Datentypen fr Objektvariablen

................................................... Beis piel

Der folgende Code zeigt die Implementation einer einfachen in einem Klassenmodul definierten Klasse Vektor und den Umgang mit einigen Eigenschaften und Methoden von Objekten dieser Klasse.
' Irgendwo in einem Formular des Projekts ... Dim a As New Vektor Dim b As New Vektor a.x = 1: a.y = 1: a.z = 1 ' Initialisierung: Eigenschaften setzen b.Init 2, 2, 2 ' Initialisierung: Init-Methode a.Addiere b Print a.Printwert Print a.SkalarProdukt(b) Print a.Betrag ' Klassenmodul: Vektor.cls Option Explicit Public x As Double Public y As Double Public z As Double Property Set Copy(v As Vektor) x = v.x: y = v.y: z = v.z End Property

' Eigenschaften, weil Public!

' Kopieren eines Werts

Property Get Betrag() As Double ' Lnge des Vektors (wird errechnet!) Betrag = Sqr(x * x + y * y + z * z) End Property Function SkalarProdukt(v As Vektor) As Double SkalarProdukt = v.x * x + v.y * y + v.z * z End Function Sub x y z End Addiere(v As Vektor) = x + v.x = y + v.y = z + v.z Sub ' Vektorsumme ' Skalarprodukt

203

Klassen als Datentypen fr Objektvariablen

Sub x y z End

Skaliere(faktor As Double) = x * faktor = y * faktor = z * faktor Sub

' skalares Produkt

Klassen als Datentypen fr Objektvariablen

Function Produkt(v As Produkt.x = y * v.z Produkt.y = z * v.x Produkt.z = x * v.y End Function

Vektor) As Vektor ' Vektorprodukt z * v.y x * v.z y * v.x

Property Get Printwert() As String ' Vektor als Zeichenfolge Printwert = "(" + CStr(x) + "," + CStr(y) + "," + CStr(z) + ")" End Property Sub Init(a As Double, b As Double, c As Double) ' Initialisierung x = a: y = b: z = c End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Let, =
Verwandte Themen

Datentypen und ihre Operationen (S. 49); Selbst definierte Klassen (S. 318)

Ereignisroutinen
Sub SignalisierendesObjekt_Ereignis([ParamListe]) ... End Sub Event Ereignis[(ParamListe)] RaiseEvent Ereignis[(WerteListe)] [Private | Public | Dim] WithEvents Eigenschaft As Typ
Beschreibung

................................................... Bes c hreibung

Der Kernmechanismus der ereignisorientierten Benutzerschnittstelle von Windows besteht darin, dass ein Objekt Ereignisroutinen bereitstellt, um spezifisch auf uere Vorkommnisse reagieren zu knnen. Ein solches Vorkommnis, Ereignis genannt, kann beispielsweise ein Mausklick auf eine in einem Formular angeordnete Schaltflche, eine Wertnderung in einem Textfeld oder schlicht eine Nachricht eines anderen Objekts sein. Der ausgeklgelte Benachrichtigungsmechanismus von Windows sieht aufseiten des Programms eine Nachrichtenschleife vor, die grob gesagt eine geeignete Zustellung der Ereignisse an die einzelnen Objekte vornimmt und den Aufruf bereitgestellter Ereignisroutinen bedingt. (Die von Windows verschickten Nachrichten enthalten einen Ereigniscode sowie weitere Parameter mit ereignisspezifischer Bedeutung, die eine genauere Beschreibung des Ereignisses darstellen). Der Visual-Basic-Compiler sorgt dafr, dass die Implementierung dieses Mechanismus fr den Programmierer grtenteils transparent bleibt und sich nur in einigen wenigen Vorgaben bemerkbar macht, die bei der Programmierung mit Ereignissen formal zu beachten sind. Von einer wie auch immer gearteten

204

Ereignisroutinen

Verdrahtung zwischen Ereignisroutinen und Nachrichten bekommt der Visual-Basic-Programmierer berhaupt nichts zu sehen, auch entzieht sie sich seiner Kontrolle. Zu den vordefinierten Objekten von Visual Basic (dazu zhlen insbesondere die auf dem jeweiligen System verfgbaren Steuerelemente und ActiveX-Komponenten) gehrt eine breite Vielfalt von Ereignissen, fr die sich Ereignisroutinen implementieren lassen. Objekte knnen aber nicht nur auf Ereignisse reagieren, sie sind auch ihrerseits in der Lage, Ereignisse zu signalisieren. Damit ein Objekt ein Ereignis Ereignis mittels RaiseEvent auslsen kann, muss das zugehrige Objektmodul (Klassenmodul, Steuerelementmodul, Formularmodul oder Designermodul) eine Event-Deklaration enthalten, die das Gerst der Ereignisroutine als Prozedur mit dem Bezeichner Ereignis deklariert. Wird fr die Ereignisprozedur eine Parameterliste ParamListe vereinbart, muss bei Auslsung des Ereignisses wie bei einem Funktionsaufruf eine Werteliste fr die einzelnen Parameter bereitgestellt werden. Fr die Behandlung eines solchen von einem Objekt ausgelsten Ereignisses ist der Besitzer des Objekts zustndig, aber nicht verpflichtet. Er kann zu diesem Zweck eine Objektvariable fr das Objekt mit dem Zusatz WithEvents deklarieren und unter ihrem Namen kombiniert mit dem Ereignisnamen eine Ereignisroutine bereitstellen, deren Struktur auf das objektseitig vorgegebene Gerst passt.
Anwendung

Klassen als Datentypen fr Objektvariablen

................................................... Anwendung

Die Bereitstellung einer Ereignisroutine erfolgt auf Modulebene, und zwar im Klassenmodul des Objekts, das die Behandlung des Ereignisses durchfhren soll. (Auer dem Standardmodul sind alle in Visual Basic verfgbaren Modularten letztlich Klassenmodule und somit auf die Ereignisbehandlung eingerichtet.) Eine Ereignisroutine hat grundstzlich die Form einer ffentlichen oder privaten Sub-Prozedur, deren Bezeichner nach folgendem Schema zu bilden ist: Name des signalisierenden Objekts plus Unterstrich plus Name des Ereignisses, zum Beispiel Form_Load. Die folgende Abbildung zeigt die Auswahl einer Ereignisroutine fr die Implementierung in einem Formularmodul.

Auswahl einer Ereignisprozedur fr die Implementierung

Man sieht, die Entwicklungsumgebung von Visual Basic kommt einem bei der Implementierung von Ereignisroutinen weitgehend entgegen: Im linken Listenelement whlt man die Objektvariable und im rechten das Ereignis aus. An Objektvariablen stehen neben dem Bezeichner der jeweiligen Basisklasse des Objekts (Form, UserControl, PropertyPage usw.) die Bezeichner smtlicher im Entwurfsbereich platzierten Steuerelemente und ActiveX-Komponenten zur Verfgung sowie alle mit WithEvents auf Modulebene deklarierten Objektvariablen.

205

Klassen als Datentypen fr Objektvariablen

Klassen als Datentypen fr Objektvariablen

Fr den Mechanismus der Ereignisbehandlung macht es keinen Unterschied, wer die Benachrichtigung eines Ereignisses veranlasst hat das Betriebssystem, ein Steuerelement, eine Komponente oder irgendein anderes Objekt. Bei benutzerdefinierten (lies: in Klassenmodulen definierten) Objektdatentypen muss man nur darauf achten, die entsprechenden Objekte auf Modulebene unter Angabe von WithEvents zu deklarieren, damit der Besitzer deren Ereignisse auch zu sehen bekommt. Fr Benutzersteuerelemente, die sich in die Werkzeugsammlung einfgen lassen, erledigt das Visual Basic von sich aus, sobald ein Objekt dieses Typs auf die Entwurfsflche gezogen wird. Wie aber sieht die Bearbeitungsreihenfolge aus, wenn sich Ereignisse hufen? Das Laufzeitsystem entnimmt die Ereignisse einer Ereigniswarteschlange unter Beachtung verschiedener Priorisierungsregeln (so kommen Timer- und MouseMove-Ereignisse beispielsweise nur zur Behandlung, wenn keine anderen Ereignisse warten) und ruft die dafr vorgesehenen Ereignisroutinen nacheinander auf. Mit anderen Worten: solange die Bearbeitung eines Ereignisses andauert, kommt kein weiteres Ereignis zum Zuge.
Tipps

................................................... Tipps
Bei der Implementierung neuer Ereignisse empfiehlt es sich, das Ereignis zuerst im Modul des signalisierenden Objekts zu deklarieren (Event) und sich dann im Modul des Objekts, das auf das Ereignis reagieren soll, das Gerst der Ereignisroutine von Visual Basic einfgen zu lassen. Die Reaktivitt eines Programms hngt sehr stark davon ab, wie viel an Laufzeit eine Ereignisroutine fr die Behandlung des ihm zugeordneten Ereignisses bentigt. Guter Programmierstil ist es, nicht zu viel in eine Ereignisroutine hineinzupacken. Sollten aufwndigere Berechnungen anfallen, tut die Routine gut daran, zwischendurch immer mal wieder die Prozedur/Funktion DoEvents aufzurufen, damit die Behandlung inzwischen aufgelaufener Ereignisse erfolgen kann. Sobald die Warteschlange abgearbeitet ist, erhlt die Routine, die den DoEvents-Aufruf abgesetzt hat, die Kontrolle wieder zurck und kann ihre Aufgabe zu Ende bringen. So gut das klingt, problemfrei ist diese Programmiertechnik nicht. Sie wirft im Wesentlichen zwei Probleme auf: Reentranz und Rekursion. Mit Ersterem ist gemeint, dass eine derartige Routine erneut zum Aufruf kommen kann, noch bevor sie fertig ist, und mit Letzerem, dass die Routine ihrerseits Ereignisse anstoen kann, die wiederum zum Aufruf ihrer selbst fhren, noch bevor sie fertig ist. Liegen Rekursion und Reentranz vor, wird das frher oder spter zur Auslsung eines Stack-berlauffehlers fhren, wenn die Routine vergleichbar mit einer Endlosschleife in der Regel fter betreten als verlassen wird. Rekursion alleine ist kein Problem, wenn gewhrleistet ist, dass die Routine fertig ist, bevor das von ihr angestoene Ereignis wieder zu ihrem Aufruf fhrt mithin, wenn die Latenzzeit des Ereignisses grer ist als die Ausfhrungszeit. Reentranz fr sich genommen ist auch kein Problem, solange sie nicht zur Regel wird und zu einer immer tieferen Verschachtelung der Aufrufe fhrt. Allerdings muss die Routine speziell darauf ausgelegt sein, damit es nicht zu unerwnschten Seiteneffekten kommt, etwa im Zusammenhang mit statischen und globalen Variablen. Um der Kumulation reentranter Aufrufe vorzubeugen, empfiehlt es sich, einen Rekursionszhler (statische Zhlvariable) einzufhren und den DoEvents-Aufruf mit dem Zhlerstand zu koppeln. Einer Rekursion beugt das zwar nicht vor, einem Stackberlauf jedoch schon gleichwohl wird die Anwendung weiterhin auf den Benutzer reagieren, auch wenn es zu Beeintrchtigungen der Reaktivitt kommen kann.
Beispiel

................................................... Beis piel

Das Projekt FormMitEreignis stellt eine Wrapper-Klasse fr ein Formularobjekt des Typs BasisForm vor. Ein Objekt dieser Klasse, das eine Formularvariable als Eigenschaft besitzt, ergnzt die Funktionalitt des dieser Variablen zugeordneten Formulars um die Behandlung eines zustzliches Ereignisses namens FeldwertGendert. Das Formular BasisForm enthlt zwei Textfelder namens Text1 und Text2 sowie eine Statusleiste namens StatusLeiste1. Die Signali-

206

Standardereignisse

sierung des Ereignisses erfolgt, wenn sich der Wert eines der Textfelder ndert. Die fr die Behandlung des Ereignisses zustndige Methode des Wrapper-Objekts ist mBasisForm_FeldwertGendert.
' Klasse: clsFormMitEreignis Option Explicit Private WithEvents mBasisForm As BasisForm ' Formular ist Eigenschaft ' Eigenschaft verffentlichen Public Property Get BasisForm() As BasisForm Set BasisForm = mBasisForm ' Wert der Eigenschaft bekannt geben End Property Public Property Set BasisForm(ByVal newBasisForm As BasisForm) Set mBasisForm = newBasisForm ' Wert der Eigenschaft setzen End Property ' (Formularobjekt zuordnen) ' Von mBasisForm signalisiertes Ereignis behandeln Private Sub mBasisForm_FeldwertGendert() mBasisForm.StatusLeiste1.SimpleText = "Feldwert hat sich gendert" End Sub ' Formular: BasisForm Option Explicit Event FeldwertGendert() ' Signalisiertes Ereignis deklarieren Private obj As New clsFormMitEreignis ' Objektvariable vereinbaren Private Sub Command1_Click() End End Sub

Standardereignisse

' Schaltflche beendet Programm ' (Objekt wird automatisch abgebaut)

Private Sub Form_Load() StatusLeiste1.Style = sbrSimple ' Stilattribut der Statusleiste Set obj.BasisForm = Me ' Objekt generieren, als Wert der End Sub ' Eigenschaft sich selbst setzen Private Sub Text1_Change() RaiseEvent FeldwertGendert End Sub Private Sub Text2_Change() RaiseEvent FeldwertGendert End Sub

' Textfeld lst Ereignis aus

' Textfeld lst Ereignis aus

Standardereignisse
Ein Visual-Basic-Programm, das nicht nur aus Standardmodulen besteht, wird von Beginn an in eine ereignisreiche Welt hineingeboren. Als ereignisorientierte Systemumgebung hlt Windows die in Ausfhrung befindlichen Programme stndig ber alle sie betreffenden Vorkommnisse auf dem Laufenden dazu zhlen: Informationen ber den eigenen Ausfhrungszustand (Programmstart, Programmende, Herunterfahren des Systems etc.), ber genderte Systembe-

207

Standardereignisse

dingungen (Bildschirmmodus, Sprachtreiber etc.) und natrlich ber alle an sie gerichteten Benutzeraktionen. Darber hinaus melden sich Objekte auch gegenseitig die verschiedensten Vorkommnisse oder leiten Meldungen einfach weiter (Delegation). Wer von der prozeduralen Programmierung her kommt, fr den ist es erst einmal ungewohnt, sich in diesem Kanon von Ereignissen zurechtzufinden, weil der Programmablauf als Ganzes nicht mehr so ohne Weiteres ersichtlich ist. Vielmehr zerfllt das Programm in eine Flle von Ereignisroutinen, deren Koordination hinter den Kulissen vom Visual-Basic-Laufzeitsystem betrieben wird, ohne dass vordergrndig etwas zu sehen ist. Letztlich machen die Ereignisse die Programmierung aber auch wieder einfach, da man sich um die Ablaufsteuerung keine groen Gedanken machen muss.
Beschreibung

Standardereignisse

................................................... Bes c hreibung

Die folgende Tabelle gibt einen berblick ber die wichtigsten vordefinierten Ereignisse, die ein Objekt in Abhngigkeit von seinem Objektdatentyp zu Gesicht bekommen kann. Details zu den einzelnen Ereignissen finden Sie in den anschlieenden Unterabschnitten. Beachten Sie, dass die Liste nicht vollstndig ist, da jedes Steuerelement und jeder Objektdatentyp seine eigenen Ereignisse definieren kann. Schlagen Sie dazu unter dem jeweiligen Steuerelement bzw. Objektdatentyp nach. Ereignis Activate Click Beschreibung Signalisiert, dass das Fenster des Objekts zum aktiven Fenster wird Signalisiert die Ausfhrung eines Mausklicks im Fensterbereich des Objekts Signalisiert die Ausfhrung eines Doppelklicks im Fensterbereich des Objekts Signalisiert, dass das Fenster des Objekts nicht mehr aktives Fenster ist Signalisiert dem Objekt das Ende einer Drag&Drop-Operation: Ein anderes Objekt wurde in den Bereich des Objekts abgelegt. Tritt whrend einer Drag&DropOperation auf und signalisiert dem Objekt, dass ein anderes Objekt in seinen Bereich gezogen wird Betroffene Objekte Form, DataReport, MDI-Form Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage Form, DataReport, MDI-Form

DblClick

Deactivate

DragDrop

Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage

DragOver

GotFocus

Signalisiert dem Objekt, dass es den Die meisten Steuerelemente, Form, Eingabefokus erhalten hat MDI-Form, UserControl, UserDocument, Extender, PropertyPage DataReport, DHTMLPageDesigner, Signalisiert dem Objekt, dass es soeben generiert wurde und den ein- Form, MDIForm, PropertyPage, Usermaligen Initialisierungscode ausfh- control, UserDocument, WebClass ren kann (beim Formularobjekt kommt Initialize vor Load)

Initialize

208

Standardereignisse

Ereignis KeyDown

Beschreibung Signalisiert dem Objekt (i.a. dem, das den Fokus besitzt) das Niederdrcken einer beliebigen Taste der Tastatur

Betroffene Objekte Die meisten Steuerelemente, Form, MDIForm, PropertyPage, UserControl, UserDocument

KeyPress

Die meisten Steuerelemente, Form, Signalisiert dem Objekt (i.a. dem, das den Fokus besitzt), dass ein Zei- MDIForm, PropertyPage, UserControl, chen mit ANSI-Code ber die Tasta- UserDocument tur eingegeben wurde Die meisten Steuerelemente, Form, Signalisiert dem Objekt (i.a. dem, das den Fokus besitzt) das Loslassen MDIForm, PropertyPage, UserControl, einer beliebigen Taste der Tastatur UserDocument Signalisiert dem Objekt das Ende einer DDE-Verbindung Signalisiert dem Objekt das Auftreten eines Fehlers whrend einer DDE-Verbindung Signalisiert dem Objekt eine DDEKommandozeichenfolge whrend einer DDE-Verbindung Signalisiert dem Objekt, dass eine Zielanwendung eine DDE-Verbindung erffnen will signalisiert dem Objekt, dass es soeben geladen wurde Label, PictureBox, Form, MDIForm, TextBox Label, PictureBox, Form, MDIForm, TextBox Label, PictureBox, Form, MDIForm, TextBox Label, PictureBox, Form, MDIForm, TextBox Form, MDIForm, PropertyPage

Standardereignisse

KeyUp

LinkClose LinkError

LinkExecute

LinkOpen

Load LostFocus

Signalisiert dem Objekt, dass es den Die meisten Steuerelemente, Form, Fokus verloren hat MDI-Form, UserControl, UserDocument, Extender, PropertyPage Signalisiert dem Objekt das Nieder- Die meisten Steuerelemente, Form, drcken einer Maustaste MDI-Form, UserControl, UserDocument, PropertyPage Signalisiert dem Objekt, dass die Maus ber ihm bewegt wurde Signalisiert dem Objekt das Loslassen einer Maustaste Signalisiert der Quellkomponente einer OLE-Drag&Drop-Operation die Durchfhrung der Operation Signalisiert der Zielkomponente einer OLE-Drag&Drop-Operation den Abschluss der Aktion Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage

MouseDown

MouseMove

MouseUp

OLECompleteDrag

OLEDragDrop

209

Standardereignisse

Ereignis OLEDragOver

Beschreibung

Betroffene Objekte

Tritt whrend einer OLEDie meisten Steuerelemente, Form, Drag&Drop-Operation auf und sig- MDI-Form, UserControl, UserDocunalisiert der Zielkomponente das ment, PropertyPage Betreten oder Verlassen ihres Bereichs Signalisiert der Quellkomponente Die meisten Steuerelemente, Form, whrend einer OLE-Drag&DropMDI-Form, UserControl, UserDocuOperation, dass sie gerade ber eine ment, PropertyPage Zielkomponente gezogen wird und dort das OLEDragOver-Ereignis ausgelst hat Die meisten Steuerelemente, Form, Signalisiert der Quellkomponente nach Annahme einer OLEMDI-Form, UserControl, UserDocuDrag&Drop-Operation die Art des ment, PropertyPage von der Zielkomponente erwnschten Datenformats Signalisiert dem Objekt, seinen Fensterinhalt neu zu zeichnen Die meisten Steuerelemente, Form, MDI-Form, UserControl, UserDocument, PropertyPage

OLEGiveFeedback

Standardereignisse

OLESetData

Paint

QueryUnload

Signalisiert dem Objekt, dass es ent- Form, MDI-Form, PropertyPage laden werden soll was es aber ablehnen kann. Signalisiert dem Objekt nderungen PictureBox, CoolBar, DataReport, seiner Fenstergre Data, Form, MDIForm, OLE, UserControl, UserDocument Signalisiert dem Objekt, dass es abgebaut wird, weil keine Verweise mehr auf es existieren (folgt i.a. auf Unload) DataReport, DHTMLDesigner, Form, MDIForm, PropertyPage, UserControl, UserDocument, WebClass

Resize

Terminate

Unload

Signalisiert dem Objekt, dass es ent- Form, MDI-Form, PropertyPage laden wird und seinen Aufrumcode ausfhren kann; Ablehnen ist nicht mglich (folgt auf QueryUnload) Signalisiert einem Objekt, dass es dabei ist, den Fokus zu verlieren, und die Benutzereingabe auf ihre Gltigkeit hin prfen soll Steuerelemente, die den Fokus erhalten knnen

Validate

Anwendung

................................................... Anwendung

Der Programmierer kann sich darauf verlassen, dass sein Programm in bestimmten Situationen bestimmte Ereignisse bermittelt bekommt, was letztlich einer Ablaufsteuerung gleichkommt. So sieht das Ablaufmodell eines Formularobjekts vor, dass dieses im Zuge seiner Entstehung zuerst das Initialize-, dann das Load- und schlielich das Resize-Ereignis zu sehen bekommt. Was an weiteren Ereignissen eintrudelt, hngt von der Aufrufsituation und den Benutzer-

21 0

Standardereignisse

aktionen ab. Die drei letzten Ereignisse, die ein Formular vor dem Ableben zu sehen bekommt, sind QueryUnload, Unload und Terminate. Das Schne an Visual Basic ist, dass man sich nicht viele Gedanken darber machen muss, in welchem Rahmen mit welchen Ereignissen zu rechnen ist (ber die Ereignisse selbst sollte man sich natrlich schon Gedanken machen). Der Code-Editor ist intelligent genug, fr jedes auf Modulebene bekannte WithEvents-Objekt sowie fr das dem Modul an sich untergelegte Objekt genau die Ereignisse anzubieten, die es signalisiert bekommt. Was nicht im Angebot ist, muss entweder wie im Falle von Benutzersteuerelement- oder Klassenmodulen erst aufseiten des Objektdatentyps implementiert oder irgendwie anderweitig gelst werden. Programmierer, die es gewhnt sind, mit dem Source Development Kit (SDK) oder der Microsoft-Klassenbibliothek (MFC) zu programmieren, werden mit Sicherheit so manche Windows-Nachricht vermissen, die Visual Basic nicht in ein Ereignis ummnzt, sondern einfach unter den Tisch kehrt. Man kann mit Visual Basic zwar viel machen, aber eben nicht alles.
Beispiel

Standardereignisse

................................................... Beis piel

Das folgende Programm verdeutlicht die Ereignisreihenfolge fr den Aufruf und Abbau eines Formularobjekts:
' Formularmodul zum Testen der Ereignisreihenfolge Option Explicit Private Sub Form_Activate() Debug.Print "Activate" End Sub Private Sub Form_Deactivate() Debug.Print "Deactivate" End Sub Private Sub Form_GotFocus() Debug.Print "GotFocus" End Sub Private Sub Form_Initialize() Debug.Print "Initialize" End Sub Private Sub Form_Load() Debug.Print "Load" End Sub Private Sub Form_LostFocus() Debug.Print "LostFocus" End Sub Private Sub Form_Paint() Debug.Print "Paint" End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Debug.Print "QueryUnload"

21 1

Standardereignisse

End Sub Private Sub Form_Resize() Debug.Print "Resize" End Sub Private Sub Form_Terminate() Debug.Print "Terminate" End Sub

Standardereignisse

Private Sub Form_Unload(Cancel As Integer) Debug.Print "Unload" End Sub

Wird das Formular sofort nach dem Erscheinen wieder geschlossen, lautet die Ausgabe:

Ereignisprotokoll fr Programmstart und Programmende

Wie man sieht, tritt weder ein LostFocus- noch ein Deactivate-Ereignis auf. Aber auch das GotFocus-Ereignis trifft nur dann ein, wenn sich auf dem Formular kein Steuerelement befindet, das den Fokus annehmen kann. Und das Paint-Ereignis tritt nur auf, wenn die Eigenschaft AutoRedraw des Formulars auf False gesetzt ist.

Activate- Ereignis und Deactivate- Ereignis


Sub Objekt_Activate () Sub Objekt_Deactivate ()
Betroffene Objekte

................................................... Betro ffene Objekte


Form, MDIForm, DataReport
Beschreibung

................................................... Bes c hreibung

Das Activate-Ereignis geht dem GotFocus-Ereignis voraus und signalisiert, dass das Fenster des Objekts das aktive Fenster der Anwendung geworden ist. Es tritt nur auf, wenn die VisibleEigenschaft des Objekts auf True gesetzt und bereits ein Show-Aufruf erfolgt ist. Weiterhin tritt es nur auf, wenn der Fokus innerhalb der Anwendung auf ein anderes Fenster verschoben wird. Erhlt das Fenster den Fokus von einer anderen Anwendung zurck, bleibt das Ereignis aus. Umgekehrt signalisiert das Deactivate-Ereignis, dass das Fenster des Objekts den Fokus an ein anderes Fenster der Anwendung abgegeben hat. Dabei folgt es unmittelbar auf das LostFocusEreignis. LostFocus und Deactivate bleiben aus, wenn das Objekt und sein Fenster abgebaut werden.

21 2

Activate- Ereignis und Deactivate- Ereignis

Anwendung

................................................... Anwendung

Die Behandlung des Activate-Ereignisses kann sinnvoll sein, wenn das Objekt den Fokus gleich an ein anderes Fenster weitergeben soll. Deactivate kann dagegen ausgenutzt werden, um die Aktivierung in einer bestimmten Reihenfolge zu erzwingen.
Hinweis

................................................... Hinweis
Zeigt ein Formular aus einer von Visual Basic generierten Exe-Datei heraus ein Dialogfeld an, das aus einer gleichfalls mit Visual Basic generierten DLL stammt, erhlt das Formular regulr die Ereignisse Deactivate und LostFocus. Das Deactivate-Ereignis kann jedoch in bestimmten Konstellationen auch ausbleiben: wenn das Objekt eine prozessexterne Komponente ist; wenn das Dialogfeldobjekt nicht in Visual Basic programmiert wurde; wenn der Aufruf der DLL innerhalb der Entwicklungsumgebung erfolgt.
Beispiel

Standardereignisse

................................................... Beis piel

Der folgende Code stellt ein Formular vor, das keine weiteren Steuerelemente enthlt, und auf ein Click-Ereignis hin eine weitere Instanz seiner selbst zur Anzeige bringt. Die Ereignisse Activate, Deactivate, GotFocus und LostFocus werden im Direktfenster protokolliert.
' Formularmodul zum Testen der Aktivierungsreihenfolge Option Explicit Dim f As New Form1 Private Sub Form_Load() AutoRedraw = True End Sub Private Sub Form_Click() f.Show End Sub Private Sub Form_Activate() Debug.Print "Activate" End Sub Private Sub Form_Deactivate() Debug.Print "Deactivate" End Sub Private Sub Form_GotFocus() Debug.Print "GotFocus" End Sub Private Sub Form_LostFocus() Debug.Print "LostFocus" End Sub

Startet man das Programm, klickt einmal auf das Formular und beendet dann das Programm durch Schlieen beider Fenster, sieht die Ausgabe so aus:

21 3

Standardereignisse

Ereignisprotokoll fr die Aktivierung eines Fensters

Standardereignisse

Verwandte Ereignisse

................................................... Verwandte Ereignis s e


GotFocus, LostFocus

Change- Ereignis
Sub Objekt_Change([Index As Integer])
Betroffene Objekte

................................................... Betro ffene Objekte


ComboBox, DataCombo, DataGrid, DateTimePicker, DirListBox, DriveListBox, FlatScrollBar, HScrollBar, ImageCombo, Label, MaskEdBox, PictureBox, RichTextBox, Slider, TextBox, ToolBar, UserControl, UserDocument, UpDown, VScrollBar
Beschreibung

................................................... Bes c hreibung

Das Change-Ereignis wird ausgelst, wenn sich der Standardwert des Steuerelements gendert hat. Die genaue Ursache fr das Ereignis hngt von der Natur des einzelnen Steuerelements ab: Beim Textfeld und Kombinationsfeld ist es die nderung des Werts nach Eingabe eines weiteren Zeichens, bei Bildlaufleisten eine Positionsnderung der Bildlaufmarke und bei listenfeldbasierten Steuerelementen die Auswahl eines Werts durch den Benutzer. Das Ereignis wird auf jeden Fall auch dann ausgelst, wenn der Wert der Standardeigenschaft explizit durch Code gesetzt wird.
Anwendung

................................................... Anwendung

Das Change-Ereignis eignet sich gut dafr, mehrere voneinander abhngige Steuerelemente zu synchronisieren, so etwa die bekannte Kaskadensteuerung der Steuerelemente DriveListBox, DirListBox und FileListBox (vgl. Laufwerklistenfeld-Steuerelement (DriveListBox), S. 410).
Warnung

................................................... Wa rnung

Die leichtfertige Verwendung des Change-Ereignisses kann zur Auflsung von Ereignislawinen fhren, wenn sich zwei Steuerelement gegenseitig oder mehrere Steuerelemente zyklisch aktualisieren. Ein hufiges Problem im Zusammenhang mit der Behandlung dieses Ereignisses ist auch der rekursive Aufruf, der entsteht, wenn die Routine ihren eigenen Standardwert zu ndern versucht.
Beispiel

................................................... Beis piel

Der folgende Code ist reentrant, weil die hier nicht nher ausgefhrte Routine LookupFullValue den Wert des Textfelds vervollstndigt, wenn sie in ihrer Datenbasis einen passenden Wert findet. Da das ein weiteres Change-Ereignis auslst, kommt es zum Wiedereintritt in die Routine, wobei die statische Variable Reenter den erneuten Aufruf von LookupFullValue verhindert. Verzichtet man auf die statische Variable, muss die Routine LookupFullValue so implementiert sein,

21 4

Click- Ereignis

dass sie den Wert des Textfelds nicht ndert, wenn der gefundene Eintrag bereits vollstndig eingegeben wurde. In diesem Fall bricht die Rekursion dann sptestens nach dem zweiten Aufruf ab.
Private Sub Text1_Change() Static Reenter As Boolean If Not Reenter Then Reenter = True LookupFullValue Text1 Reenter = False End If End Sub

' Wert ggf. vervollstndigen

Standardereignisse

Click- Ereignis
Sub MDIForm_Click() Sub Form_Click() Sub Objekt_Click([Index As Integer])
Betroffene Objekte

................................................... Betro ffene Objekte


Animation, CheckBox, ComboBox, CommandButton, CoolBar, DataGrid, DBCombo, DBGrid, DBList, DirListBox, FileListBox, Form, Frame, Grid, Image, Label, ListBox, ListView, MDIForm, Menu, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RichTextBox, Slider, SSTab, StatusBar, TabStrip, TextBox, ToolBar, TreeView, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das Click-Ereignis wird ausgelst, wenn der Benutzer ber einem (nicht gesperrten) Steuerelement oder in den Client-Bereich eines Formulars einen Mausklick ausfhrt. Falls das Objekt in der Lage ist, den Fokus zu erhalten und diesen noch nicht besitzt, geht dem Click-Ereignis das GotFocus-Ereignis voran. Form-Objekte sowie die meisten Steuerelemente signalisieren das Ereignis bei rechtem oder linkem Mausklick. Objekte des Typs CheckBox, CommandButton, ListBox und OptionButton beachten dagegen nur die linke Maustaste. Zudem gibt es eine Reihe von Situationen, in denen Steuerelemente das Click-Ereignis auch unabhngig von einer Bettigung der Maustaste signalisieren. So, wenn:
q

der Benutzer in einem ComboBox- oder ListBox-Objekt per Tastatur oder Pfeilschaltflche ein anderes Element ausw hlt der Benutzer die Leertaste drckt und ein OptionButton-, CommandButton- oder CheckBoxObjekt gerade den Fokus hat der Benutzer die Eingabetaste drckt und ein CommandButton-Objekt existiert, dessen Default-Eigenschaft auf True gesetzt ist der Benutzer die Taste (Esc) drckt und ein CommandButton-Objekt existiert, dessen Cancel-Eigenschaft auf True gesetzt ist der Benutzer die Zugriffstaste ((Alt) + unterstrichenes Zeichen in der Beschriftung) fr ein Steuerelement drckt sich die Value-Eigenschaft eines Steuerelements ndert und diese den Typ Boolean trgt

Der Parameter Index gibt den Index des signalisierenden Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.

21 5

Standardereignisse

Anwendung

................................................... Anwendung

Das Click-Ereignis wird entweder als Auslser fr einen beliebigen Befehl (CommandButton) genutzt oder fr das Treffen von Einstellungen, die das Verhalten der Anwendung in der einen oder anderen Weise in einem komplexeren Zusammenhang nachhaltig verndern (CheckBox, OptionButton).
Warnung

................................................... Wa rnung

Standardereignisse

Das Click-Ereignis wird auch bei einem Doppelklick signalisiert und geht dem DblClick-Ereignis grundstzlich voraus. Falls die Click-Behandlungsroutine jedoch ein Objekt mit eigener Nachrichtenschleife (Formular oder Dialog: beispielsweise Msgbox) aufruft, kommt es trotz Doppelklicks nicht zu einem DblClick-Ereignis!
Tipp

................................................... Tipp

Das Click-Ereignis beinhaltet keinerlei Informationen darber, wo der Mausklick aufgetreten ist und welche Maustaste dafr benutzt wurde. Wenn diese Informationen fr die Programmlogik eine Rolle spielen, muss eines der Ereignisse MouseDown oder MouseUp, die unmittelbar vor bzw. nach Click auftreten, ausgewertet werden.
Beispiel

................................................... Beis piel

Der folgende Code stellt ein Formular vor, das die Ereignisse MouseDown, MouseUp, Click und DblClick im Direktfenster protokolliert.
' Formularmodul zum Testen der Mausereignisreihenfolge Option Explicit Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Debug.Print "MouseUp" End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Debug.Print "MouseDown" End Sub Private Sub Form_Click() Debug.Print "Click" End Sub Private Sub Form_DblClick() Debug.Print "DblClick" End Sub

Die Ereignisfolge fr einen einfachen Mausklick sieht so aus:

Ereignisprotokoll fr das Click-Ereignis

21 6

DblClick- Ereignis

Verwandte Ereignisse

................................................... Verwandte Ereignis s e


MouseDown, MouseUp, MouseMove, DblClick

DblClick- Ereignis
Sub MDIForm_DblClick() Sub Form_DblClick() Sub Objekt_DblClick([Index As Integer])
Betroffene Objekte

................................................... Betro ffene Objekte


Animation, ComboBox, DataGrid, DBCombo, DBGrid, DBList, FileListBox, Form, Frame, Grid, Image, Label, ListBox, ListView, MDIForm, Menu, OLE, OptionButton, PictureBox, PropertyPage, StatusBar, TextBox, ToolBar, TreeView, UserControl, UserDocument
Beschreibung

Standardereignisse

................................................... Bes c hreibung

Das DblClick-Ereignis wird ausgelst, wenn der Benutzer ber einem (nicht gesperrten) Steuerelement oder in den Client-Bereich eines Formulars doppelklickt. Form-Objekte sowie die meisten Steuerelemente signalisieren das Ereignis bei rechtem oder linkem Mausklick. Objekte des Typs ListBox und OptionButton beachten dagegen nur die linke Maustaste. ComboBox-Objekte signalisieren einen Doppelklick nur, wenn sie die Form eines einfachen Kombinationsfelds haben, das heit, wenn die Eigenschaft Style den Wert 1 hat. Der Parameter Index gibt den Index des signalisierenden Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Der Doppelklick hat fr grafisch orientierte Benutzerschnittstellen traditionell die Bedeutung der Auswahl eines Elements mit gleichzeitiger Besttigung der Standardaktion. Da dem DblClick-Ereignis immer ein Click-Ereignis vorausgeht, berlsst man die Elementauswahl blicherweise der Click-Behandlungsroutine und reagiert auf das DblClick-Ereignis nur mit der Besttigung, beispielsweise durch Aufruf der Click-Routine der Standardschaltflche (CommandButton-Objekt, dessen Default-Eigenschaft auf True gesetzt ist).
Tipp

................................................... Tipp

Um zu erfahren, ob ein linker oder rechter Doppelklick erfolgt ist und an welcher Position er aufgetreten ist, knnen Sie die Parameter der Ereignisse MouseDown oder MouseUp, die jedem DblClick-Ereignis vorangehen, auswerten.
Warnungen

................................................... Wa rnungen
Ein Doppelklick ist nur dann ein Doppelklick, wenn der Benutzer mit derselben Maustaste innerhalb der in der Systemsteuerung festgelegten Zeit zweimal klickt. Wird diese Zeit berschritten, signalisiert das betreffende Objekt zweimal hintereinander die Ereignisfolge fr das Click-Ereignis. Man sollte daher bei der Gestaltung der Logik der Benutzerschnittstelle darauf achten, dass dies keine Probleme bereitet. So wre es beispielsweise wenig sinnvoll, eine Lschoperationen an das Click-Ereignis zu binden, whrend das DblClick-Ereignis eine Auswahl mit impliziter Besttigung trifft. Falls die Behandlungsroutine fr das Click-Ereignis ein Formular oder einen Dialog (beispielsweise mit Msgbox) aufruft, kommt es trotz Doppelklicks nicht zu einem DblClick-Ereignis.

21 7

Standardereignisse

Beispiel

................................................... Beis piel

Die Ereignisfolge fr einen Doppelklick sieht so aus (Programmcode vgl. Click-Ereignis, S. 215):

Standardereignisse

Ereignisprotokoll fr das DblClic k- Ereignis

Verwandte Ereignisse

................................................... Verwandte Ereignis s e


MouseDown, MouseMove, MouseUp, Click

DragDrop- Ereignis
Sub MDIForm_DragDrop(Source As Control, X As Single, Y As Single) Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Sub Objekt_DragDrop([Index As Integer], Source As Control, _ X As Single, Y As Single)
Betroffene Objekte

................................................... Betro ffene Objekte


Adodc, Animation, CheckBox, ComboBox, CommandButton, Coolbar, Data, DataGrid, DataList, DataRepeater, DateTimePicker, DBCombo, DBGrid, DBList, DirListBox, DriveListBox, FileListBox, FlatScrollBar, Form, Frame, Grid, HScrollBar, Image, ImageCombo, Label, ListBox, ListView, MaskEdBox, MDIForm, MMControl, MonthView, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RemoteData, RichTextBox, Slider, StatusBar, TabStrip, TextBox, ToolBar, TreeView, UpDown, UserControl, UserDocument, VScrollBar, WebBrowser
Beschreibung

................................................... Bes c hreibung

Das DragDrop-Ereignis signalisiert den Abschluss einer Drag&Drop-Operation ein Vorgang, bei dem ein als Quellobjekt bezeichnetes Steuerelement (Source) mit Hilfe der Maus ber ein anderes als Zielobjekt bezeichnetes Steuerelement (Objekt) oder ein Formular (Form, MDIForm) gezogen und dort abgelegt wird. Da das Zielobjekt dabei eine Objektreferenz auf das Quellobjekt erhlt, steht es ihm frei, die Aktion nach Belieben zu interpretieren und von den Eigenschaften und Methoden des Quellobjekts Gebrauch zu machen. Die Parameter X und Y drcken die Zielkoordinaten des Steuerelements im Koordinatensystem des jeweiligen Zielobjekts aus. Der Parameter Index gibt den Index des signalisierenden Steuerelements (Zielobjekt) wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Im Gegensatz zu OLE-Drag&Drop-Operationen funktionieren Drag&Drop-Operationen nur innerhalb einer Anwendung (bzw. innerhalb ein und derselben Exe-Datei). Bei einer OLE-

21 8

DragDrop- Ereignis

Drag&Drop-Operation handelt es sich um einen dokumentenorientierten Vorgang, der den Datentransport zwischen Objekten (Steuerelementen, Komponenten) ber DataObject-Objekte abwickelt, ohne dass das Quellobjekt als solches in Erscheinung tritt. Da sie auch anwendungsbergreifend funktioniert letztlich war genau dies das Ziel, das zu ihrer Entwicklung gefhrt hat , ist ihre Handhabung schwieriger und mit wesentlich mehr Overhead verbunden als die Handhabung der Drag&Drop-Operation, bei der das Quellobjekt offen zu Tage tritt (weil es zum gleichen Prozess gehrt). Ein in einer Drag&Drop-Operation befindliches Steuerelement folgt ohne weiteres Zutun des Programms als schwebender Umriss den Mausbewegungen. Gelangt der Mittelpunkt des Umrisses in den Fensterbereich eines anderen Steuerelements, beginnt dieses mit der Signalisierung von DragOver-Ereignissen. (Das als Parent-Objekt des Steuerelements fungierende FormObjekt signalisiert somit laufend DragOver-Ereignisse). Ein DragOver-Ereignis bermittelt einen der Aktionscodes vbEnter (0), vbLeave (1), vbOver (2). Eine Behandlungsroutine fr das DragOver-Ereignis wird im Allgemeinen die DragIcon-Eigenschaft des Quellobjekts ndern, um dem Benutzer anhand der Mauszeigerform zu bedeuten, ob die Operation von Erfolg gekrnt sein kann oder nicht zuweilen findet man aber auch das Verhalten, dass das Zielobjekt seine Anzeige invertiert. Damit ein Steuerelement eine Drag&Drop-Operation als Quellobjekt eingeht, muss entweder seine DragMode-Eigenschaft den Wert vbAutomatic (1) aufweisen oder ein expliziter Aufruf seiner Drag-Methode mit Aktionscode vbBeginDrag erfolgen. Im ersteren Fall leitet das Objekt die Operation bei Niederdrcken der Maustaste von sich aus ein, so dass man sich als Programmierer eigentlich nur um die Behandlung des DragDrop- sowie gegebenenfalls des DragOver-Ereignisses auf der Zielseite kmmern muss. Wenn als Quelle auch mehrere Steuerelemente zulssig sein sollen oder die Steuerung des Vorgangs sonstwie durch Programmcode gegeben sein soll (beispielsweise ber Tastaturereignisse oder unter Bercksichtigung von Funktionstasten), bleibt nicht anderes brig, als die Eigenschaft DragMode auf vbManual zu belassen und die Operation explizit mit der Methode Drag unter Angabe des entsprechenden Aktionscodes einzuleiten (vbBeginDrag), zu beenden (vbEndDrag) oder abzubrechen (vbCancel).
Beispiel

Standardereignisse

................................................... Beis piel

Das Beispielprojekt DragDrop demonstriert den typischen Ablauf einer programmseitig eingeleiteten Drag&Drop-Operation. Das Formular enthlt eine Schalflche Command1 sowie ein Bildfeld Picture1. Ein Klick auf die Schaltflche ffnet eine weitere Instanz des Formulars und ldt ein Bild in das Bildfeld. Das Bild kann nun via Drag&Drop zwischen den Bildfeldern der beiden Formulare hin und her verschoben werden. Ein Klick auf die Schaltflche Command1 der zweiten Instanz ffnet eine dritte Instanz, woraufhin sich das Bild zwischen allen drei Bildfeldern verschieben lsst. Der Code pflegt zudem die DragIcon-Eigenschaft des Quellobjekts, indem er ihm je nach Situation die Symbole DropOK, NoDrop und Dragging zuordnet. Sie stammen aus der umfangreichen zu Visual Basic gehrigen Grafiksammlung \Programme\Microsoft Visual Studio\Common\Graphics. Die folgende Abbildung zeigt die verschiedenen Gesichter des Mauszeigers whrend einer Drag&Drop-Operation (siehe folgende Abbildung). Fr den vorliegenden Code ist es kein Problem, wenn Quell und Zielobjekt bereinstimmen. Das Steuerelement behandelt dann sozusagen die hausgemachten DragOver- und Drag-Ereignisse. (Das ist auch der Grund, warum man sofort nach Beginn der Operation erst einmal das DropOK-Symbol sieht.)
' Projekt: DragDrop-Demo Dim Form2 As New Form1 Public NoDrop As Picture Public Dragging As Picture Public DropOK As Picture

' Ablegen nicht mglich ' Drag&Drop-Operation ' Ablegen mglich

21 9

Standardereignisse

Standardereignisse

Der Mauszeiger ndert sich whrend einer Drag&Drop- Operation


Private Sub Command1_Click() Picture1 = LoadPicture(App.Path + "\phone.wmf") ' Bild laden Form2.Left = Left + Width ' Nchstes Formular neben dieses Form2.Top = Top Form2.Show End Sub Private Sub Command1_DragOver(Source Static AltesIcon As Picture Select Case State Case vbEnter Set AltesIcon = Source.DragIcon Source.DragIcon = NoDrop Case vbLeave Source.DragIcon = AltesIcon End Select End Sub As Control, X As Single, Y As Single, State As Integer) ' Aktionscode analysieren ' Altes Symbol speichern ' Ablegen nicht mglich ' Altes Symbol wiederherstellen

Private Sub Form_Unload(Cancel As Integer) Unload Form2 End Sub Private Sub Picture1_DragOver(Source Y As Single, State As Integer) Static AltesIcon As Picture Select Case State Case vbEnter Set AltesIcon = Source.DragIcon Source.DragIcon = DropOK Case vbLeave Source.DragIcon = AltesIcon End Select End Sub As Control, X As Single, _

' Aktionscode analysieren ' Altes Symbol speichern ' Ablegen mglich ' Altes Symbol wieder herstellen

Private Sub Form_Load() Set NoDrop = LoadPicture(App.Path + "\noDrop02.cur") Set Dragging = LoadPicture(App.Path + "\drag1pg.ico") Set DropOK = LoadPicture(App.Path + "\drop1pg.ico") End Sub

220

DragOver- Ereignis

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Set Picture1.DragIcon = Dragging ' Symbol fr Drag-Operation Picture1.Drag (vbBeginDrag) ' Drag-Operation starten End Sub Private Sub Picture1_DragDrop(Source Y As Single) Dim Bild As Picture Set Bild = Source.Picture Set Source.Picture = Nothing Set Picture1 = Bild End Sub
Verwandte Ereignisse

As Control, X As Single, _ ' ' ' ' Da Drag&Drop auf sich selbst mglich, muss Bildreferenz zwischengespeichert werden!

Standardereignisse

................................................... Verwandte Ereignis s e


DragOver, OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedBack, OLESetData
Verwandte Themen

................................................... Verwandte Them en

Transparenz und Drag&Drop (S. 606)

DragOver- Ereignis
Sub MDIForm_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) Sub Form_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) Sub Objekt_DragOver([Index As Integer], Source As Control, _ X As Single, Y As Single, State As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


Adodc, Animation, CheckBox, ComboBox, CommandButton, Coolbar, Data, DataGrid, DataList, DataRepeater, DateTimePicker, DBCombo, DBGrid, DBList, DirListBox, DriveListBox, FileListBox, FlatScrollBar, Form, Frame, Grid, HScrollBar, Image, ImageCombo, Label, ListBox, ListView, MaskEdBox, MDIForm, MonthView, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RemoteData, RichTextBox, Slider, StatusBar, TabStrip, TextBox, ToolBar, TreeView, UpDown, UserControl, UserDocument, VScrollBar, WebBrowser
Beschreibung

................................................... Bes c hreibung

Das DragOver-Ereignis signalisiert, dass der Umriss des als Quellobjekt fungierenden Steuerelements Source im Verlauf einer Drag&Drop-Operation gerade ber den Fensterbereich von Objekt (Steuerelement oder Formular) gezogen wird und somit als mgliches Ziel der Operation in Frage kommt. Da Objekt eine Objektreferenz auf das Quellobjekt erhlt, steht es ihm frei, die Aktion nach Belieben zu interpretieren und von den Eigenschaften und Methoden des Quellobjekts Gebrauch zu machen das heit insbesondere dessen Eigenschaft DragIcon zu manipulieren, um dem Benutzer ein visuelles Feedback ber den mglichen Erfolg oder Misserfolg der Operation zu geben. Die Parameter X und Y drcken die aktuellen Koordinaten des Steuerelements im Koordinatensystem von Objekt aus.

221

Standardereignisse

Der Parameter State enthlt einen Aktionscode, der ber die Tendenz der Operation Aufschluss gibt. Sein Wert ist: vbEnter (0), wenn der Mittelpunkt des Umrisses von Source gerade in den Fensterbereich von Objekt gelangt ist; vbOver (2), wenn der Mittelpunkt des Umrisses von Source im Fensterbereich von Objekt ist und darin bewegt wird; vbLeave (1), wenn der Mittelpunkt des Umrisses von Source den Fensterbereich von Objekt verlsst. Der Parameter Index gibt den Index des signalisierenden Steuerelements (mgliches Zielobjekt der Operation) wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Standardereignisse

Ein in einer Drag&Drop-Operation befindliches Steuerelement folgt ohne weiteres Zutun des Programms als schwebender Umriss den Mausbewegungen. Gelangt der Mittelpunkt des Umrisses in den Fensterbereich eines anderen Steuerelements, beginnt dieses mit der Signalisierung von DragOver-Ereignissen. (Das als Parent-Objekt des Steuerelements fungierende FormObjekt signalisiert somit laufend DragOver-Ereignisse). Bei der Behandlung des DragOver-Ereignisses wird meist nur zwischen den Aktionscodes vbEnter (0) und vbLeave (1) unterschieden, um die Eigenschaft DragIcon des Quellobjekts geeignet zu setzen. Der Aktionscode vbOver kann dann von Relevanz sein, wenn der Bereich des Steuerelements noch einmal in Unterbereiche aufgeteilt ist.
Beispiel

................................................... Beis piel

Die folgende Behandlungsroutine entstammt dem vollstndigen Beispiel fr das DragDrop-Ereignis. Auf den Aktionscode vbEnter hin speichert die Routine zunchst den Wert von DragIcon des Quellobjekts und ndert dann die Eigenschaft geeignet. Tritt der Aktionscode vbLeave auf, stellt die Routine das ursprngliche Symbol wieder her.
Private Sub Picture1_DragOver(Source Y As Single, State As Integer) Static AltesIcon As Picture Select Case State Case vbEnter Set AltesIcon = Source.DragIcon Source.DragIcon = DropOK ' Source.DragIcon = NoDrop Case vbLeave Source.DragIcon = AltesIcon End Select End Sub
Verwandte Ereignisse

As Control, X As Single, _

' Aktionscode analysieren ' Altes Symbol speichern ' Ablegen mglich ' Ablegen nicht mglich ' Altes Symbol wieder herstellen

................................................... Verwandte Ereignis s e


DragDrop, OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedBack, OLESetData

GotFocus- Ereignis und LostFocus- Ereignis


Sub MDIForm_GotFocus() Sub Form_GotFocus() Sub Objekt_GotFocus ([Index As Integer]) Sub MDIForm_LostFocus() Sub Form_LostFocus() Sub Objekt_LostFocus ([Index As Integer])

222

GotFocus- Ereignis und LostFocus- Ereignis

Betroffene Objekte

................................................... Betro ffene Objekte


Adodc, Animation, CheckBox, ComboBox, CommandButton, DataGrid, DataList, DataRepeater, DateTimePicker, DBCombo, DBGrid, DBList, DirListBox, DriveListBox, FileListBox, Form, Grid, ImageCombo, ListBox, ListView, MaskEdBox, MDIForm, MonthView, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, PropertyPage, RichTextBox, Slider, TabStrip, TextBox, TreeView, UpDown, UserControl, UserDocument, VScrollBar, WebBrowser
Beschreibung

................................................... Bes c hreibung

Das GotFocus-Ereignis signalisiert einem Objekt, dass es den Eingabefokus erhalten, das LostFocus-Ereignis, dass es ihn verloren hat. Der Eingabefokus legt fest, welches Objekt die Tastatureingaben des Benutzers zu sehen bekommt. Mit anderen Worten: Hat ein Objekt den Eingabefokus, erhlt es auch die Ereignisse KeyDown usw. Ein Formular erhlt den Eingabefokus nur, wenn es keine Steuerelemente enthlt, die diesen erhalten knnten. (Nicht alle Steuerelemente untersttzen einen Eingabefokus, und gesperrte sowie unsichtbare Steuerelemente nehmen ihn nicht an.) Der Parameter Index gibt den Index des Steuerelements wieder, das den Fokus erhalten bzw. verloren hat, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

Standardereignisse

................................................... Anwendung

Beim Show-Aufruf eines Formulars erhlt das Steuerelement den Eingabefokus, das unter allen in Frage kommenden den niedrigsten TabIndex-Wert besitzt, sprich: in der Tabulatorreihenfolge mglichst weit am Anfang steht. Den Eingabefokus erhalten knnen alle Steuerelemente, die den Eingabefokus untersttzen (das Image-Steuerelement tut das beispielsweise nicht) und deren Visible- sowie Enabled-Eigenschaften auf True gesetzt sind. Ist ein Steuerelement im Besitz des Eingabefokus, wird das aus seiner Darstellung ersichtlich: Ein Textfeld zeigt eine blinkende Eingabemarke an, die Beschriftung einer Schaltflche erhlt eine gepunktete Umrahmung usw. Fr die Weitergabe des Eingabefokus kommt eine von drei Ursachen in Betracht. Erstens, der Benutzer drckt die Taste (Tab) bzw. die Tastenkombination (Umschalt)+(Tab). In diesem Fall rckt der Eingabefokus unter den in Frage kommenden Steuerelementen entlang der Tabulatorreihenfolge vorwrts bzw. rckwrts. Zweitens, der Benutzer klickt mit der Maus auf ein anderes Steuerelement. Falls das Steuerelement den Eingabefokus annehmen kann, erhlt es ihn, ansonsten verbleibt er bei dem Steuerelement, in dessen Besitz er ist. Drittens, der Fokus wird einem Steuerelement programmseitig durch Aufruf der SetFocus-Methode des zugehrigen Objekts explizit zugeordnet. Falls das Steuerelement den Fokus nicht annehmen kann, etwa weil es gesperrt oder nicht sichtbar ist, kommt es zu einem Laufzeitfehler. Geht der Eingabefokus von einem ersten Steuerelement auf ein zweites Steuerelement weiter, signalisieren beide Steuerelemente ein Ereignis: Das erste Steuerelement signalisiert ein LostFocus-Ereignis und das zweite ein GotFocus-Ereignis. Das GotFocus-Ereignis wird in der Regel dazu benutzt, den fr die Eingabe erforderlichen Kontext einzustellen, das heit, den Zustand anderer Steuerelemente zu aktualisieren, wechselseitige Abhngigkeiten mit anderen Steuerelementen zu bercksichtigen oder Vorgabewerte bereitzustellen. Das LostFocus-Ereignis lsst sich dazu benutzen, den Fokus abweichend von der Tabulatorreihenfolge explizit einem bestimmten Steuerelement zuzuschanzen, Aktualisierungen anderer Steuerelemente oder Objekte vorzunehmen, deren Zustnde in irgendeiner Form vom Wert des signalisierenden Steuerelements abhngen, oder Daten zurckzuschreiben bzw. anzufordern. Kurz gesagt, die Behandlung des LostFocus-Ereignisses ermglicht es, den aktuellen Wert des signalisierenden Steuerelements in den Zustand der Anwendung einzuflechten. Ist die CausesValidation-Eigenschaft sowohl des Steuerelements, das den Fokus verliert, als auch des Steuerelements, das den Fokus erhlt, auf True gesetzt, geht dem LostFocus-Ereignis

223

Standardereignisse

noch das Validate-Ereignis voraus, das eine Gltigkeitsprfung des Eingabewerts ermglicht. Zur Weitergabe des Fokus kommt es in diesem Fall nur, wenn der vom Ereignis bermittelte ByRef-Parameter Cancel im Verlauf der Validate-Behandlung nicht auf True gesetzt wird.
Warnung

................................................... Wa rnung

Standardereignisse

Vom Prinzip her knnte man auch versuchen, eine Gltigkeitsprfung im Zuge von LostFocus zu implementieren. Das kann aber Probleme verursachen, da das Steuerelement zu dem Zeitpunkt, an dem das Ereignis auftritt, den Fokus bereits abgegeben hat. Es wre also ein SetFocus-Aufruf erforderlich, der aber wiederum dem neuen Inhaber des Fokus diesen sofort wieder entreit und ihm das LostFocus-Ereignis beschert. Falls dieses Steuerelement gleichfalls nicht bereit ist, den Fokus herzugeben und seinerseits einen SetFocus-Aufruf durchfhrt, kommt es zu einer Ereignisflut, die das System destabilisieren kann. Benutzen Sie fr dieses Unterfangen besser das Validate-Ereignis, das speziell auf diesen Zweck ausgelegt ist.
Tipp

................................................... Tipp

Um einer anderen Anwendung oder Instanz der gleichen Anwendung den Anwendungsfokus zuzuschanzen, lsst sich die AppActivate-Anweisung verwenden: Sub AppActivate (title As String[, wait As Boolean]) Die Parameter der Anweisung sind benannt. Fr title gibt man den Fenstertitel der zu aktivierenden Anwendung vollstndig oder nur die ersten paar signifikanten Zeichen an. Hat der optionale Parameter wait den Wert True, erfolgt die Aktivierung der im ersten Parameter spezifizierten Anwendung erst, wenn das Programm, das die AppActivate-Anweisung ausfhrt, selbst den Anwendungsfokus erhlt, ansonsten erfolgt die Fokusweitergabe unabhngig davon, welche der aktuell in Ausfhrung befindlichen Anwendungen ihn gerade besitzt.
Verwandte Ereignisse

................................................... Verwandte Ereignis s e


Validate, Activate, Deactivate

Initialize- Ereignis
Sub Objekt_Initialize()
Betroffene Objekte

................................................... Betro ffene Objekte


Class, DataReport, DHTMLPageDesigner, Form, MDIForm, PropertyPage, UserControl, UserDocument, WebClass
Beschreibung

................................................... Bes c hreibung

Das Initialize-Ereignis ist das erste Ereignis, das ein frisch generiertes Objekt Objekt zu sehen bekommt. Es geht dem Load-Ereignis voran und gibt dem Objekt die Mglichkeit zur Initialisierung seiner Bestandteile.
Anwendung

................................................... Anwendung

Im Gegensatz zum Load-Ereignis kann das Initialize-Ereignis nur einmal im Leben eines Objekts auftreten. Es tritt auf, wenn das Laufzeitsystem eine neue Objektinstanz anlegt, das heit bei Ausfhrung einer impliziten oder expliziten New-Anweisung oder bei Aufruf der CreateObject-Funktion. Es eignet sich dafr, Elemente und Eigenschaften des frisch ins Leben gerufenen Objekts zu initialisieren, die keine erneute Initialisierung bentigen, wenn das Fenster des Objekts (Formular oder Steuerelement) zwischendurch entladen wird. Dazu zhlen beispiels-

224

KeyDow n- Ereignis und KeyUp- Ereignis

weise auf Modulebene deklarierte Variablen. Einem Formularobjekt untergeordnete Steuerelemente sollten ihre Initialisierung im Zuge des Load-Ereignisses erfahren, da sie, wenn eine Unload-Anweisung mit nachfolgender impliziter oder expliziter Load-Anweisung auftritt, zusammen mit dem Formular entladen und wieder geladen werden.
Tipp

................................................... Tipp

Achten Sie darauf, dass ein Objekt bei Eintreffen des Initialize-Ereignisses zwar existiert, aber noch nicht ganz fertig konstruiert ist. Insbesondere lassen sich zu diesem Zeitpunkt noch nicht alle Methoden des Objekts aufrufen. (So kann es beispielsweise in einem Formular mit dem Print-Aufruf Schwierigkeiten geben.) Nicht zuletzt aus diesem Grund wird der Code fr die Initialisierung eines Formulars meist in die Behandlungsroutine fr das Load-Ereignis gepackt, das unmittelbar nach dem Initialize-Ereignis (bzw. whrend der Behandlung des InitializeEreignisses) auftritt. Der folgende Code liefert beispielsweise eine zunchst einmal verblffende Ausgabe:

Standardereignisse

Kommt das

Load-Ereignis

etwa vor dem

Initialize-Ereignis?

Sub Form_Initialize() AutoRedraw = True Print "Initialize" a = 1 End Sub Private Sub Form_Load() Print "Load" End Sub

' Wenn False oder fehlt, Laufzeitfehler!

Sieht man sich den Programmablauf aber im Einzelschrittmodus (Taste (F8)) des Debuggers an, stellt man fest, dass das Load-Ereignis im Verlauf von Form_Initialize nmlich beim Setzen der AutoRedraw-Eigenschaft getriggert wird.
Beispiel

................................................... Beis piel

Private Names() As String Const StartGreNames = 10 Sub Form_Initialize() Redim Names(StartGreNames) End Sub
Verwandte Ereignisse

................................................... Verwandte Ereignis s e


Load, Terminate, Unload

KeyDown- Ereignis und KeyUp- Ereignis


Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Sub Objekt_KeyDown([Index As Integer], KeyCode As Integer, _ Shift As Integer)

225

Standardereignisse

Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) Sub Objekt_KeyUp([Index As Integer], KeyCode As Integer, _ Shift As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


CheckBox, ComboBox, CommandButton, DataCombo, DataGrid, DataList, DBCombo, DBGrid, DBList, DirListBox, DriveListBox, FileListBox, Form, Grid, ListBox, ListView, MaskEdBox, MonthView, OLE, OptionButton, PictureBox, PropertyPage, RichTextBox, Slider, TabStrip, TextBox, TreeView, UserControl, UserDocument, VScrollBar

Standardereignisse

Beschreibung

................................................... Bes c hreibung

Die Ereignisse KeyDown und KeyUp werden von dem Steuerelement signalisiert, das den Eingabefokus besitzt. KeyDown zeigt an, dass der Benutzer die Taste mit dem Tastaturcode KeyCode niedergedrckt hat, KeyUp, dass der Benutzer die Taste mit dem Tastaturcode KeyCode wieder losgelassen hat. Der Aufzhlungstyp KeyCodeConstants definiert fr die meisten Tasten eine eigene Konstante nach dem Muster: vbKey0 fr die Taste (0), vbKeyA fr die Taste (A), vbKeyF1 fr die Taste (F1) usw. Die vollstndige Liste finden Sie im Objektkatalog (aufzurufen mit (F2)) der Visual-Basic-Entwicklungsumgebung. Der Parameter Shift ist ein Bitvektor, dessen gesetzte Bits 0 bis 2 (vbShiftMask, vbCtrlMask, vbAltMask) anzeigen, ob die Funktionstasten (Umschalt), (Strg) oder (Alt) bei Auslsung des Ereignisses gedrckt (gesetztes Bit) bzw. nicht gedrckt (gelschtes Bit) waren. Hat Shift beispielsweise den Wert 5 (vbShiftMask+vbAltMask), bedeutet das, dass die Taste in Kombination mit (Umschalt)+(Alt) niedergedrckt bzw. losgelassen wurde. Der Parameter Index gibt den Index des signalisierenden Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Wer sich auf die Verarbeitung von Tastatureingaben auf der Ebene der KeyUp- und KeyDownEreignisse einlsst, beweist Mut zum Detail. Da Steuerelemente, die auf diese Ereignisse reagieren, bereits eine fertige Tastaturschnittstelle mitbringen, die festlegt, wie das Steuerelement auf jede einzelne Taste bzw. Tastenkombination reagiert, besteht wenig Veranlassung fr massivere Eingriffe, die ber die Ergnzung oder nderung spezifischer Tastaturbefehle hinausgehen. Bei Implementierung eines Benutzersteuerelements wird man dagegen schon eher in die Verlegenheit geraten, selbst eine Tastaturschnittstelle gestalten zu mssen. berlegen Sie sich dabei aber gut, was sie wollen, denn nichts fhrt schneller in des Teufels Kche als eine naiv drauflosprogrammierte Tastaturschnittstelle. Bereits bei der Konzeption der Schnittstelle gibt es einige Dinge zu beachten: Erstens schlucken das Betriebssystem und das Laufzeitsystem von Visual Basic gewisse Tastenkombinationen einfach weg, fr die bereits auf hherer Ebene eine Interpretation existiert. Da sind schon einmal die von Windows reservierten Tastenkombinationen fr die Zwischenablage ((Strg)+(C), (Strg)+(V), (Strg)+(X), (Strg)+(Einfg), (Strg)+(Entf), (Umschalt)+(Einfg)) sowie die fr den Schnellstart von Desktop-Objekten auf dem jeweiligen System vereinbarten Tastenkombinationen. Aufseiten des Formulars kommen dann noch die Zugriffstasten fr die Steuerelemente ((Alt) + unterstrichener Buchstabe in der Beschriftung des Steuerelements) und die ShortCut-Tasten fr die Men- und Symbolleistenbefehle ((Ctrl) + Buchstabe) hinzu. Ist bei einem der Steuerelemente auf dem Formular die Eigenschaft Default bzw. Cancel auf True gesetzt (CommandButton, OLE usw.), lst die Eingabetaste bzw. die Taste (Esc) dessen ClickEreignis aus. Nur was da noch brig bleibt, fhrt zu einem KeyUp- und/oder KeyDown-Ereignis und lsst sich individuell verarbeiten.

226

KeyDow n- Ereignis und KeyUp- Ereignis

Zweitens: Der von den Ereignissen gelieferte Wert fr den Parameter KeyCode ist mitnichten der ASCII-Code (wie bei dem Ereignis KeyPress), sondern vielmehr der Tastaturcode der gedrckten Taste. Die Unterscheidung zwischen Klein- und Groschreibung ist ebenso anhand des im Parameter Shift gelieferten Bitvektors zu treffen wie die Abfrage der Funktionstasten Strg und Alt. Drckt der Benutzer also die Kombination (Umschalt)+(A), ergibt sich fr KeyCode der Wert vbKeyA und fr Shift der Wert vbShiftMask. Auch jede Funktionstaste fr sich liefert KeyUp- und KeyDown-Ereignisse. Die Tastaturcodes der Tasten (Umschalt), (Strg) und (Alt) sind vbKeyShift, vbKeyCtrl und vbKeyAlt. Eine Unterscheidung zwischen rechts und links gelegenen Tasten gibt es nicht, auch der Bitvektor Shift hilft da nicht weiter. Damit nicht genug: Nach einer gewissen Zeit, setzt die Wiederholfunktion der Tastatur ein, so dass beispielsweise bereits eine etwas lnger gehaltene Taste (Umschalt) zu einer Flut von KeyUp- und KeyDown-Ereignissen fhrt. All das gibt es zu bercksichtigen. Am besten, Sie sehen sich auf einem leeren Formular selbst an, was passiert:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Print KeyCode, Shift End Sub
Hinweis

Standardereignisse

................................................... Hinweis
Ein Formularobjekt erhlt diese Ereignisse nur, wenn keines seiner Steuerelemente den Eingabefokus hat oder wenn die Eigenschaft KeyPreview auf True gesetzt ist. Im letzteren Fall sieht das Formularobjekt jedes Tastaturereignis als Erstes (bis auf spezielle Ereignisse, die einzelne Steuerelemente wegfangen: ein CommandButton-Steuerelement mit der Default-Eigenschaft True fngt beispielsweise die Eingabetaste ab und ein ListBox-Steuerelement die Tasten (Oben) und (Unten)). Sobald das Formularobjekt mit der Behandlung eines Tastaturereignisses fertig ist, kommt die Behandlungsroutine des Steuerelements, das den Fokus besitzt, zum Aufruf es sei denn, das Formularobjekt setzt den ByRef-Parameter KeyCode auf 0, dann unterbleibt der Aufruf. Dieser Fall gilt analog fr alle Objekte, die als Container fr Steuerelemente fungieren knnen und ber die KeyPreview-Eigenschaft verfgen (PropertyPage, UserControl, UserDocument).
Beispiel

................................................... Beis piel

Das Projekt KeyUpDown zeigt die Implementation einer Tastaturschnittstelle fr ein PictureBox-Steuerelement. Das Programm ermglicht es, das Bildfeld Picture1 mittels der Cursortasten in dem Formular zu bewegen (Pacman lsst gren).
Private MaxX, MaxY, StepX, StepY Private PosX, PosY Private Sub Form_Load() Picture1 = LoadPicture(App.Path + "\Phone.wmf") StepX = Picture1.Width / 10 StepY = Picture1.Height / 10 MaxX = ScaleWidth Picture1.Width MaxY = ScaleHeight Picture1.Height PosX = Picture1.Left PosY = Picture1.Top End Sub Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyUp PosY = PosY StepX

227

Standardereignisse

Standardereignisse

If PosY < 0 Then PosY = 0 Case vbKeyDown PosY = (PosY + StepY) Mod MaxY Case vbKeyLeft PosX = PosX StepX If PosX < 0 Then PosX = 0 Case vbKeyRight PosX = (PosX + StepX) Mod MaxX Case vbKeyHome PosX = 0: PosY = 0 Case vbKeyEnd PosX = MaxX: PosY = MaxY End Select Picture1.Left = PosX Picture1.Top = PosY End Sub
Verwandte Befehle

................................................... Verwa ndte Befehle

KeyPress, MouseDown, MouseUp

KeyPress- Ereignis
Sub Form_KeyPress(KeyAscii As Integer) Sub Objekt_KeyPress([Index As Integer], KeyAscii As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


CheckBox, ComboBox, CommandButton, DataCombo, DataGrid, DataList, DBCombo, DBGrid, DBList, DirListBox, DriveListBox, FileListBox, Form, Grid, ListBox, ListView, MaskEdBox, MonthView, OLE, OptionButton, PictureBox, PropertyPage, RichTextBox, Slider, TabStrip, TextBox, TreeView, UserControl, UserDocument, VScrollBar
Beschreibung

................................................... Bes c hreibung

Das Ereignis KeyPress wird von dem Steuerelement signalisiert, das den Eingabefokus besitzt. Es zeigt an, dass der Benutzer eine Taste der Tastatur gedrckt hat, die das Zeichen mit dem ANSI-Code KeyAscii generiert. Gro- und Kleinschreibung werden unterschieden. Der Parameter Index gibt den Index des signalisierenden Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Wofr sich das KeyPress-Ereignis einsetzen lsst, drfte klar sein: berall da, wo das konkrete ber die Tastatur eingegebene ANSI-Zeichen von Interesse ist. So knnte man etwa auf die Taste (Esc) hin den ursprnglichen Wert eines TextBox-Steuerelements wieder herstellen:
Private OldText1 As String Private Sub Text1_GotFocus() OldText1 = Text1 End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyEscape Then

228

KeyPress- Ereignis

Text1 = OldText1 End If End Sub

brigens, zur Menge der ANSI-Zeichen gehren bekanntlich auch die Tastenkombinationen (Strg)+(A) bis (Strg)+(Z) mit den ASCII-Codes 1 bis 26. ((Strg)+(V) und (Strg)+(X) schnappt sich allerdings das Betriebssystem, ebenso (Strg)+(C), wenn ein Bereich markiert ist; weitere Kombinationen knnen fr Menbefehle vereinbart sein.)
Hinweis

................................................... Hinweis
Ein Formularobjekt erhlt dieses Ereignis nur, wenn keines seiner Steuerelemente den Eingabefokus hat oder wenn die Eigenschaft KeyPreview auf True gesetzt ist. Im letzteren Fall sieht das Formularobjekt jedes Tastaturereignis als Erstes (bis auf spezielle Ereignisse, die einzelne Steuerelemente wegfangen: ein CommandButton-Steuerelement mit der Default-Eigenschaft True fngt beispielsweise die Eingabetaste ab und ein ListBox-Steuerelement die Tasten (Oben) und (Unten). Sobald das Formularobjekt mit der Behandlung eines Tastaturereignisses fertig ist, kommt die Behandlungsroutine des Steuerelements, das den Fokus besitzt, zum Aufruf es sei denn, das Formularobjekt setzt den ByRef-Parameter KeyCode auf 0, dann unterbleibt der Aufruf. Dieser Fall gilt analog fr alle Objekte, die als Container fr Steuerelemente fungieren knnen und ber die KeyPreview-Eigenschaft verfgen (PropertyPage, UserControl, UserDocument).
Beispiel

Standardereignisse

................................................... Beis piel

Der folgende einfache Code dokumentiert den Ablauf der drei Ereignisse KeyDown, KeyUp und KeyPress im Direktfenster. Die Abbildung zeigt die Ausgabe fr die Tastenfolge (Alt)+(A); (A).

Ausgabe im Direktfenster
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Debug.Print "KeyDown"; KeyCode; Shift End Sub Private Sub Form_KeyPress(KeyAscii As Integer) Debug.Print "KeyPress"; KeyAscii; Chr(KeyAscii) End Sub Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) Debug.Print "KeyUp"; KeyCode; Shift End Sub
Verwandte Ereignisse

................................................... Verwandte Ereignis s e


MouseDown, MouseUp, KeyDown, KeyUp

229

Standardereignisse

LinkClose- Ereignis
Sub Form_LinkClose() Sub MDIForm_LinkClose() Sub Objekt_LinkClose([Index As Integer])
Betroffene Objekte

................................................... Betro ffene Objekte


Form, Label, MDIForm, PictureBox, TextBox
Beschreibung

Standardereignisse

................................................... Bes c hreibung

Das LinkClose-Ereignis tritt auf beiden Seiten einer bestehenden DDE-Verbindung auf, wenn die Verbindung von einer der beiden Seiten beendet wird. Da aufseiten der Quelle das als Thema der Verbindung fungierende Objekt (meist ein Formularobjekt) alle Anforderungen bedient, erhlt dieses auch das LinkClose-Ereignis, und nicht das in LinkItem spezifizierte Quellobjekt. Der Parameter Index gibt den Index des signalisierenden Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Eine DDE-Verbindung ermglicht die Verknpfung von Datenfeldern und die bermittlung von Kommandos zwischen einem Ziel und einer Quelle, die jeweils unterschiedlichen Prozessen (lies: Laufzeitinstanzen von Anwendungen) angehren. Zielobjekt ist ein Steuerelement, Quellobjekt ein Formular. Das Zielobjekt initiiert den Verbindungsaufbau. Bei einer DDE-Verknpfung liefert gewhnlich das Quellobjekt den Wert eines seiner Elemente (lies: Steuerelemente) an das Zielobjekt, obwohl eine Aktualisierung auch in der anderen Richtung mglich ist, wenn die Methode LinkPoke zum Einsatz kommt. Ein Zielobjekt kann eine bestehende DDE-Verbindung auch fr die bermittlung von Kommandozeichenfolgen an das Quellobjekt nutzen. Ein Quellobjekt kann mit mehreren Zielobjekten eine DDE-Verbindung unterhalten, ein Zielobjekt jedoch immer nur mit einem Quellobjekt. Eine DDE-Verbindung wird beendet, wenn das Zielobjekt oder das Quellobjekt seine Eigenschaft LinkMode auf vbLinkNone (0) setzt. Das Quellobjekt kann immer nur alle von ihm gehaltenen Verbindungen auf einmal beenden, nicht jedoch gezielt eine einzelne Verbindung zu einem bestimmten Zielobjekt. Die gewhnliche Reaktion auf das LinkClose-Ereignis besteht darin, die Zustandsvariable fr den Verbindungsstatus zu pflegen und gegebenenfalls dem Benutzer die Beendigung der DDEVerbindung mitzuteilen oder sonstwie anzuzeigen.
Beispiel

................................................... Beis piel

' im Modul des Zielobjekts Private Text1Verbunden As Boolean ... Text1.LinkMode = vbLinkNone ...

' DDE-Verbindung beenden

Sub Text1_LinkClose() Text1Verbunden = False MsgBox "DDE-Verbindung beendet" End Sub

230

LinkError- Ereignis

LinkError- Ereignis
Sub Form_LinkError(LinkErr As Integer) Sub MDIForm_LinkError(LinkErr As Integer) Sub Objekt_LinkError([Index As Integer], LinkErr As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


Form, Label, MDIForm, PictureBox, TextBox
Beschreibung

................................................... Bes c hreibung

Standardereignisse

Das LinkError-Ereignis signalisiert der Quelle und dem Ziel einer DDE-Verbindung, dass ein Fehler whrend der DDE-Kommunikation aufgetreten ist. Der Parameter LinkErr bermittelt eine Fehlernummer, die Aufschluss ber die Art des Fehlers gibt. Der Aufzhlungstyp LinkErrorConstants definiert dafr die folgenden Konstanten: Fehler vbWrongFormat (1) Beschreibung Die andere Anwendung hat Daten im falschen Format angefordert. Dieser Fehler kann mehrmals aufeinander folgend auftreten, whrend Visual Basic versucht, ein Format zu finden, das von der anderen Anwendung erkannt wird Das Zielobjekt hat versucht, die Kommunikation fortzusetzen, nachdem die Quelle die Verbindung bereits geschlossen hat. Die Quelle kann nicht mehr als 128 Verbindungen handhaben. Zielobjekt einer automatischen Verknpfung oder eines expliziten LinkRequest-Aufrufs konnte nicht aktualisiert werden. Oder: Quellobjekt konnte durch LinkPoke-Aufruf nicht aktualisiert werden.

vbSourceClosed (6) vbTooManyLinks (7) vbDataTransferFailed (8)

Der Parameter Index gibt den Index des signalisierenden Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Eine DDE-Verbindung ermglicht die Verknpfung von Datenfeldern und die bermittlung von Kommandos zwischen einem Ziel und einer Quelle, die jeweils unterschiedlichen Prozessen (lies: Laufzeitinstanzen von Anwendungen) angehren. Zielobjekt ist ein Steuerelement, Quellobjekt ein Formular. Das Zielobjekt initiiert den Verbindungsaufbau. Bei einer DDE-Verknpfung liefert gewhnlich das Quellobjekt den Wert eines seiner Elemente (lies: Steuerelemente) an das Zielobjekt, obwohl eine Aktualisierung auch in der anderen Richtung mglich ist, wenn die Methode LinkPoke zum Einsatz kommt. Ein Zielobjekt kann eine bestehende DDE-Verbindung auch fr die bermittlung von Kommandozeichenfolgen an das Quellobjekt nutzen. Ein Quellobjekt kann mit mehreren Zielobjekten eine DDE-Verbindung unterhalten, ein Zielobjekt jedoch immer nur mit einem Quellobjekt. Das LinkError-Ereignis sollte eigentlich nicht auftreten, wenn Ziel und Quelle gut aufeinander abgestimmt sind. Tritt es dennoch auf, ist die Situation nach einer Analyse der Fehlerursache hufig noch zu retten, etwa indem nicht mehr bentigte Verbindungen geschlossen werden, ein anderes Datenformat benutzt oder ein Versuch unternommen wird, eine gestorbene Verbindung erneut zu erffnen.

23 1

Standardereignisse

LinkExecute- Ereignis
Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) Sub MDIForm_LinkExecute(CmdStr As String, Cancel As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


Form, MDIForm
Beschreibung

................................................... Bes c hreibung

Standardereignisse

Das LinkExecute-Ereignis tritt im Verlauf einer DDE-Verbindung aufseiten des Quellobjekts auf und bermittelt eine Kommandozeichenfolge des Zielobjekts.
Anwendung

................................................... Anwendung

Eine DDE-Verbindung ermglicht die Verknpfung von Datenfeldern und die bermittlung von Kommandos zwischen einem Ziel und einer Quelle, die jeweils unterschiedlichen Prozessen (lies: Laufzeitinstanzen von Anwendungen) angehren. Zielobjekt ist ein Steuerelement, Quellobjekt ein Formular. Das Zielobjekt initiiert den Verbindungsaufbau. Bei einer DDE-Verknpfung liefert gewhnlich das Quellobjekt den Wert eines seiner Elemente (lies: Steuerelemente) an das Zielobjekt, obwohl eine Aktualisierung auch in der anderen Richtung mglich ist, wenn die Methode LinkPoke zum Einsatz kommt. Ein Zielobjekt kann eine bestehende DDE-Verbindung auch fr die bermittlung von Kommandozeichenfolgen an das Quellobjekt nutzen. Ein Quellobjekt kann mit mehreren Zielobjekten eine DDE-Verbindung unterhalten, ein Zielobjekt jedoch immer nur mit einem Quellobjekt. Zum Versand eines DDE-Kommandos ruft das Zielobjekt seine LinkExecute-Methode unter Angabe einer Kommandozeichenfolge auf. Empfnger des Kommandos ist immer das Quellobjekt, nicht das fr die Verknpfung benannte Datenelement. Die gewhnliche Reaktion auf das LinkExecute-Ereignis besteht in der Interpretation des Kommandos. Da es keinen feststehenden Kommandosatz fr DDE-Verbindungen gibt, unterliegt die Ausgestaltung der Kommandos sowie deren Interpretation allein der Fantasie des Programmierers. Wenn die Behandlungsroutine mit dem Kommando etwas anfangen kann, muss sie den Parameter Cancel explizit auf False setzen, sonst tritt in der Zielanwendung der Laufzeitfehler 285: Andere Anwendung fhrt die DDE-Methode oder -Operation nicht aus auf.
Beispiel

................................................... Beis piel

' Im Modul des Zielobjekts ... Text1.LinkExecute("Beenden") ... ' Im Modul der Quellobjekts Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) If CmdStr = "Beenden" Then Cancel = False ' Kommando erkannt! Unload Me ' Kommando ausfhren End If End Sub

232

LinkNotify- Ereignis

LinkNotify- Ereignis
Sub Objekt_LinkNotify([Index As Integer])
Betroffene Objekte

................................................... Betro ffene Objekte


Label, PictureBox, TextBox
Beschreibung

................................................... Bes c hreibung

Das LinkNotify-Ereignis signalisiert dem Zielobjekt einer im Modus Manuell mit Benachrichtigung aufgebauten DDE-Verknpfung, dass sich der Inhalt des Datenlieferanten aufseiten der Quelle gendert hat. Zur Auffrischung seiner Daten kann das Zielobjekt seine Methode LinkRequest ausfhren.
Anwendung

Standardereignisse

................................................... Anwendung

Eine DDE-Verbindung ermglicht die Verknpfung von Datenfeldern und die bermittlung von Kommandos zwischen einem Ziel und einer Quelle, die jeweils unterschiedlichen Prozessen (lies: Laufzeitinstanzen von Anwendungen) angehren. Zielobjekt ist ein Steuerelement, Quellobjekt ein Formular. Das Zielobjekt initiiert den Verbindungsaufbau. Bei einer DDE-Verknpfung liefert gewhnlich das Quellobjekt den Wert eines seiner Elemente (lies: Steuerelemente) an das Zielobjekt, obwohl eine Aktualisierung auch in der anderen Richtung mglich ist, wenn die Methode LinkPoke zum Einsatz kommt. Ein Zielobjekt kann eine bestehende DDE-Verbindung auch fr die bermittlung von Kommandozeichenfolgen an das Quellobjekt nutzen. Ein Quellobjekt kann mit mehreren Zielobjekten eine DDE-Verbindung unterhalten, ein Zielobjekt jedoch immer nur mit einem Quellobjekt. Ein Zielobjekt hat beim Aufbau einer DDE-Verbindung fr eine Verknpfung die Wahl zwischen drei Arbeitsmodi: Automatisch, Manuell oder Manuell mit Benachrichtigung. Im Modus Automatisch findet eine automatische Synchronisation zwischen Quelle und Ziel statt. Im Modus Manuell kann das Zielobjekt die Synchronisation durch explizite Aufrufe der Methode LinkRequest nach Bedarf aufrechterhalten. Im Modus Manuell mit Benachrichtigung erhlt das Zielobjekt jedes Mal ein LinkNotify-Ereignis, wenn sich der verknpfte Wert aufseiten der Quelle ndert. Die Behandlungsroutine fr das Ereignis wird im Allgemeinen einen LinkRequest-Aufruf enthalten, der die Synchronisation betreibt. Ein Quellobjekt kann durch Aufruf der LinkSend-Methode des als Datenlieferant fr eine DDEVerknpfung fungierenden Steuerelementobjekts LinkNotify-Ereignisse auch auer der Reihe anstoen, was beispielsweise nach Manipulation der Picture-Eigenschaft eines Bildfelds erforderlich ist.

LinkOpen- Ereignis
Sub Form_LinkOpen(Cancel As Integer) Sub MDIForm_LinkOpen(Cancel As Integer) Sub Objekt_LinkOpen([Index As Integer], Cancel As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


Form, Label, MDIForm, PictureBox, TextBox
Beschreibung

................................................... Bes c hreibung

Das LinkOpen-Ereignis signalisiert den Aufbau einer DDE-Verbindung durch das Zielobjekt. Es tritt auf beiden Seiten der Verbindung auf. Der Ergebnisparameter Cancel hat als Voreinstellung den Wert 0. Zielobjekt und Quellobjekt haben die Mglichkeit, die Verbindung abzulehnen, indem sie Cancel auf einen Wert ungleich 0 setzen.

23 3

Standardereignisse

Anwendung

................................................... Anwendung

Standardereignisse

Eine DDE-Verbindung ermglicht die Verknpfung von Datenfeldern und die bermittlung von Kommandos zwischen einem Ziel und einer Quelle, die jeweils unterschiedlichen Prozessen (lies: Laufzeitinstanzen von Anwendungen) angehren. Zielobjekt ist ein Steuerelement, Quellobjekt ein Formular. Das Zielobjekt initiiert den Verbindungsaufbau. Bei einer DDE-Verknpfung liefert gewhnlich das Quellobjekt den Wert eines seiner Elemente (lies: Steuerelemente) an das Zielobjekt, obwohl eine Aktualisierung auch in der anderen Richtung mglich ist, wenn die Methode LinkPoke zum Einsatz kommt. Ein Zielobjekt kann eine bestehende DDE-Verbindung auch fr die bermittlung von Kommandozeichenfolgen an das Quellobjekt nutzen. Ein Quellobjekt kann mit mehreren Zielobjekten eine DDE-Verbindung unterhalten, ein Zielobjekt jedoch immer nur mit einem Quellobjekt. Voraussetzung fr einen erfolgreichen Verbindungsaufbau ist, dass die Eigenschaft LinkMode des Quellobjekts bereits beim Entwurf auf den Wert vbLinkSource gesetzt wurde. Die Eigenschaften LinkTopic und LinkItem des Zielobjekts spezifizieren das Quellobjekt sowie das Verknpfungselement. Der Wert fr LinkTopic setzt sich aus einem Anwendungsnamen und einem Thema zusammen und hat die Syntax:
Objekt.LinkTopic = "Anwendung|Thema"

Der Anwendungsname entspricht dem Wert der Eigenschaft App.Title aufseiten der Quelle und stimmt meist mit dem Namen der EXE-Datei des Programms berein, jedoch nicht immer. Als Thema ist der Wert der LinkTopic-Eigenschaft des Quellobjekts anzugeben, der meist (jedoch nicht zwingend) mit dem Fenstertitel des Formulars bereinstimmt. Fr die Erffnung einer reinen Kommandoverbindung reicht es, nur die LinkTopic-Eigenschaft des Zielobjekts geeignet zu setzen. Fr die Erffnung einer Datenverknpfung zu einem Steuerelement des Quellobjekts muss weiterhin die LinkItem-Eigenschaft auf den Bezeichner des Steuerelements gesetzt werden:
Objekt.LinkItem = "Element"

Um beispielsweise mit dem Steuerelement Text1 des Formulars Form1 (lies: dessen LinkTopicEigenschaft den Wert Form1 hat) eines Programms, dessen Anwendungsname DDE-Demo ist, eine Verknpfung aufzubauen, lautet die Verbindungsinformation fr das Zielobjekt ZielElement:
ZielElement.LinkTopic = "DDE-Demo|Form1" ZielElement.LinkItem = "Text1"

Der Verbindungsaufbau erfolgt, sobald die Eigenschaft LinkMode des Zielobjekts auf einen Wert ungleich 0 gesetzt wird:
ZielElement.LinkMode = vbLinkAutomatic

Umgekehrt erfolgt der Verbindungsabbau, sobald die Eigenschaft LinkMode des Zielobjekts oder des Quellobjekts auf den Wert 0 gesetzt wird:
ZielElement.LinkMode = vbLinkNone

ber eine bereits bestehende DDE-Verknpfung lassen sich gleichfalls Kommandos an das Quellobjekt schicken, meist erfolgt der Versand von Kommandos aber ber eine eigene Kommandoverbindung. Aufseiten des Ziels tritt dann ein weiteres Zielobjekt in Aktion, ohne dass dies an der Logik der Quelle etwas ndert. Reine Kommandoverbindungen werden im Verbindungsmodus Manuell oder Manuell mit Benachrichtigung geffnet.

234

LinkOpen- Ereignis

ZielElement.LinkMode = vbLinkManual

oder
ZielElement.LinkMode = vbLinkNotify

Fr reine Kommandoverbindungen macht es keinen Unterschied, welcher der beiden Verbindungsmodi benutzt wird, fr eine Datenverknpfung jedoch schon. Im Modus Manuell muss das Zielobjekt einer Datenverknpfung jede Aktualisierung der Verknpfungsinformation explizit durch einen Aufruf der Methode LinkRefresh anleiern, ohne zu wissen, ob sich aufseiten der Quelle etwas gendert hat oder nicht. Im Modus Manuell mit Benachrichtigung schickt das Quellobjekt dem Zielobjekt dagegen bei jeder nderung das Ereignis LinkNotifiy, woraufhin dieses mit LinkRefresh reagieren kann, aber nicht muss.
Beispiel

Standardereignisse

................................................... Beis piel

Das folgende Codefragment zeigt prototypisch den Aufbau einer DDE-Verknpfung mit einem Steuerelement in einer anderen Anwendung:
Static ZielementVerbunden As Boolean ... If Not ZielementVerbunden Then ZielElement.LinkTopic = "DDE-Demo|Form1" ' Anwendung und Formular ZielElement.LinkItem = "Text1" ' Quelle festlegen! On Error GoTo StarteAnwendung ZielElement.LinkMode = vbLinkAutomatic ZielElementVerbunden = True End If ... Exit Sub StarteAnwendung: MsgBox (Err.Description) ...

Hier der gleiche Code, wenn die Verbindung mit der Zelle B5 einer Excel-Tabelle namens Tabelle1.xls aufgebaut werden soll:
Static ZielementVerbunden As Boolean ... If Not ZielementVerbunden Then ZielElement.LinkTopic = "Excel|Tabelle1.xls" ' Anwendung und Formular ZielElement.LinkItem = "Z2S5" ' Quelle festlegen! On Error GoTo StarteAnwendung ZielElement.LinkMode = vbLinkAutomatic ZielElementVerbunden = True End If ... Exit Sub StarteAnwendung: If Shell("C:\Microsoft Office\Office\Excel.exe C:\Tabelle1.xls") Then Resume Else

23 5

Standardereignisse

Exit Sub End If End Sub


Verwandte Themen

................................................... Verwandte Them en

DDE-Verbindungen (S. 495)

Load- Ereignis
Sub Objekt_Load()

Standardereignisse

Betroffene Objekte

................................................... Betro ffene Objekte


Form, MDIForm, PropertyPage
Beschreibung

................................................... Bes c hreibung

Das Load-Ereignis folgt auf das Initialize-Ereignis und tritt als zweites Ereignis im noch jungen Leben eines Formulars auf. Zu diesem Zeitpunkt wird das Formularobjekt zwar noch nicht angezeigt, ist aber bereits vollstndig konstruiert und ermglicht die sichere Initialisierung von Steuerelementen und globalen Variablen sowie das Laden von Ressourcen. Im Gegensatz zum Initialize-Ereignis kann das Load-Ereignis im Leben eines Objekts mehrmals auftreten.
Anwendung

................................................... Anwendung

Fr das Eintreten eines Load-Ereignisses kommen drei Anlsse in Betracht: Erstens, das Formular ist als Startobjekt einer Anwendung spezifiziert. Zweitens, das Formular wird durch ein anderes Objekt explizit mittels einer Load-Anweisung geladen. Drittens, ein anderes Objekt referiert auf ein Element, eine Eigenschaft oder eine Methode des ungeladenen Formulars. Fr den zweiten und dritten Fall muss die verwendete Objektvariable mit dem Schlsselwort New deklariert oder zuvor ein Unload-Aufruf fr das Formular erfolgt sein. Auch erfolgt keine automatische Anzeige des Formulars. Vielmehr ist es der Show-Aufruf, der ein geladenes oder ungeladenes Formular zur Anzeige bringt. Es reicht somit zu schreiben:
Private MeinForm As New Form1 ... ' in einer Funktion/Prozedur MeinForm.Show ' Ldt das Formular und zeigt es an

Wird ein Formular geladen, dessen MDIChild-Eigenschaft beim Entwurf auf True gesetzt wurde, ldt Visual Basic implizit auch das bergeordnete MDI-Formular, falls dieses noch nicht geladen ist. Fr ein untergeordnetes Formular ist kein Show-Aufruf erforderlich, da dieses nach dem Load-Ereignis automatisch angezeigt wird.
Hinweis

................................................... Hinweis
Von MsgBox oder InputBox angezeigte Dialogfelder erfordern weder eine Deklaration noch einen Load- oder Show-Aufruf.
Beispiel

................................................... Beis piel

Der folgende Code demonstriert den Unterschied zwischen dem Load- und dem InitializeEreignis, indem es die Ereignisse durch MsgBox-Aufrufe gewissermaen sichtbar macht. Das Formular enthlt ein Steuerelement namens Text1 und initialisiert dieses whrend der Behandlung von Initialize (!). Beim Start der Anwendung kommen nacheinander das Initialize- und das

236

M ouseDow n- Ereignis und M ouseUp- Ereignis

Load-Ereignis zum Zuge. Ein Klick auf das Formular entldt dieses zunchst, gibt eine Meldung aus und ldt es dann gleich wieder. Wie man sieht, hat Text1 danach seine Initialisierung vergessen.
' Demo fr den Unterschied zwischen dem Load- und Initialize-Ereignis Private Sub Form_Initialize() MsgBox "Form_Initialize" Text1 = "Initialisiert" End Sub Private Sub Form_Load() MsgBox "Form_Load" End Sub Private Sub Form_Click() Unload Me MsgBox "Formular entladen" Show End Sub
Verwandte Ereignisse

Standardereignisse

................................................... Verwandte Ereignis s e


Initialize, Terminate, Unload

MouseDown- Ereignis und MouseUp- Ereignis


Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Sub MDIForm_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Sub Objekt_MouseDown([Index As Integer,] Button As Integer, _ Shift As Integer, X As Single, Y As Single) Sub Form_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Sub MDIForm_MouseUp (Button As Integer, Shift As Integer, _ X As Single, Y As Single) Sub Objekt_MouseUp ([Index As Integer,] Button As Integer, _ Shift As Integer, X As Single, Y As Single)
Betroffene Objekte

................................................... Betro ffene Objekte


Adodc, Animation, CheckBox, CommandButton, DataGrid, DataList, DataRepeater, DateTimePicker, DBCombo, DBGrid, DBList, DirListBox, FileListBox, Form, Grid, HScrollBar Image, ListBox, ListView, MDIForm, MonthView, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RichTextBox, Slider, StatusBar, TabStrip, TextBox, UpDown, UserControl, UserDocument, VScrollBar
Beschreibung

................................................... Bes c hreibung

Das MouseDown-Ereignis signalisiert einem Objekt, dass der Benutzer ber seinem Fenster eine Maustaste niedergedrckt hat, whrend das MouseUp-Ereignis das Loslassen derselben verkn-

23 7

Standardereignisse

Standardereignisse

det. Im Gegensatz zu den Ereignissen Click und DblClick bermitteln MouseDown und MouseUp gengend Informationen, um die aktuelle Mausposition, die verantwortliche Maustaste sowie auch den Status der Funktionstasten ermitteln zu knnen. Der im Parameter Button bergebene Bitvektor identifiziert die benutzte Maustaste. Es ist immer nur ein Bit gesetzt: Bit 0 steht fr die linke Maustaste, Bit 1 fr die rechte und Bit 2 fr die mittlere. Der Aufzhlungstyp MouseButtonConstants definiert drei Konstanten dafr, die sich als Masken fr die Abfrage der Maustaste benutzen lassen: vbLeftButton (1), vbRightButton (2) und vbMiddleButton (4). Durch Auswertung des Shift-Parameters, gleichfalls ein Bitvektor lsst sich ermitteln, ob und welche Funktionstasten bei Eintritt des Ereignisses gedrckt waren. Bit 0 steht fr (Umschalt), Bit 1 fr (Strg) und Bit 2 fr (Alt). Der Aufzhlungstyp ShiftConstants definiert drei Konstanten dafr, die sich als Masken fr die Abfrage der Funktionstasten benutzen lassen: vbShift (1), vbCtrl (2) und vbAlt (4). Die Werte der Parameter X und Y geben die aktuelle Mausposition zum Zeitpunkt des Ereignisses als Koordinaten im aktuellen Koordinatensystem des Objekts an. Der Parameter Index gibt den Index des betroffenen Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Ein hufiges Problem besteht darin, dass es dem Benutzer mglich sein soll, mit der Maus einen Bereich auszuwhlen oder die Gre eines Elements zu verndern (vgl. Drag&Drop). In diesem Fall muss die Programmlogik so ausgelegt sein, dass das MouseDown-Ereignis den Start der Operation, die bis zum MouseUp-Ereignis auftretenden MouseMove-Ereignisse den Verlauf der Operation und das MouseUp-Ereignis schlielich den Abschluss der Operation steuern. Der Zusammenhang lsst sich durch Einsatz einer geeignet zu pflegenden Zustandsvariable herstellen. Reine Positionsverschiebungen lassen sich auch allein auf Basis des MouseMove-Ereignisses bewerkstelligen. Drckt der Benutzer mehrere Maustasten gleichzeitig, sieht das Objekt fr jede der Maustasten ein eigenes Ereignis. Wenn es eine Rolle spielt, ob nur eine oder mehrere Maustasten gedrckt bzw. losgelassen wurden, mssen die Behandlungsroutinen auch in diesem Fall eine Zustandsvariable pflegen. Da in dem Bitvektor Shift mehrere Bits gesetzt sein knnen, ist zur Abfrage einer einzelnen Funktionstaste eine And-Operation mit der Maskenkonstanten erforderlich:
If Shift And vbShift Then

Kombinationen von Funktionstasten lassen sich einzeln oder durch Addition der entsprechenden Maskenkonstanten ermitteln:
If (Shift And (vbShift + vbAlt)) = (vbShift + vbAlt) Then

bzw.
If (Shift And vbShift) And (Shift And vbAlt) Then

Die Klammerung ist hier wichtig, da And zweimal als bitweiser und einmal als logischer Operator auftritt.
Warnungen

................................................... Wa rnungen
Fr Verwirrung sorgt oft die Behandlung von Mausereignissen fr Steuerelemente. Da Steuerelemente ein unvernderliches Koordinatensystem mit Ursprung in der linken oberen Ecke und der Maeinheit Twips benutzen, beziehen sich die von den Ereignissen MouseDown und MouseUp gelieferten Koordinaten auf dieses Koordinatensystem, auch wenn im bergeordneten Formular

238

M ouseM ove- Ereignis

ein anderes Koordinatensystem herrscht. Fr die Umrechnung von Koordinaten zwischen verschiedenen Koordinatensystemen lassen sich die Methoden ScaleX und ScaleY einsetzen. Das Eintreffen des MouseUp-Ereignisses ist nicht in jedem Falle garantiert. In speziellen Situationen kann es auch einmal unter den Tisch fallen beispielsweise im Zuge der Ausfhrung der Stop-Anweisung oder wenn die Programmausfhrung einen Unterbrechungspunkt erreicht.
Hinweis

................................................... Hinweis
Beachten Sie, dass jedes MouseUp-Ereignis ein Click-Ereignis sowie gegebenenfalls ein DblClickEreignis nach sich zieht.
Tipp

Standardereignisse

................................................... Tipp

Eine geeignete Logik bei der Behandlung des MouseMove-Ereignisses kann die Behandlung von MouseDown und MouseUp obsolet machen.
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Beis piel ................................................... Verwandte Them en

Click, DblClick, KeyDown, KeyUp, MouseMove


Beispiel

Vgl. das Beispiel in MouseMove-Ereignis (S. 239).


Verwandte Themen

Gummiband Bereiche interaktiv auswhlen (S. 492)

MouseMove- Ereignis
Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Sub MDIForm_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Sub Objekt_MouseMove([Index As Integer,] Button As Integer, _ Shift As Integer, X As Single, Y As Single)
Betroffene Objekte

................................................... Betro ffene Objekte


Adodc, Animation, CheckBox, CommandButton, DataGrid, DataList, DataRepeater, DateTimePicker, DBCombo, DBGrid, DBList, DirListBox, FileListBox, Form, Grid, HScrollBar Image, ListBox, ListView, MDIForm, MonthView, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RichTextBox, Slider, StatusBar, TabStrip, TextBox, UpDown, UserControl, UserDocument, VScrollBar
Beschreibung

................................................... Bes c hreibung

Whrend die Ereignisse MouseDown und MouseUp nur dann auftreten, wenn der Benutzer die Maustasten bettigt, tritt das MouseMove-Ereignis auf, sobald der Benutzer die Maus im Fensterbereich des Objekts bewegt. Im Gegensatz zu den Ereignissen Click und DblClick bermittelt MouseMove Informationen, die einer Behandlungsroutine Aufschluss ber die aktuelle Mausposition sowie den Status der Maus- und Funktionstasten geben. Der im Parameter Button bergebene Bitvektor identifiziert die benutzten Maustasten. Es knnen auch mehrere Bits gesetzt sein: Bit 0 steht fr die linke Maustaste, Bit 1 fr die rechte und Bit 2 fr die mittlere. Der Aufzhlungstyp MouseButtonConstants definiert drei Konstanten

23 9

Standardereignisse

Standardereignisse

dafr, die sich als Masken fr die Abfrage der Maustaste benutzen lassen: vbLeftButton (1), vbRightButton (2), vbMiddleButton (4). Durch Auswertung des Shift-Parameters, gleichfalls ein Bitvektor lsst sich ermitteln, ob und welche Funktionstasten bei Eintritt des Ereignisses gedrckt waren. Bit 0 steht fr (Umschalt), Bit 1 fr (Strg) und Bit 2 fr (Alt). Der Aufzhlungstyp ShiftConstants definiert drei Konstanten dafr, die sich als Masken fr die Abfrage der Funktionstasten benutzen lassen: vbShift (1), vbCtrl (2), vbAlt (4). Die Werte der Parameter X und Y geben die aktuelle Mausposition zum Zeitpunkt des Ereignisses als Koordinaten im aktuellen Koordinatensystem des Objekts an. Der Parameter Index gibt den Index des betroffenen Steuerelements wieder, wenn es Element eines Steuerelemente-Arrays ist.
Anwendung

................................................... Anwendung

Eine Behandlung des MouseMove-Ereignisses ist sinnvoll, wenn die Bewegung des Mauszeigers im Verlauf einer Operation von Interesse ist zum Beispiel fr die Anzeige eines visuellen Feedbacks fr den Benutzer, wenn dieser eine Ziehoperation mit der Maus durchfhrt.
Tipp

................................................... Tipp

Da das Formularobjekt (aber auch groflchige Steuerelemente) im Allgemeinen einer stndigen Flut von MouseDown-Ereignissen ausgesetzt ist, sollten Sie bei Implementierung einer Behandlungsroutine fr dieses Ereignis stets auf gute Laufzeiteigenschaften achten, damit die Reaktivitt der Benutzerschnittstelle keine Beeintrchtigung erfhrt. Am besten, Sie fragen gleich zu Beginn der Routine eine Zustandsvariable ab, deren Wert ber die Notwendigkeit einer ernsthaften Behandlung mit Auswertung der Ereignisparameter entscheidet. Damit vermeiden Sie vorauseilende Operationen und Berechnungen, deren Ergebnisse ohnehin erst im Verlauf einer konkreten Mausoperation von Interesse sind.
Beispiel

................................................... Beis piel

Das folgende kleine Programm wertet die Ereignisse MouseDown, MouseUp und MouseMove aus, um eine Ziehoperation fr ein Steuerelement zu implementieren, bei der das Steuerelement (im Gegensatz zur Drag&Drop-Operation) sichtbar bleibt. Das Szenario besteht schlicht aus einem Formular und einem Steuerelement namens figur. Um die Angelegenheit realistischer zu machen, geht die Implementation erschwerend davon aus, dass in Formular und Steuerelement unterschiedliche Koordinatensysteme gelten.
Private StartX As Single Private StartY As Single Private Sub Form_Load() ScaleMode = vbPixels End Sub Private Sub figur_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) StartX = X ' Startkoordinaten merken, Operation einleiten StartY = Y End Sub Private Sub figur_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single)

240

OLECompleteDrag- Ereignis

If StartX Then figur.Left = figur.Left ScaleX((StartX X), vbTwips, vbPixels) figur.Top = figur.Top ScaleY((StartY Y), vbTwips, vbPixels) End If End Sub Private Sub figur_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If StartX Then ' Steuerelement ablegen figur.Left = figur.Left ScaleX((StartX X), vbTwips, vbPixels) figur.Top = figur.Top ScaleY((StartY Y), vbTwips, vbPixels) StartX = 0 End If End Sub

Standardereignisse

Ein Wort zu der nicht ganz trivialen Strategie, die der Code verfolgt. Die globale Variable StartX nimmt eine Doppelfunktion ein: Sie ist Zustandsvariable fr die Steuerung der MouseMove-Behandlung und bunkert gleichzeitig den X-Offset des Mauszeigers relativ zum Ursprung des Steuerelements. StartY speichert den Y-Offset. Beide Werte beziehen sich auf den Beginn der Ziehoperation. Da alle von MouseMove gelieferten Koordinaten auf das Koordinatensystem des Steuerelements bezogen sind, gilt es, bei jedem MouseMove-Ereignis die Position des Steuerelements so zu verndern, dass der Offset des Mauszeigers im Steuerelement wieder hergestellt wird. Die Distanz fr die Verschiebung ergibt sich somit als Differenz zwischen dem Offset und der aktuellen Mausposition im Steuerelement. Da im Formular ein anderes Koordinatensystem als im Steuerelement gilt, muss die Distanz fr die Verschiebung des Steuerelements im Formular noch in dessen Koordinatensystem umgerechnet werden.
Verwandte Befehle

................................................... Verwa ndte Befehle ................................................... Verwandte Them en

Click, DblClick, KeyDown, KeyUp, MouseDown, MouseUp


Verwandte Themen

Gummiband Bereiche interaktiv auswhlen (S. 492)

OLECompleteDrag- Ereignis
Private Sub Objekt_OLECompleteDrag(Effect As Long)
Betroffene Objekte

................................................... Betro ffene Objekte


Animation, CoolBar, DataList, DateTimePicker, DBCombo, DBList, DirListBox, FileListBox, FlatScrollBar, Grid, Image, ImageCombo, ListBox, ListView, MaskEdBox, MSChart, MSFlexGrid, MSHFlexGrid, OLE, PictureBox, PropertyPage, RichTextBox, SSTab, TabStrip, TextBox, TreeView, ToolBar, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das OLECompleteDrag-Ereignis tritt als letztes Ereignis in der Ereignisfolge einer OLEDrag&Drop-Operation auf, wenn die Quellkomponente im manuellen Modus (OLEDragMode = vbDragManual) betrieben wird. Es teilt ihr mit, welche Operation die Zielkomponente auf das OLEDragDrop-Ereignis hin letztlich durchgefhrt hat vorausgesetzt, diese hat den Parameter Effect entsprechend gepflegt. Vom Wert her ist Effect ein Bitvektor, dessen einzelne Bits fr die mglichen Operationen stehen. Ist kein Bit gesetzt, fand keine Operation statt. Der Aufzhlungstyp OLEDropEffectConstants definiert eine Reihe von Konstanten fr die einzelnen Opera-

241

Standardereignisse

tionen: vbDropEffectNone (0) steht fr keine Operation, vbDropEffectCopy (1) fr Kopieroperation und vbDropEffectMove (2) fr Verschiebeoperation.
Anwendung

................................................... Anwendung

Standardereignisse

Zum Abschluss einer OLE-Drag&Drop-Operation kann aufseiten der Quellkomponente eine Nachbereitung erforderlich sein, beispielsweise wenn eine Verschiebeoperation stattgefunden hat und die Komponente den verschobenen Inhalt nicht von alleine lscht oder gegebenenfalls belegte Ressourcen nicht freigibt. Falls die Quellkomponente in einer der Behandlungsroutinen fr OLEDragStart oder OLEGiveFeedBack einen eigenen Mauscursor setzt, um dem Benutzer das Ergebnis der Operation besser vor Augen zu bringen, muss in jedem Fall eine Behandlung von OLECompleteDrag erfolgen, um den ursprnglichen Mauscursor wieder herzustellen.
Warnung

................................................... Wa rnung

Auch wenn der Visual Basic Editor das Ereignis bei vielen Steuerelementen und Objekten anbietet (so beispielsweise fr Form und MMControl), betrifft es im Allgemeinen nur solche Objekte, die darauf eingerichtet sind, als Quellkomponente in einer OLE-Drag&Drop-Operation zu fungieren. Zudem tritt das Ereignis auch bei diesen Objekten nur im manuellen Modus auf, das heit, wenn die Eigenschaft OLEDragMode den Wert vbOLEDragManual (1) hat.
Beispiel

................................................... Beis piel

Private Sub Quelle_OLECompleteDrag(Effect As Long) Screen.MouseIcon = AltesScreenIcon ' Alte Form setzen Screen.MousePointer = AlterScreenPointer ' Alten Zeiger setzen End Sub
Verwandte Ereignisse

................................................... Verwandte Ereignis s e


OLEDragDrop, OLEDragOver, OLEGiveFeedback, OLESetData, OLEStartDrag
Verwandte Themen

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

OLEDragDrop- Ereignis
Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, X As Single, Y As Single) Private Sub Objekt_OLEDragDrop([Index As Integer,] Data As DataObject, _ Effect As Long, Button As Integer, Shift As Integer, X As Single, _ Y As Single)
Betroffene Objekte

................................................... Betro ffene Objekte


Animation, CheckBox, CommandButton, CoolBar, DataList, DateTimePicker, DBCombo, DBList, DirListBox, FileListBox, FlatScrollBar, Frame, Form, Grid, Image, ImageCombo, ListBox, ListView, MaskEdBox, MDIForm, MMControl, MSChart, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RichTextBox, Slider, SSTab, StatusBar, TabStrip, TextBox, TreeView, ToolBar, UpDown, UserControl, UserDocument

242

OLEDragDrop- Ereignis

Beschreibung

................................................... Bes c hreibung

Das OLEDragDrop-Ereignis bedeutet der Zielkomponente einer OLE-Drag&Drop-Operation, dass der Benutzer den Inhalt abgelegt hat und die gewhlte Operation ausfhren will. Der Parameter Effect ist ein von der Quellkomponente in Antwort auf OLEStartDrag oder OLEGiveFeedback gesetzter Bitvektor, der ausdrckt, welche Operationen diese untersttzt. Der Aufzhlungstyp OLEDropEffectConstants definiert eine Reihe von Konstanten fr die einzelnen Operationen: vbDropEffectNone (0) steht fr keine Operation, vbDropEffectCopy (1) fr Kopieroperation und vbDropEffectMove (2) fr Verschiebeoperation. Button ist gleichfalls ein Bitvektor, der den Zustand der Maustasten zum Zeitpunkt des Ereignisses wiedergibt. Der Aufzhlungstyp MouseButtonConstants definiert dafr die Maskenkonstanten vbLeftButton (1), vbRightButton (2) und vbMiddleButton (4). Auch Shift ist ein Bitvektor, der ausdrckt, welche Funktionstasten der Benutzer zum Zeitpunkt des Ereignisses gedrckt hlt. Der Aufzhlungstyp ShiftConstants definiert dafr die Maskenkonstanten vbShift (1), vbCtrl (2) und vbAlt (4). X und Y enthalten die aktuelle Position des Mauszeigers zum Zeitpunkt des Ereignisses im Koordinatensystem der Zielkomponente. Der Parameter Data verweist auf ein Objekt vom Typ DataObject, das als Container fr den zu bermittelnden Inhalt fungiert und Informationen ber die untersttzten Inhaltsformate bereitstellt.
Anwendung

Standardereignisse

................................................... Anwendung

Bevor eine Zielkomponente mit der Ausfhrung einer OLE-Drag&Drop-Operation beginnen kann, ist eine genauere Analyse der Situation erforderlich. Erstens gilt es, anhand des Zustands der Funktions- und Maustasten (Shift und Button) herauszufinden, welche Operation der Benutzer ausfhren will. Zweitens ist zu klren, ob die Quellkomponente diese Operation auch untersttzt (Effect). Drittens empfiehlt sich eine Analyse des Datenformats (Data.GetFormat), in dem der bermittelte Inhalt vorliegt das ist zwar kein Muss, erleichtert aber die Sache, wenn die Zielkomponente mit mehreren Datenformaten zurechtkommt oder das angebotene Format nicht untersttzt. Die folgende Tabelle gibt einen berblick ber die von Visual Basic untersttzten (teils auch automatisch erkannten) OLE-Formate und die dafr vom Aufzhlungstyp ClipBoardConstants definierten Konstanten. Formatkonstante vbCFText (1) vbCFBitmap (2) vbCFMetafile (3) vbCFEMetafile (14) vbCFDIB (8) vbCFPalette (9) vbCFFiles (15) vbCFRTF (-16639) Beschreibung des Formats Data enthlt Zeichenfolge im Format TXT Data enthlt Bitmap im Format BMP Data enthlt Grafik im Zwischendateiformat WMF Data enthlt Grafik im erweiterten Zwischendateiformat EMF Data enthlt gerteunabhngige Bitmap im DIB-Format Data enthlt Palette im Format PAL Data enthlt Files-Auflistung Data enthlt Zeichenfolge im RTF-Format

Standardm ige Datenformate fr Inhalte eines DataObject- Objekts

Vom Prinzip her lassen sich auch eigene Formate in einer OLE-Operation bermitteln (mehr zur Vorgehensweise im Abschnitt OLE-Drag&Drop, S. 501, des Praxisteils).

243

Standardereignisse

Wenn die Operation und das Format geklrt sind, kann der Zugriff auf den Inhalt mittels GetData erfolgen. Hat die Quellkomponente das spezifizierte Format nur angemeldet, ohne einen Inhalt dafr bereitzustellen der Aufruf dafr sieht so aus:
Data.SetData , Format

Standardereignisse

stt der GetData-Aufruf fr das Format implizit ein OLESetData-Ereignis aufseiten der Quellkomponente an, damit diese den Inhalt bereitstellen kann. GetData lst regulr den Laufzeitfehler 461 aus, wenn die Quellkomponente das durch den Parameter spezifizierte Format zwar angeblich untersttzt, aber letztlich keinen Inhalt dafr bereitstellen kann. Wenn der Inhalt erfolgreich entgegengenommen werden konnte, sollte die Zielkomponente der Quellkomponente ber den Parameter Effect die ausgefhrte Operation mitteilen. Die Mitteilung erreicht die Quellkomponente schlielich in Form des OLECompleteDrag-Ereignisses, das unmittelbar auf OLEDragDrop folgt.
Hinweis

................................................... Hinweis
Manche Steuerelemente deklarieren fr den Data-Parameter eine eigene Variante des Datentyps DataObject. Am Umgang mit dem Parameter ndert das nichts.
Tipp

................................................... Tipp

Da die Analyse des Maus- und Funktionstastenstatus auch bei der Behandlung des OLEDragOverEreignisses zu gebrauchen ist, empfiehlt es sich, die gesamte Logik dafr in eine eigene Prozedur zu packen.
Beispiel

................................................... Beis piel

Das folgende kleine Programm gibt den Inhalt einer Textdatei aus, die aus einem Fenster des Windows Explorer auf das Formular gezogen wird:
Private Sub Form_Load() OLEDropMode = vbOLEDropManual AutoRedraw = True End Sub Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, x As Single, Y As Single) Dim fs As Object Dim DOF As DataObjectFiles If (Effect And vbDropEffectCopy > 0) And Data.GetFormat(vbCFFiles) _ Then Set DOF = Data.Files If UCase(Right(DOF(1), 4)) = ".TXT" Then Set fs = CreateObject("Scripting.FileSystemobject") On Error Resume Next ' Falls Datei inzwischen unbekannt ... Print fs.OpenTextfile(DOF(1)).ReadAll ' Datei en bloc ausgeben End If Effect = vbDropEffectCopy Else Effect = vbDropEffectNone End If End Sub

244

OLEDragOver- Ereignis

Verwandte Ereignisse

................................................... Verwandte Ereignis s e


OLECompleteDrag, OLEDragOver, OLEGiveFeedback, OLESetData, OLEStartDrag
Verwandte Themen

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

OLEDragOver- Ereignis
Private Sub Form_OLEDragOver(Data As DataObject, _ Effect As Long, Button As Integer, Shift As Integer, X As Single, _ Y As Single, State As Integer) Private Sub Objekt_OLEDragOver([Index As Integer,] Data As DataObject, _ Effect As Long, Button As Integer, Shift As Integer, X As Single, _ Y As Single, State As Integer)
Betroffene Objekte

Standardereignisse

................................................... Betro ffene Objekte


Animation, CheckBox, CommandButton, CoolBar, DataList, DateTimePicker, DBCombo, DBList, DirListBox, FileListBox, FlatScrollBar, Frame, Form, Grid, Image, ImageCombo, ListBox, ListView, MaskEdBox, MDIForm, MMControl, MSChart, MSFlexGrid, MSHFlexGrid, OLE, OptionButton, PictureBox, ProgressBar, PropertyPage, RichTextBox, Slider, SSTab, StatusBar, TabStrip, TextBox, TreeView, ToolBar, UpDown, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das OLEDragOver-Ereignis bedeutet einer Komponente, dass sie als mgliches Ziel einer OLEDrag&Drop-Operation in Frage kommt oder nicht mehr in Frage kommt. Urschlich fr das Ereignis ist, dass der Mauscursor im Verlauf einer OLE-Drag&Drop-Operation in den Fensterbereich der Komponente eintritt, darin verschoben wird oder den Fensterbereich verlsst. Der Parameter Effect ist ein von der Quellkomponente in Antwort auf OLEStartDrag oder OLEGiveFeedback gesetzter Bitvektor, der ausdrckt, welche Operationen diese untersttzt. Der Aufzhlungstyp OLEDropEffectConstants definiert eine Reihe von Konstanten fr die einzelnen Operationen: vbDropEffectNone (0) steht fr keine Operation, vbDropEffectCopy (1) fr Kopieroperation und vbDropEffectMove (2) fr Verschiebeoperation. Button ist gleichfalls ein Bitvektor, der den Zustand der Maustasten zum Zeitpunkt des Ereignisses wiedergibt. Der Aufzhlungstyp MouseButtonConstants definiert dafr die Maskenkonstanten vbLeftButton (1), vbRightButton (2) und vbMiddleButton (4). Auch Shift ist ein Bitvektor, der besagt, welche Funktionstasten der Benutzer zum Zeitpunkt des Ereignisses gedrckt hlt. Der Aufzhlungstyp ShiftConstants definiert dafr die Maskenkonstanten vbShift (1), vbCtrl (2) und vbAlt (4). X und Y enthalten die aktuelle Position des Mauszeigers zum Zeitpunkt des Ereignisses im Koordinatensystem der Zielkomponente. Der Parameter Data verweist auf ein Objekt vom Typ DataObject, das als Container fr den zu bermittelnden Inhalt fungiert und Informationen ber die untersttzten Inhaltsformate bereitstellt. State zeigt an, dass die Maus: den Bereich der Komponente eben erst betreten hat (vbEnter); ihre Position innerhalb des Bereichs verndert hat (vbOver); den Bereich verlsst (vbLeave). Im letzten Fall haben die Parameter X und Y den Wert 0.

245

Standardereignisse

Anwendung

................................................... Anwendung

Standardereignisse

Die Aufgabe bei der Behandlung des OLEDragOver-Ereignisses besteht darin, eine genauere Analyse der Situation vorzunehmen und der Quellkomponente ber den Wert des ByRef-Parameters Effect mitzuteilen, welche der im Angebot stehenden Operationen der Benutzer voraussichtlich ausfhren wird. (Die Quellkomponente bekommt das Ergebnis mit dem unmittelbar folgenden OLEGiveFeedback-Ereignis zugestellt.) Die Analyse umfasst: erstens die Zustnde der Funktionsund Maustasten (Shift und Button), ber die der Benutzer die Operation auswhlt; zweitens die von der Quellkomponente untersttzten Operationen (Effect); drittens das Datenformat des Inhalts (Data.GetFormat). Eine Aufstellung der Datenformate finden Sie im Abschnitt OLEDragDrop-Ereignis. In besonderen Fllen wird auch eine Auswertung des State-Parameters ntig sein, beispielsweise wenn die Komponente das Betreten und Verlassen ihres Bereichs durch die Maus wie ein Hot-spot (lies: ber eine Vernderung der eigenen Darstellung) anzeigen soll.
Hinweis

................................................... Hinweis
Manche Steuerelemente deklarieren fr den Data-Parameter eine eigene Variante des Datentyps DataObject. Am Umgang mit dem Wert selbst ndert das nichts.
Warnung

................................................... Wa rnung

Eine Auswertung des Inhalts sollte auf dieses Ereignis hin tunlichst unterbleiben, da insbesondere bei spterer Bereitstellung des Inhalts im Rahmen von OLESetData der Aufwand betrchtlich sein kann und das System unntig belastet schlielich kommt ein OLEDragOver-Ereignis selten allein.
Tipp

................................................... Tipp

Nachdem die Analyse des Maus- und Funktionstastenstatus auch bei der Behandlung des OLEDragDrop-Ereignisses zu gebrauchen ist, empfiehlt es sich, die gesamte Logik dafr in eine eigene Prozedur zu packen.
Beispiel

................................................... Beis piel

Private Sub Form_OLEDragOver(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, x As Single, Y As Single, _ State As Integer) ' Stimmt das Datenformat? If Not (Data.GetFormat(vbCFBitmap) Or Data.GetFormat(vbCFDIB)) Then Effect = vbDropEffectNone ' leider nicht Exit Sub End If ' Hotspot-Darstellung If State = vbEnter Then InvertiereDarstellung(1) If State = vbLeave Then InvertiereDarstellung(0) Effect = vbDropEffectNone Exit Sub End If ' Kopieren? If Effect And vbDropEffectCopy > 0 And Shift = 0 Then Effect = vbDropEffectCopy

246

OLEGiveFeedback- Ereignis

End If ' Verschieben? If Effect And vbDropEffectMove > 0 And Shift = vbShiftMask Then Effect = vbDropEffectMove End If End Sub
Verwandte Ereignisse

................................................... Verwandte Ereignis s e


OLECompleteDrag, OLEDragDrop, OLEGiveFeedback, OLESetData, OLEStartDrag
Verwandte Themen

Standardereignisse

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

OLEGiveFeedback- Ereignis
Private Sub Objekt_OLEGiveFeedback(Effect As Long, _ DefaultCursors As Boolean)
Betroffene Objekte

................................................... Betro ffene Objekte


Animation, CoolBar, DataList, DateTimePicker, DBCombo, DBList, DirListBox, FileListBox, FlatScrollBar, Grid, Image, ImageCombo, ListBox, ListView, MaskEdBox, MSChart, MSFlexGrid, MSHFlexGrid, OLE, PictureBox, PropertyPage, RichTextBox, SSTab, TabStrip, TextBox, TreeView, ToolBar, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das OLEGiveFeedback-Ereignis tritt nach jedem OLEDragOver-Ereignis aufseiten der Quellkomponente auf, wenn diese im manuellen Modus (OLEDragMode = vbDragManual) betrieben wird. Der Parameter Effect ist ein von der Zielkomponente nach Auswertung des Maus- und Funktionstastenstatus sowie gegebenenfalls des Inhaltsformats gesetzter Bitvektor, der die anvisierte Operation ausdrckt. Der Aufzhlungstyp OLEDropEffectConstants definiert eine Reihe von Konstanten fr die einzelnen Operationen: vbDropEffectNone (0) steht fr keine Operation, vbDropEffectCopy (1) fr Kopieroperation und vbDropEffectMove (2) fr Verschiebeoperation. DefaultCursors ist ein Ausgabeparameter, den die Quellkomponente auf True setzen kann, um die ber die Eigenschaften MouseIcon und MousePointer des Screen-Objekts spezifizierte Mauszeigerform einzustellen.
Anwendung

................................................... Anwendung

Mit diesem Ereignis erhlt die Quellkomponente Gelegenheit, dem Benutzer eine geeignete Rckmeldung fr die von ihm anvisierte Operation zukommen zu lassen. Da Komponenten mit OLE-Untersttzung standardmig fr jede der mglichen Operationen eine andere, vom System her bereitgestellte Mauszeigerform anzeigen, lohnt sich der Austausch der Mauszeigerform meist nur in speziellen Fllen. Eine Behandlung des Ereignisses kann aber auch die Ausgabe einer kurzen Befehlsbeschreibung in der Statusleiste zum Ziel haben oder gar, bei Verwendung einer One-Shot-Logik, eine akustische Rckmeldung. Wenn Sie mit eigenen Mauszeigerformen arbeiten, sollten Sie die alte Mauszeigerform auf jeden Fall speichern und im Zuge der Behandlung von OLEDragComplete wieder herstellen.

247

Standardereignisse

Beispiel

................................................... Beis piel

Der folgende Code zeigt, wie man fr die unterschiedlichen Operationen eigene Cursorformen zur Anzeige bringt. Er geht davon aus, dass die Formen in den EffectOperationIcon-Variablen bereitstehen.
Private Sub File1_OLEGiveFeedback(Effect As Long, _ DefaultCursors As Boolean) Select Case Effect Case vbDropEffectCopy ' Kopieren Set Screen.MouseIcon = EffectCopyIcon ' Eigene Form setzen Case vbDropEffectMove ' Verschieben Set Screen.MouseIcon = EffectMoveIcon ' Eigene Form setzen Case vbDropEffectNone ' Operation nicht mglich Set Screen.MouseIcon = EffectNoneIcon ' Eigene Form setzen Case Else DefaultCursors = True End Select DefaultCursors = False ' Eigene Form verwenden End Sub
Verwandte Ereignisse

Standardereignisse

................................................... Verwandte Ereignis s e


OLECompleteDrag, OLEDragDrop, OLEDragOver, OLESetData, OLEStartDrag
Verwandte Themen

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

OLESetData- Ereignis
Private Sub Objekt_OLESetData(Data As DataObject, DataFormat As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


Animation, CoolBar, DataList, DateTimePicker, DBCombo, DBList, DirListBox, FileListBox, FlatScrollBar, Grid, Image, ImageCombo, ListBox, ListView, MaskEdBox, MSChart, MSFlexGrid, MSHFlexGrid, OLE, PictureBox, PropertyPage, RichTextBox, SSTab, TabStrip, TextBox, TreeView, ToolBar, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das OLESetData-Ereignis fordert die Quellkomponente einer OLE-Drag&Drop-Operation auf, den Inhalt in dem Format DataFormat bereitzustellen. Voraussetzung fr das Auftreten des Ereignisses ist allerdings, dass die Quellkomponente das Format zuvor durch einen SetDataAufruf ohne Angabe eines Inhalts (Value) gesetzt hat.
Anwendung

................................................... Anwendung

Vater dieses Ereignisses ist die Strategie der spten Bereitstellung von OLE-Inhalten. Diese Strategie verfolgt das Ziel, den Ressourcenbedarf fr eine OLE-Operation so gering wie mglich zu halten. Wrde man umfangreiche Inhalte sozusagen in vorauseilendem Gehorsam bereits zu Beginn einer OLE-Drag&Drop-Operation, also auf das OLEDragStart-Ereignis hin, in allen untersttzten Formaten bereitstellen, wre das mitunter mit einem erheblichen Speicherbedarf verbunden. Da ist es natrlich weitaus sinnvoller, den Inhalt erst dann in einem spezifischen Format bereitzustellen, wenn er in diesem Format tatschlich bentigt wird.

248

OLESetData- Ereignis

Eine Aufstellung der von Visual Basic fr die verschiedenen ActiveX-Steuerelemente direkt untersttzten Standardformate finden Sie im Abschnitt OLEDragDrop-Ereignis. Sie haben aber auch die Mglichkeit, eigene Formate in OLE-Operationen zu verwenden. Einzelheiten zur Vorgehensweise entnehmen Sie dem Abschnitt OLE-Drag&Drop, S. 501, des Praxisteils.
Warnung

................................................... Wa rnung

Ein GetData-Aufruf lst bei der Zielkomponente regulr den Laufzeitfehler 461 aus, wenn die Quellkomponente das spezifizierte Format zwar angeblich untersttzt, aber letztlich keinen Inhalt dafr bereitstellt.
Beispiel

Standardereignisse

................................................... Beis piel

Das folgende kleine Programm demonstriert die spte Bereitstellung sowie die Abfolge der Ereignisse. Das verwendete Formular enthlt ein Textfeld, dessen Inhalt sich in das Formular ziehen lsst, dort jedoch in umgekehrter Zeichenfolge ankommt.

Das Textfeld arbeitet mit spter Bereitstellung und dreht die Zeichenfolge um
Private Sub Form_Load() Text1.OLEDragMode = vbOLEDragAutomatic OLEDropMode = vbOLEDropManual AutoRedraw = True End Sub Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, X As Single, Y As Single) Print "Form_OLEDragDrop" Print Data.GetData(vbCFText) End Sub Private Sub Text1_OLESetData(Data As DataObject, DataFormat As Integer) Print "Text1_OLESetData" Data.SetData StrReverse(Text1), vbCFText End Sub Private Sub Text1_OLEStartDrag(Data As DataObject, _ AllowedEffects As Long) Print "Text1_OLEStartDrag" Data.SetData , vbCFText ' Inhalt wird spter bereitgestellt End Sub

249

Standardereignisse

Verwandte Ereignisse

................................................... Verwandte Ereignis s e


OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedback, OLEStartDrag
Verwandte Themen

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

OLEStartDrag- Ereignis
Sub Objekt_OLEStartDrag(Data As DataObject, AllowedEffects As Long)

Standardereignisse

Betroffene Objekte

................................................... Betro ffene Objekte


Animation, CoolBar, DataList, DateTimePicker, DBCombo, DBList, DirListBox, FileListBox, FlatScrollBar, Grid, Image, ImageCombo, ListBox, ListView, MaskEdBox, MSChart, MSFlexGrid, MSHFlexGrid, OLE, PictureBox, PropertyPage, RichTextBox, SSTab, TabStrip, TextBox, TreeView, ToolBar, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das OLEStartDrag-Ereignis tritt als erstes Ereignis gleich zu Anfang einer OLE-Drag&DropOperation auf. Es informiert die Quellkomponente ber den Beginn der Operation und gibt ihr Gelegenheit, die untersttzten Operationen sowie Inhalte und Formate zu setzen. Der Parameter Data verweist auf ein Objekt vom Typ DataObject, das als Container fr die zu bermittelnden Inhalte und die dazugehrigen Formatinformationen fungiert. Der Ausgabeparameter AllowedEffects kommt bei der Zielkomponente als Effect-Parameter an und wird dort als Bitvektor interpretiert, dessen gesetzte Bits die mglichen Operationen anzeigen. Der Aufzhlungstyp OLEDropEffectConstants definiert eine Reihe von Konstanten dafr: vbDropEffectNone (0) steht fr keine Operation, vbDropEffectCopy (1) fr Kopieroperation und vbDropEffectMove (2) fr Verschiebeoperation.
Anwendung

................................................... Anwendung

Die auf OLE basierende Drag&Drop-Operation ermglicht den dokumentenorientierten Austausch von Daten zwischen einer Quellkomponente und einer Zielkomponente. Medium des Austauschs ist aus der Sicht von Visual Basic das DataObject-Objekt, ein im System verankertes Containerobjekt, dessen Dienste allen OLE-tauglichen Anwendungen fr den anwendungsbergreifenden, aber auch -internen Transport von Daten zur Verfgung stehen. Grundlegender Gedanke bei dieser Art von Kommunikation ist, dass die Daten in einem anwendungsunabhngigen Format gehalten sind. Damit kann eine Komponente jederzeit Inhalte von einer anderen Komponente entgegennehmen, sofern sich beide auf ein gemeinsames Format einigen knnen. Fr die wichtigsten Standardformate definiert der Aufzhlungstyp ClipBoardConstants Formatkonstanten: Formatkonstante vbCFText (1) vbCFBitmap (2) vbCFMetafile (3) vbCFEMetafile (14) Beschreibung des Formats Data enthlt Zeichenfolge im Format TXT Data enthlt Bitmap im Format BMP Data enthlt Grafik im Zwischendateiformat WMF Data enthlt Grafik im erweiterten Zwischendateiformat EMF

Standardm ige Datenformate eines DataObject-Objekts

250

OLEStartDrag- Ereignis

Formatkonstante vbCFDIB (8) vbCFPalette (9) vbCFFiles (15) vbCFRTF (-16639)

Beschreibung des Formats Data enthlt gerteunabhngige Bitmap im DIB-Format Data enthlt Palette im Format PAL Data enthlt Files-Auflistung Data enthlt Zeichenfolge im RTF-Format

Standardm ige Datenformate eines DataObject-Objekts

Das Containerobjekt ist speziell darauf eingerichtet, Inhalte in verschiedenen Formaten entgegennehmen zu knnen. Da die Einhaltung der Formate fr die sichere Kommunikation eine wichtige Rolle spielt, sind die Formate mit einer eindeutigen Nummer (Handle) assoziiert und in der Systemregistrierung niedergelegt. Damit ist es einer Anwendung prinzipiell mglich, die Nummer fr ein registriertes Format in Erfahrung zu bringen und auch eigene Formate zu registrieren. Allerdings bietet Visual Basic dafr keine Funktionen an, so dass man in diesem Fall die entsprechenden Routinen der Win32-API direkt aufrufen muss (RegisterClipBoardFormat und GetClipFormatName). Vom Prinzip her lassen sich Inhalte auch in nicht registrierten Formaten bermitteln, sofern deren Nummern auf beiden Seiten bekannt sind. Das birgt allerdings gewisse Gefahren, wenn unter einer verwendeten Nummer ein anderes Format registriert ist. Eine Quellkomponente reagiert auf das OLEStartDrag-Ereignis, indem sie den AllowedEffectsParameter mit einem Bitvektor versorgt und fr jedes untersttzte Format die SetData-Methode des DataObject-Objekts aufruft. Falls der Speicherbedarf fr die zugehrigen Inhalte ertrglich ist, spricht nichts dagegen, diese bereits in dieser Phase der SetData-Methode ber den ValueParameter mitzugeben. Ab einer bestimmten Datenmenge empfiehlt es sich jedoch, mit der Bekanntgabe des Inhalts auf das OLESetData-Ereignis zu warten und die SetData-Methode vorerst nur mit einer Formatkonstanten zu versorgen (spte Bereitstellung).
Data.SetData , vbCFBitmap

Standardereignisse

Im automatischen Modus (OLEDragMode = vbOLEDragAutomatic) bertrgt eine Steuerelementkomponente ihren Standardwert noch vor dem OLEStartDrag-Ereignis in das Containerobjekt im manuellen Modus passiert das nicht, und das ist oft auch erwnscht. Um ein DataObjectObjekt in einen definierten Zustand zu versetzen, rufen Sie die Clear-Methode auf. Sie lscht alle Formatinformationen und Inhalte. Unterbleibt der SetData-Aufruf, kann Visual Basic von sich aus zwischen den Formaten BMP, WMF, EMF und TXT unterscheiden, mehr jedoch nicht. Alle anderen Formate mssen explizit gesetzt werden, damit kein Laufzeitfehler aufseiten der Zielkomponente auftritt. Bei Verwendung eines Formats, das nicht zu den von Visual Basic anerkannten Standardformaten zhlt, mssen Sie Inhalte in Form von Byte-Arrays bereitstellen. Auerdem sollte jedes Array Lngeninformationen beinhalten, da der OLE-Mechanismus die Daten ohne Lngenangabe in einem hinreichend groen Puffer bermittelt, der auch grer sein kann als das Array und es in der Regel auch ist.
Beispiel

................................................... Beis piel

Das folgende Beispielprojekt OLEDragStart ist eine etwas kompliziertere Version des Beispiels zu OLESetData, wenngleich das Szenario (ohne dass dies eine Rolle spielt) recht einfach gewhlt ist: Der Benutzer kann den Inhalt eines Textfelds mittels OLE-Drag&Drop auf das Formular verschieben. Quell- und Zielkomponente arbeiten jedoch mit zwei unterschiedlichen Formaten: zum einen mit dem standardmigen Format vbCFText, zum anderen mit dem eigenen Format Mein Textformat.

251

Standardereignisse

Standardereignisse

Nachdem das Textfeld als Quellkomponente seinen Wert bereits von sich aus im vbCFText-Format in das Containerobjekt einfgt, kann sich die OLEDragStart-Behandlungsroutine darauf beschrnken, das eigene Format zu registrieren und zu setzen. Fr die Registrierung ist der Aufruf der Win32-API-Funktion RegisterClipboardFormat notwendig, die das Format mit einer Nummer identifiziert, wie sie der SetData-Aufruf erwartet. Unglcklicherweise besteht SetData auf einen Wert vom Typ Integer, whrend das Add-In API-Viewer fr die Funktion den Rckgabetyp Long deklariert. Die einfachste Lsung besteht darin, den Rckgabetyp manuell auf Integer zu ndern, was keinerlei weitere Probleme aufwerfen sollte, da das System Formatkonstanten als 16-Bit-Werte behandelt. Das war die Sicht der Quellkomponente. Die Zielkomponente muss nun ihrerseits bei der Behandlung von OLEDragDrop die Funktion RegisterClipboardFormat aufrufen (im Allgemeinen werden Quelle und Ziel ja nicht demselben Prozess angehren), um die Nummer des Formats in Erfahrung zu bringen. Der Rest ist zwar nicht elegant, aber doch geradlinig: Da das DataObjectObjekt bei eigenen Formaten auf Byte-Arrays besteht, liefert die Methode GetData auch ein solches, was nicht nur aufseiten der Zielkomponente ein gewisses Geschick bei der Konvertierung erfordert (das Beispiel verzichtet der Einfachheit halber auf die Einarbeitung einer Lngeninformation und bedient sich fr die Konvertierung einer Variant-Variablen).
' Formularmodul: OLEDragStart-Demo Option Explicit Private Declare Function RegisterClipboardFormat Lib "user32" Alias _ "RegisterClipboardFormatA" (ByVal lpString As String) As Integer Private MeinFormat As Integer Private Sub Form_Load() OLEDropMode = vbOLEDropManual Text1.OLEDropMode = vbOLEDragAutomatic AutoRedraw = True End Sub Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) ' Zuerst im gewhnlichen Textformat If Data.GetFormat(vbCFText) Then Print Data.GetData(vbCFText) ' Nun im eigenen Format If Data.GetFormat(RegisterClipboardFormat("Mein Textformat")) Then Print Data.GetData(MeinFormat) End If End Sub Private Sub Text1_OLESetData(Data As DataObject, DataFormat As Integer) Dim Daten As Variant ' Zur einfachen Typ-Konversion Dim ByteArray() As Byte ' Fr eigenes Format bei SetData If DataFormat = MeinFormat Then ' MeinFormat? Daten = " " + StrReverse(Text1) ' Daten zuerst in Variant ByteArray = Daten ' Typkonversion Data.SetData ByteArray, MeinFormat ' Byte-Array als Inhalt setzen End If End Sub

252

Paint- Ereignis

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects _ As Long) AllowedEffects = vbDropEffectMove ' Eigenes Format registrieren und setzen MeinFormat = RegisterClipboardFormat("Mein Textformat") If MeinFormat Then Data.SetData , MeinFormat End Sub
Verwandte Ereignisse

................................................... Verwandte Ereignis s e


OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedback, OLESetData
Verwandte Themen

Standardereignisse

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

Paint- Ereignis
Sub Form_Paint() Sub Objekt_Paint([Index As Integer])
Betroffene Objekte

................................................... Betro ffene Objekte


Form, PictureBox, PropertyPage, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das Paint-Ereignis tritt auf, wenn der Fensterbereich des Objekts teilweise oder vollstndig neu gezeichnet werden muss, weil er (teilweise) verdeckt, unsichtbar oder minimiert war respektive vergrert oder explizit durch einen Aufruf der Refresh-Methode fr ungltig erklrt wurde. Voraussetzung fr das Ereignis ist aber, dass die AutoRedraw-Eigenschaft den Wert False hat. Durch Behandlung dieses Ereignisses erhlt das Objekt Gelegenheit, seinen Fensterbereich aufzufrischen oder gegebenenfalls mit anderem Inhalt komplett neu zu zeichnen. Beim Start eines Formulars herrscht die Ereignisreihenfolge: Load, Resize, Paint, GotFocus usw.
Anwendung

................................................... Anwendung

Ein Objekt, das auf das Paint-Ereignis reagieren kann, verfgt ber die beiden Eigenschaften AutoRedraw und ClipControls. AutoRedraw hat als Voreinstellung den Wert False und ClipControls den Wert True. Wird AutoRedraw auf True gesetzt, speichert Visual Basic den Fensterinhalt des Objekts als Bitmap und restauriert ungltig gewordene Bereiche in eigener Regie, wann immer dies erforderlich ist. Fr die meisten Anwendungsflle drfte dies die praktischste Einstellung sein, da man sich als Programmierer eigentlich um nichts kmmern muss und an jeder beliebigen Stelle Ausgaben vornehmen kann. Wie alle Automatismen hat er aber auch Nachteile: Er verzehrt Ressourcen, kostet Zeit und lsst einiges an Flexibilitt vermissen. Die Eigenschaft ClipControls wirkt sich nur aus, wenn AutoRedraw auf False gesetzt ist. Sie regelt, ob Visual Basic fr Steuerelemente Bildausschnitte bei der Restaurierung des Objektbereichs berechnet oder nicht. Ohne diese Berechnung ist die Grafikausgabe schneller, es kann jedoch zu Ungereimtheiten bei der Anzeige sich berlappender Steuerelemente kommen. Visual Basic unterscheidet beim Zeichnen eines Objekts drei Ebenen: 1. Die hintere Ebene in dieser Ebene landet die Bitmap, die ber die Picture-Eigenschaft des Objekts festgelegt ist, ber die Print-Methode ausgegebener Text sowie alle Ausgaben der Grafikmethoden Line, Circle und PSet.

253

Standardereignisse

2. Die mittlere Ebene in dieser Ebene erscheinen fensterlose Steuerelemente, wie das Bezeichnungsfeld (Label), die grafischen Steuerelemente (Shape, Line) sowie alle UserControl-Steuerelemente, deren Windowless-Eigenschaft auf True gesetzt wurde. 3. Die obere Ebene in dieser Ebene erscheinen alle Steuerelemente, denen ein eigenes Fenster zugeordnet ist. Das sind alle Steuerelemente bis auf die unter 2. genannten. Die folgende Tabelle gibt einen berblick ber die Wirkung der Eigenschaften AutoRedraw und ClipControls, wenn die Grafikausgabe innerhalb oder auerhalb der Paint-Behandlung stattfindet.

Standardereignisse

AutoRedraw True True

ClipControls True False

Effekt Paint-Ereignis bleibt aus und die Grafikausgabe unterscheidet drei Ebenen. Beschleunigte Grafikausgabe in drei Ebenen, da keine Bildausschnitte fr Steuerelemente berechnet werden. Platzierte Steuerelemente sollten sich nicht berlappen. Grafikausgabe findet in drei Ebenen statt, sofern Grafikmethoden ausschlielich innerhalb der Paint-Routine aufgerufen werden. Beim Aufruf von Grafikmethoden auerhalb von Paint kann das Ergebnis fehlerhaft sein, da die Abfolge beim Zeichnen der mittleren Ebene nicht mehr garantiert ist. Die Grafikausgabe findet in drei Ebenen statt. Neu gezeichnet werden nur Rechteckbereiche, die bis zum Auftreten des nchsten Paint-Ereignisses fr ungltig erklrt wurden, etwa weil sie verdeckt waren. Beim Aufruf von Grafikmethoden auerhalb von Paint kann das Ergebnis fehlerhaft sein, da die Abfolge der Ebenen nicht mehr garantiert ist.

False (Voreinstellung)

True (Voreinstellung)

False

False

Warnung

................................................... Wa rnung

Wenn Sie mit einer Paint-Routine arbeiten, sollten alle expliziten Grafikausgaben innerhalb dieser Routine erfolgen.
Tipp

................................................... Tipp

Innerhalb einer Ebene legt die Tabulatorordnung fest, in welcher Reihenfolge berlappende Steuerelemente einander verdecken. Um eine eigene Reihenfolge festzulegen, knnen Sie die ZOrder-Methode der beteiligten Steuerelemente aufrufen, um diese nacheinander an die oberste Position zu bringen. Der folgende Code aus dem Beispielprojekt Schach1 arbeitet mit einem Array fensterloser Steuerelemente. Nach jeder Verschiebung einer Figur wird die Reihenfolge wieder hergestellt:
For i = 31 To 0 Step -1 figur(i).ZOrder (0) Next i ' Steuerelement ganz nach oben

Wenn Sie den Fensterbereich eines Objekts explizit restaurieren wollen, zum Beispiel nach einem Resize-Ereignis, sollten Sie die Refresh-Methode aufrufen.

254

Paint- Ereignis

Beispiel

................................................... Beis piel

Der folgende in zwei Varianten vorgestellte Code zeichnet eine Ellipse, die immer exakt den Client-Bereich des Formulars ausfllt. Die erste Variante verlsst sich darauf, dass Visual Basic den Formularbereich automatisch neu zeichnet, die zweite verwendet eine Paint-Routine. ndert man die Gre des Formulars, flackert die Anzeige im ersten Fall ein wenig, im zweiten Fall jedoch nicht.
' Erste Variante Private Sub Form_Load() AutoRedraw = True End Sub Private Sub Form_Resize() Dim Radius If ScaleWidth > ScaleHeight Then Radius = ScaleWidth / 2 Else Radius = ScaleHeight / 2 End If Cls Circle (ScaleWidth / 2, ScaleHeight / 2), Radius, , , , ScaleHeight / ScaleWidth End Sub

Standardereignisse

Die Ellipse fllt das Formular in jeder Gre ganz aus


' Zweite Variante Private Sub Form_Load() AutoRedraw = False End Sub Private Sub Form_Paint() Dim Radius If ScaleWidth > ScaleHeight Then Radius = ScaleWidth / 2 Else Radius = ScaleHeight / 2 End If Cls Circle (ScaleWidth / 2, ScaleHeight / 2), Radius, , , , ScaleHeight / ScaleWidth End Sub

255

Standardereignisse

Private Sub Form_Resize() Refresh End Sub

QueryUnload- Ereignis
Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) MIDForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte

Standardereignisse

Form, MDIForm
Beschreibung

................................................... Bes c hreibung

Dieses dem Unload-Ereignis vorangehende Ereignis teilt einem Formular mit, dass es geschlossen werden soll. Falls die gesamte Anwendung beendet werden soll, schickt Windows dieses Ereignis der Reihe nach an alle geffneten Formulare. QueryUnload stellt eine Anfrage dar, die ein einzelnes Formular (im Namen aller Formulare) auch ablehnen kann, indem es den Ausgabeparameter Cancel auf einen Wert ungleich 0 setzt. MDI-Formulare sehen das Ereignis vor ihren untergeordneten Formularen (beim Unload-Ereignis ist die Reihenfolge dagegen genau andersherum). Der Parameter UnloadMode liefert den Grund fr das Ereignis. Die folgende Tabelle gibt einen berblick ber die verschiedenen Grnde und die ber den Aufzhlungstyp QueryUnloadConstants dafr definierten Konstanten. Konstante vbFormControlMenu (0) vbFormCode (1) vbAppWindows (2) vbAppTaskManager (3) vbFormMDIForm (4) vbFormOwner (5)
Anwendung

Grund Der Benutzer beendet die Anwendung ber das Systemmen. Eine Unload-Anweisung wurde fr das Formular ausgefhrt. Windows soll heruntergefahren werden. Der Task-Manager fordert die Anwendung zum Abbrechen auf. Das bergeordnete MDI-Formular soll geschlossen werden. Das bergeordnete Formular soll geschlossen werden.

................................................... Anwendung

Eine Anwendung kann dieses Ereignis behandeln, um sicherzustellen, dass alle Operationen in allen Formularen abgeschlossen sind und alle Daten gespeichert wurden. Andernfalls sollte der Benutzer die Mglichkeit erhalten, dies nachzuholen.
Beispiel

................................................... Beis piel

Der folgende Code zeigt die typische Reaktion auf QueryUnload.


Private Textgendert As Boolean ... Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If Textgendert Then Select Case MsgBox("Datei speichern?", vbExclamation + vbYesNoCancel) Case vbCancel ' Programmabbruch vereiteln Cancel = True

256

Resize- Ereignis

Case vbYes mnuDateiSpeichern_Click Cancel = False Case vbNo Cancel = False End Select End If End Sub
Verwandte Ereignisse

' Datei speichern, dann Unload

' Datei nicht speichern, sofort Unload

................................................... Verwandte Ereignis s e

Standardereignisse

Unload

Resize- Ereignis
Sub Form_Resize() Sub Objekt_Resize([HeightNew As Single, WidthNew As Single])
Betroffene Objekte

................................................... Betro ffene Objekte


CoolBar, Data, DataReport, Form, MDIForm, OLE, PictureBox, UserControl, UserDocument
Beschreibung

................................................... Bes c hreibung

Das Resize-Ereignis zeigt einem Objekt an, dass sich seine Gre gendert hat. Die Ursache dafr kann entweder eine entsprechende Benutzeraktion wie Vergrern, Verkleinern, Maximieren oder Wiederherstellen sein, aber auch die Ausfhrung einer Anweisung, die Einfluss auf die Gre oder Sichtbarkeit des Objekts hat. Fr ein Formular tritt das Ereignis erstmals nach dem Load-Ereignis auf, wenn es automatisch gestartet wurde, oder im Zuge eines Show-Aufrufs, der es sichtbar macht. Ansonsten ist es Seiteneffekt, wenn eine der Eigenschaften WindowState, Height, Width einen neuen Wert erhlt oder die Visible-Eigenschaft auf True gesetzt wird. Die Parameter HeightNew und WidthNew geben die neuen Abmessungen im aktuellen Koordinatensystem an.
Anwendung

................................................... Anwendung

Ein Objekt behandelt dieses Ereignis, um auf Grennderungen reagieren zu knnen und seinen Bereich gegebenenfalls neu zu zeichnen oder zu organisieren. Hufig wird in einer ResizeRoutine auch das Koordinatensystem via ScaleHeight, ScaleWidth, ScaleLeft, ScaleTop gendert, um die Grafikausgaben von der Bereichsgre unabhngig zu machen. Falls die AutoRedraw-Eigenschaft eines Formulars auf False gesetzt wurde, sollte die ResizeRoutine einen Refresh-Aufruf enthalten, wenn sich das Koordinatensystem gendert hat.
Beispiel

................................................... Beis piel

Die folgende Resize-Routine reagiert auf nderungen der Formularabmessungen, indem sie eine Periode der Sinuskurve ausgibt, die immer genau in den Client-Bereich des Formulars eingepasst ist. Der Einfachheit halber ndert der Code das Koordinatensystem, nicht die Parameter der Kurve.
Private Sub Form_Resize() Dim Winkel As Single Dim Pi As Single Pi = 4 * Atn(1)

257

Standardereignisse

ScaleHeight = -2 ' Positive Koordinaten oben! Me.ScaleTop = 1 ' Ursprung in die Mitte ScaleWidth = 2 * Pi ' reicht fr eine volle Sinusperiode Cls ' Bereich lschen ' Sinuskurve zeichnen For Winkel = 0 To 2.1 * Pi Step Pi / 30 Line -(Winkel, Sin(Winkel)) Next Winkel End Sub
Verwandte Themen

Standardereignisse

................................................... Verwandte Them en

Bildlauf ein kleiner Betrachter fr groe Bilder (S. 545); HexView eine schnelle Textansicht fr groe Dateien (S. 551)

Terminate- Ereignis
Sub Objekt_Terminate()
Betroffene Objekte

................................................... Betro ffene Objekte


ClassModule, DataReport, DHTMLPageDesigner, Form, MDIForm, PropertyPage, UserControl, UserDocument, WebClass
Beschreibung

................................................... Bes c hreibung

Terminate ist das letzte Ereignis, das ein Objekt ereilt. Es tritt ein, sobald keine Verweise auf das Objekt mehr existieren, das heit, wenn das Fenster des Objekts entladen wurde und der Geltungsbereich der letzten Objektvariable, die noch auf das Objekt verwiesen hat, erloschen ist oder auf den Wert Nothing gesetzt wurde. Fr Objekte mit eigenem Fenster folgt das TerminateEreignis unmittelbar auf das Unload-Ereignis, nicht jedoch fr Objekte, die von einer auf ClassModule aufsetzenden Klasse abstammen. Fr diese Objekte fungiert Terminate als alleiniger Destruktor.
Anwendung

................................................... Anwendung

Die Ereignisse Terminate und Initialize treten beide nur ein einziges Mal auf. Aus diesem Grund sollte eine Terminate-Routine dazu verwendet werden, genau die Ressourcen wieder freizugeben, die whrend Initialize angefordert wurden.
Warnungen

................................................... Wa rnungen
Formularvariablen sollten nicht ohne vorherigen Unload-Aufruf auf Nothing gesetzt werden, da sie sonst geladen bleiben (und ebenso alle Objekte, die dem Formular untergeordnet sind, das heit: alle Steuerelemente sowie gegebenenfalls weitere Formulare). Terminate tritt nicht auf, wenn ein Formular oder die Instanz einer Klasse aus dem Hauptspeicher entfernt, weil die Anwendung nicht ordnungsgem beendet wurde, oder wenn die Anwendung durch eine End-Anweisung beendet wird, ohne dass zuvor alle bestehenden Instanzen der Klasse oder des Formulars aus dem Hauptspeicher entfernt wurden.
Beispiel

................................................... Beis piel

Private Sub Form_Terminate Redim MeinArray(0) ' Arrayelemente freigeben End Sub

258

Unload- Ereignis

Verwandte Ereignisse

................................................... Verwandte Ereignis s e


Initialize, Load, Unload

Unload- Ereignis
Sub Objekt_UnLoad(Cancel As Integer)
Betroffene Objekte

................................................... Betro ffene Objekte


Form, MDIForm, PropertyPage

Standardereignisse

Beschreibung

................................................... Bes c hreibung

Das Unload-Ereignis tritt auf, wenn ein Formularobjekt sein Fenster sowie alle darin enthaltenen Steuerelemente freigibt bzw. entldt das Objekt selbst bleibt bestehen. Ursache des Ereignisses kann eine Unload-Anweisung sein, aber auch eine Benutzeraktion, die das Schlieen des Fensters oder die Beendigung des gesamten Programms zum Ziel hat beispielsweise ein Klick auf die Schaltflche SCHLIEEN in der Titelleiste des Fensters oder der Aufruf eines entsprechenden Menbefehls. Der Ausgabeparameter Cancel lsst sich auf einen Wert ungleich 0 oder auf True setzen, um das Entladen zu verhindern. Ein Herunterfahren von Windows wird dadurch aber nicht abgebrochen, das kann nur bei der Behandlung von QueryUnload geschehen.
Anwendung

................................................... Anwendung

Erhlt ein Objekt das Unload-Ereignis, heit das noch lange nicht, dass es selbst auch abgebaut wird. Das ist erst der Fall, wenn ein Terminate-Ereignis folgt. Es zeugt sogar von gutem Programmierstil, Formulare zwischendurch mit der Unload-Anweisung zu entladen, wenn sie gerade nicht bentigt werden. Das Objekt selbst bleibt dabei erhalten, und das Fenster lsst sich jederzeit ber einen Load- oder besser Show-Aufruf erneut laden und zur Anzeige bringen, ja, es reicht auch ein Zugriff auf die Visible-Eigenschaft. Das spart Ressourcen, kann aber zu Verzgerungen bei der erneuten Anzeige des Formulars fhren, weil das Fenster sowie alle darauf befindlichen Steuerelemente neu initialisiert werden mssen.
Warnungen

................................................... Wa rnungen
Visual Basic entldt das Fenster eines Formularobjekts nicht automatisch, wenn die letzte Referenz auf das Objekt auf Nothing gesetzt wird. Das Entladen muss explizit durch den Benutzer oder durch den Programmcode geschehen. Erfolgt fr ein entladenes Formularfenster ein Hide-Aufruf, bringt dieser entgegen aller Logik das Fenster zur Anzeige.
Tipp

................................................... Tipp

Um ein Fenster verschwinden zu lassen, knnen Sie auch die Hide-Methode des Formularobjekts ausfhren. In diesem Fall wird das Fenster zwar unsichtbar, bleibt aber geladen. Das Fenster selbst ist dann inaktiv und kann insbesondere den Fokus nicht erhalten. Um das Fenster wieder sichtbar zu machen, kann die Visible-Eigenschaft auf True gesetzt werden oder ein ShowAufruf erfolgen.
Beispiel

................................................... Beis piel

Private Sub Form_Unload(Cancel As Integer) If vbYes = MsgBox("Sind Sie sicher?", vbYesNo, "Fenster schlieen") _

259

Standardereignisse

Then Cancel = 0 Else Cancel = 1 End If End Sub


Verwandte Ereignisse

................................................... Verwandte Ereignis s e


Initialize, Load, Terminate

Standardereignisse

Validate- Ereignis
Sub Objekt_Validate(Cancel As Boolean)
Betroffene Objekte

................................................... Betro ffene Objekte


Adodc, Animation, CheckBox, ComboBox, CommandButton, Data, DataGrid, DataList, DataRepeater, DateTimePicker, DBCombo, DBGrid, DBList, DirListBox, DriveListBox, FileListBox, HScrollBar, ListBox, ListView, MaskEdBox, MMControl, MonthView, MSChart, MSFlexGrid, MSHFlexGrid, MSTab, OptionButton, PictureBox, PropertyPage, RemoteData, RichTextBox, Slider, TabStrip, TextBox, TreeView, VScrollBar
Beschreibung

................................................... Bes c hreibung

Das unmittelbar vor LostFocus eintreffende Validate-Ereignis kndigt einem Steuerelement an, dass es den Fokus abgeben soll. Setzt das Steuerelement den Ausgabeparameter Cancel auf True, kann es die Weitergabe des Fokus unterbinden etwa, wenn sein aktueller Wert gegen eine Gltigkeitsregel verstt. Voraussetzung fr das Auftreten dieses Ereignisses ist allerdings, dass die CausesValidation-Eigenschaft sowohl des betroffenen Steuerelements als auch des Steuerelements, auf das der Fokus bergehen soll, den Wert True hat.
Anwendung

................................................... Anwendung

Die normale Reaktion auf das Validate-Ereignis ist eine Gltigkeitsprfung des Werts bzw. des aktuellen Zustands des Steuerelements. Stellt sich der Wert als ungltig heraus, ist kein besonderes Verhalten vorgeschrieben: Die Behandlungsroutine kann eine belehrende Fehlermeldung ausgeben und die Fokusabgabe verweigern, sie kann aber auch den Wert schlichtweg korrigieren und der Weitergabe des Fokus nichts in den Weg legen. Falls auch nur ein Steuerelement auf einem Formular eine Gltigkeitsprfung durchfhrt, wird die CausesValidation-Eigenschaft der anderen als Empfnger des Fokus in Frage kommenden Steuerelemente im Allgemeinen auf True gesetzt sein. In besonderen Fllen kann es jedoch Vorteile bringen, die CausesValidation-Eigenschaft bestimmter Steuerelemente etwa einer ABBRECHEN- oder HILFE-Schaltflche auf False zu setzen. Der Benutzer kann dann den Fokus auf diese Steuerelemente verschieben, ohne das Validate-Ereignis des verlassenen Steuerelements auszulsen. Sobald der Fokus jedoch auf ein Steuerelement weitergehen soll, dessen CausesValidation-Eigenschaft auf True gesetzt wurde, tritt zunchst einmal das Validate-Ereignis des ursprnglichen Steuerelements auf. Beachten Sie aber, dass dem Benutzer auf diese Weise gegebenenfalls das Schlieen des Formulars mglich werden kann, ohne dass die Gltigkeitsprfung des zuletzt verlassenen Steuerelements zum Zuge kommt. Die Unload-Behandlung fr das Formular sollte daher einen ValidateControls-Aufruf enthalten. Die Behandlung des Validate-Ereignisses ist angezeigt, wenn der Benutzer ein Datenfeld ausfllen muss oder wenn er nur bestimmte Daten in ein Datenfeld eintragen darf.

260

Global- Objekt

Warnung

................................................... Wa rnung

Vom Prinzip her knnte man auch versuchen, eine Gltigkeitsprfung im Zuge von LostFocus zu implementieren. Das kann aber Probleme verursachen, da das Steuerelement zu dem Zeitpunkt, an dem das Ereignis auftritt, den Fokus bereits abgegeben hat. Es wre also ein SetFocus-Aufruf erforderlich, der aber wiederum dem neuen Inhaber des Fokus diesen sofort wieder entreit und ihm das LostFocus-Ereignis beschert. Falls dieses Steuerelement gleichfalls nicht bereit ist, den Fokus herzugeben und seinerseits einen SetFocus-Aufruf durchfhrt, kommt es zu einer Ereignisflut, die das System destabilisieren kann.
Beispiel

................................................... Beis piel

Global- Objekt

Private Sub Text1_Validate(Cancel As Boolean) Cancel = Not IsDate(Text1) End Sub


Verwandte Ereignisse

................................................... Verwandte Ereignis s e


LostFocus, GotFocus

Global- Objekt
Die Einbettung der traditionellen Standardfunktionen von Basic in das inzwischen vollkommen objektorientierte Programmiermodell von Visual Basic geschieht formal gesehen ber ein Global-Objekt, das den bergeordneten Kontext fr alle Module einer Anwendung bereitstellt. Damit sind die in der Klasse Global definierten Methoden grtenteils alte Bekannte, die (nach wie vor) den operativen Kern der Sprache selbst ausmachen. Mit den Eigenschaften des Global-Objekts verhlt es sich anders; sie sind ihrerseits Objekte und verkapseln die Standardumgebung, in die jedes Visual-Basic-Programm sozusagen beim Start hineingeboren wird. Diese Objekte mssen (und knnen) nicht eigens instanziiert werden, da sie von Visual Basic automatisch im Verlauf des Programmstarts angelegt werden und ihre Bezeichner global bekannt sind. Eine Qualifikation mit dem Bezeichner Global ist weder ntig noch mglich.

................................................... Eigens c ha ften


App, Calendar, ClipBoard, Date, Forms, Now, Printer, Printers, Screen, Time, Timer Die folgende Tabelle gibt einen berblick ber die nicht an anderer Stelle vorgestellten globalen Eigenschaften: Eigenschaft App Calendar Beschreibung App-Objekt, das die aktuelle Laufzeitinstanz reprsentiert Integerwert, der den Kalender fr alle Datumsfunktionen festlegt. Voreinstellung ist vbCalGreg (0) fr den Gregorianischen Kalender. Alternative ist der Hijri-Kalender: vbCalHijri (1) ClipBoard-Objekt, das die OLE-Zwischenablage und ihre Operationen reprsentiert ErrObject-Objekt, das den Fehlerkontext der Anwendung reprsentiert

ClipBoard Err

261

Global- Objekt

Eigenschaft Forms Printer Printers Screen


Methoden

Beschreibung Object-Auflistung aller von der aktuellen Laufzeitinstanz geladenen Formularinstanzen Printer-Objekt, das den aktuellen Standarddrucker reprsentiert Object-Auflistung aller auf dem System installierten Drucker Screen-Objekt, das die Grafikanzeige auf dem Bildschirm reprsentiert

Global- Objekt

................................................... Methoden
Abs, AppActivate, Asc, AscB, AscW, Atn, Beep, CallByName, CBool, CByte, CCur, CDate, CDbl, CDec, ChDir, ChDrive, Choose, Chr, ChrB, ChrW, CInt, CLng, Command, Cos, CreateObject, CSng, CStr, CurDir, CVar, CVDate, CVErr, DateAdd, DateDiff, DatePart, DateSerial, DateValue, Day, DDB, DeleteSetting, Dir, DoEvents, Environ, EOF, Err, Error, Exp, FileAttr, FileCopy, FileDateTime, FileLen, Filter, Fix, Format, FormatCurrency, FormatDateTime, FormatNumber, FormatPercent, FreeFile, FV, GetAllSettings, GetAttr, GetObject, GetSetting, Hex, Hour, IIF, InputBox, InStr, InStrB, InStrRev, Int, IPmt, IRR, IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject, Join, Kill, LCase, Left, LeftB, Len, Load, LoadPicture, LoadResData, LoadResPicture, LoadResString, Loc, LOF, Log, LTrim, Mid, MidB, Minute, MIRR, MkDir, Month, MonthName, MsgBox, NPer, NPV, Oct, Partition, Pmt, PPmt, PV, QBColor, Randomize, Rate, Replace, Reset, RGB, Right, RightB, RmDir, Rnd, Round, RTrim, SavePicture, SaveSetting, Second, Seek, SendKeys, SetAttr, Sgn, Shell, Sin, SLN, Space, Split, Sqr, Str, StrComp, StrConv, String, StrReverse, Switch, SYD, Tan, TimeSerial, TimeValue, Trim, TypeName, UCase, Unload, Val, VarType, Weekday, WeekdayName, Year Die folgende Tabelle gibt einen berblick ber die nicht an anderer Stelle vorgestellten Methoden. Die Prototypen lauten:
Function CallByName(Object As Object, ProcName As String, _ CallType As VbCallType, Args()) As Variant Sub CallByName(Object As Object, ProcName As String, _ CallType As VbCallType, Args()) Function Command() As String Function CreateObject(Class As String, [ServerName As String]) As Object Sub DeleteSetting(AppName As String, [Section As String], _ [Key As String]) Sub DoEvents() Function GetAllSettings(AppName As String, Section As String) _ As String()() Function GetObject([PathName As String], _ [AnwName.ObjektTyp As String]) As Object Function GetSetting(AppName As String, Section As String, _ Key As String, [Default]) As String Function InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, _ Context) As String

262

Global- Objekt

Function Load(Object As Object) Function LoadPicture([FileName], [Size], [ColorDepth], [X], [Y]) _ As Picture Function LoadResData(Id, ResType As Integer) As Byte() Function LoadResPicture(Id, ResType As Integer) As Picture

Function LoadResString(Id As Long) As String Function QBColor(Color As Integer) As Long

Global- Objekt

Function RGB(Red As Integer, Green As Integer, Blue As Integer) As Long Sub SavePicture(Picture As Picture, FileName As String) Sub SaveSetting(AppName As String, Section As String, _
Key As String, Setting As String)

Sub SendKeys(String As String, [Wait As Boolean]) Sub Unload(Object) Methode CallByName Beschreibung Ermglicht den Aufruf einer Methode oder Eigenschaft ProcName eines zur Laufzeit gebundenen Automatisierungsobjekts Object unter Angabe des Bezeichners ElementName als Zeichenfolge, gefolgt von der Art des Elements (vbGet, vbLet, vbMethod, vbSet) und der Parameterliste Params, die auch als Variant-Array bergeben werden kann. Der Aufruf kann in Funktions- oder Prozedurform erfolgen. Liefert die Kommandozeilenargumente, die beim Aufruf der Anwendung angegeben wurden Erzeugt eine neue Instanz eines ActiveX-Objekts optional unter Spezifikation eines Servers und liefert einen Verweis darauf zurck Lscht persistente Einstellungen eines Programms aus der Systemregistrierung. Die Methode wird unter Angabe des Anwendungsnamens als Schlssel, eines Abschnittsbezeichners als Unterschlssel (optional) und eines Bezeichners (optional) aufgerufen und lscht den entsprechenden Eintrag, Unterschlssel oder Schlssel. Unterbricht die Ausfhrung der aktuellen Routine, um die Behandlung gegebenenfalls anstehender Ereignisse zu ermglichen, und setzt die Routine danach fort Ermittelt persistente Einstellungen eines Programms aus der Systemregistrierung. Die Funktion wird unter Angabe des Anwendungsnamens als Schlssel sowie eines Abschnittsbezeichners als Unterschlssel aufgerufen und liefert ein zweidimensionales String-Array, das in der ersten Dimension alle in dem Abschnitt gespeicherten Bezeichner und in der zweiten die dazugehrigen Werte wiedergibt. Liefert eine Object-Referenz auf ein ActiveX-Objekt

Command CreateObject DeleteSetting

DoEvents

GetAllSettings

GetObject

263

Global- Objekt

Methode GetSetting

Beschreibung Ermittelt eine persistente Einstellung eines Programms aus der Systemregistrierung. Die Funktion wird unter Angabe des Anwendungsnamens als Schlssel, eines Abschnittsbezeichners als Unterschlssel sowie eines Bezeichners aufgerufen und liefert einen String-Wert, der den unter dem Bezeichner abgelegten Wert wiedergibt. Ruft ein Dialogfeld auf, das den Benutzer zur Eingabe eines String-Werts auffordert und diesen als Ergebnis liefert Ldt ein Formular oder Steuerelement fr die sptere Anzeige in den Hauptspeicher. Die Methode lsst sich insbesondere fr die dynamische Erweiterung von Steuerelemente-Arrays verwenden. Ldt eine Bitmap aus einer Datei und liefert sie als Objekt vom Typ Picture. Die Methode untersttzt die gngigen Grafikformate BMP, JPG, JPEG, GIF, WMF, EMF, ICO und CUR. Ldt eine Ressource aus einer Ressourcendatei (RES) und liefert deren Daten in Form eines Byte-Arrays Ldt eine Bildressource (Bitmap, Cursor, Symbol) aus einer Ressourcendatei (RES) und liefert sie als Picture-Objekt Ldt eine Zeichenfolgenressource aus einer Ressourcendatei (RES) und liefert sie als String-Wert Liefert den zu einer QBasic-Farbe gehrigen Farbwert als Long Komponiert einen Farbwert aus den Farbanteilen Rot, Grn und Blau und liefert diesen als Long Speichert ein als Picture-Objekt vorliegendes Bild in einer Datei Speichert persistente Einstellungen des Programms in der Systemregistrierung. Die Anweisung wird unter Angabe des Anwendungsnamens, eines Abschnittsbezeichners, eines Schlssels sowie eines Schlsselwerts aufgerufen. Sendet eine Folge von Tastaturereignissen an das aktive Fenster (Formular, Steuerelement im Formular) der im Vordergrund ausgefhrten Anwendung und ermglicht so deren Fernsteuerung Ermglicht den Aufruf einer anderen Anwendung und gibt optional einen Fensterstil dafr vor Entfernt ein Formular oder Steuerelement Object aus dem Hauptspeicher

InputBox

Global- Objekt

Load

LoadPicture

LoadResData LoadResPicture LoadResString QBColor RGB SavePicture SaveSetting

SendKeys

Shell Unload

App- Objekt
Public App As App
Beschreibung

................................................... Bes c hreibung

Dem App-Objekt liegt als Datentyp die in der Bibliothek VB definierte gleichnamige Klasse App zugrunde. Visual Basic vereinbart dieses Objekt automatisch in jeder Anwendung mit globalem Geltungsbereich. Es reprsentiert die Laufzeitinstanz bei Ausfhrung der Anwendung und speichert eine Reihe von Informationen ber die Anwendung, darunter die Versions- und Herstel-

264

App- Objekt

lerinformationen und den Pfad der ausfhrbaren Datei sowie diverse Informationen ber die konkrete Laufzeitinstanz (so beispielsweise die Tatsache, ob bereits eine weitere Instanz der gleichen Anwendung in Ausfhrung ist) sowie ber das Verhalten der Anwendung im Zusammenspiel mit OLE-Servern.
Eigenschaften

................................................... Eigens c ha ften


Ein guter Teil der Eigenschaften (insbesondere die zur Laufzeit schreibgeschtzten) des AppObjekts lassen sich interaktiv im Eigenschaftsfenster PROJEKTEIGENSCHAFTEN des zugehrigen Projekts setzen. Die folgende Tabelle gibt einen berblick:

Global- Objekt

Eigenschaft Comments CompanyName EXEName FileDescription HelpFile hInstance LegalCopyright LegalTrademarks LogMode

Beschreibung Zur Laufzeit schreibgeschtzte Zeichenfolge fr Kommentare zur aktuellen Version Zur Laufzeit schreibgeschtzte Zeichenfolge fr Firmenname. Vorbesetzt mit Firmenname aus der Visual-Basic-Lizenz. Zur Laufzeit schreibgeschtzte Zeichenfolge mit dem Anwendungsnamen ohne Erweiterung Zur Laufzeit schreibgeschtzte Zeichenfolge mit Dateibeschreibung Zur Laufzeit schreibgeschtzte Zeichenfolge; enthlt Pfad fr die zur Anwendung gehrige kontextbezogene Hilfedatei. Zur Laufzeit schreibgeschtzter Handle der Laufzeitinstanz (fr Aufrufe der Win32-API) Zur Laufzeit schreibgeschtzte Zeichenfolge mit Copyrightinformationen Zur Laufzeit schreibgeschtzte Zeichenfolge mit Warenzeicheninformationen Zur Laufzeit schreibgeschtzter Protokollmodus; wird von StartLogging-Methode gesetzt. Der Wert dieser Eigenschaft ist ein Vektor und kann eine Kombination aus Werten des Aufzhlungstyps LogEventTypeConstants sein: vbLogAuto (0) Protokoll wird unter Windows 9x in durch LogPath spezifizierte Datei ausgegeben, unter Windows NT in Ereignisprotokoll (Quelle ist VBRunTime, Title wird als genauere Beschreibung der Instanz ausgegeben). vbLogOff (1) keine Protokollierung mehr, LogEvent-Aufrufe bleiben ohne Effekt vbLogToFile (2) Ausgabe in durch LogPath spezifizierte Datei; ein ungltiger Dateiname erzwingt vbLogOff; falls LogPath leere Zeichenfolge, ist vbevents.log die Vorgabe vbLogToNT (3) Ausgabe in NT-Ereignisprotokoll; erzwingt vbLogOff unter Windows 9x vbLogOverwrite (16) legt Protokolldatei bei jedem Start neu an vbLogThreadID (32) Meldungen werden um Thread-ID ergnzt (bei Multithreaded-Anwendung); erzwingt vbLogOff bei Singlethreaded-Anwendung

265

Global- Objekt

Eigenschaft LogPath Major Minor NonModalAllowed

Beschreibung Zur Laufzeit schreibgeschtzte Zeichenfolge mit Namen der Protokolldatei, wird von StartLogging-Methode gesetzt Zur Laufzeit schreibgeschtzter Wert fr primre Versionsnummer Zur Laufzeit schreibgeschtzter Wert fr sekundre Versionsnummer Laufzeiteigenschaft vom Typ Boolean ungebundene Anzeige Laufzeiteigenschaft vom Typ String fr die Spezifikation einer eigenen Meldung im Zusammenhang mit einer Zeitberschreitung bei der Bearbeitung einer Anforderung durch einen ActiveX-Server (weiteres unter OLEServerBusyRaiseError) Laufzeiteigenschaft fr die Anzahl der Millisekunden (Vorgabewert: 5 Sekunden), welche die Instanz auf die Anwort eines ActiveX-Servers wartet; gilt auch fr ActiveX-Dokumente, die via OLE-Container-Steuerelement eingebettet bzw. verknpft sind Laufzeiteigenschaft vom Typ String; Vorgabewert ist die TitleEigenschaft des Objekts Laufzeiteigenschaft vom Typ String fr die Spezifikation einer eigenen Meldung im Zusammenhang mit einer Zeitberschreitung bei einer Anforderung an einen ActiveX-Server (Weiteres unter OLEServerBusyRaiseError) Laufzeiteigenschaft vom Typ String; Vorgabewert ist die TitleEigenschaft des Objekts Laufzeiteigenschaft vom Typ Boolean bei Auftreten eines Timeouts im Verlauf einer Anforderung an einen ActiveX-Server bestimmt der Vorgabewert True dieser Eigenschaft, dass umgehend der Automatisierungsfehler -2147418111 (&H80010001) ausgelst werden soll. Bei False erscheint entweder der standardmige Dialog KOMPONENTE BESCHFTIGT (bzw. KOMPONENTENANFORDERUNG WIRD BEARBEITET) oder ein mit den Werten der Eigenschaften OLEServerBusyMsgText und OLEServerBusyMsgTitle (bzw. OLERequestPendingMsgText und OLERequestPendingMsgTitle) zusammengestellter Dialog je nachdem, ob der Wert der Eigenschaft OLEServerBusyMsgText (bzw. OLERequestPendingMsgText) die leere Zeichenfolge ist oder nicht. Jeden der Dialoge kann der Benutzer mit OK oder mit ABBRECHEN beenden. Ein Abbruch lst den genannten Automatisierungsfehler aus. Laufzeiteigenschaft fr die Anzahl der Millisekunden (Vorgabewert: 10 Sekunden), welche die Instanz auf die Anwort eines ActiveX-Servers wartet; gilt auch fr ActiveX-Dokumente, die via OLE-Container-Steuerelement eingebettet bzw. verknpft sind Zur Laufzeit schreibgeschtzte Zeichenfolge, die den vollstndigen Pfad der VBP-Projektdatei bzw. der EXE-Datei wiedergibt.

Global- Objekt

OLERequestPendingMsgText

OLERequestPendingMsgTimeOut

OLERequestPendingMsgTitle OLEServerBusyMsgText

OLEServerBusyMsgTitle OLEServerBusyRaiseError

OLEServerBusyRaiseTimeOut

Path

266

App- Objekt

Eigenschaft PrevInstance

Beschreibung Zur Laufzeit schreibgeschtzter Boolean-Wert True besagt, dass eine andere Instanz der gleichen Anwendung in Ausfhrung ist, False das Gegenteil Zur Laufzeit schreibgeschtzte Zeichenfolge fr Produktnamen Zur Laufzeit schreibgeschtzter Boolean-Wert True besagt, Laufzeitinstanz bleibt im Speicher geladen, False (Vorgabe), das Gegenteil

ProductName RetainedProject

Global- Objekt

Revision StartMode

Zur Laufzeit schreibgeschtzter Wert fr Revisionsanteil der Versionsnummer Zur Laufzeit schreibgeschtzter Wert, der besagt, ob eine Laufzeitinstanz im Stand-alone-Modus (vbSModeStandalone = 0) oder als ActiveX-Komponente (vbSModeAutomation = 1) gestartet wurde Boolean-Wert, der bestimmt, ob die Laufzeitinstanz in der Taskliste von Windows als Eintrag erscheint (True) oder nicht (False) Long-Wert mit der Thread-ID der Laufzeitinstanz (fr Aufrufe der Win32-API) String-Wert, der den Namen der Laufzeitinstanz fr die Ausgabe in der Taskliste bestimmt Zur Laufzeit schreibgeschtzter Boolean-Wert; wenn False (Vorgabe), erhlt die Anwendung eine Benutzeroberflche, sonst nicht

TaskVisible ThreadID Title UnAttendedApp

................................................... Methoden
Methoden

Sub App.StartLogging( _ LogTarget As String = "vbevents.log", LogModes As Long) Sub App.LogEvent( _ LogBuffer As String, EventType As LogEventTypeConstants) Die zwei Methoden des App-Objekts dienen der Protokollierung von Ereignissen. Sie verrichten Ihren Dienst allerdings nur, wenn das Programm als eigenstndige Exe-Datei ausgefhrt wird bei Ausfhrung der Projektdatei innerhalb der Entwicklungsumgebung sollte die LogEvent-Ausgabe laut Spezifikation in das Direktfenster stattfinden, was jedoch in der Version 6.0 (SP3) nicht passiert. Methode StartLogging LogEvent Beschreibung Legt LogTarget als Protokolldatei und LogModes als Protokollmodus fr die Ereignisaufzeichnung mittels LogEvent fest (vgl. LogModus-Eigenschaft) Protokolliert den in LogBuffer enthaltenen Text als Meldung in der Protokolldatei LogTarget der Anwendung. (Unter Windows NT schreibt die Methode in das NT-Ereignisprotokoll.) Der Parameter EventType kategorisiert die Meldung in Fehler (vbLogEventTypeError oder 1), Warnung (vbLogEventTypeWarning oder 2) bzw. Information (vbLogEventTypeInformation oder 4).

267

Global- Objekt

Anwendung

................................................... Anwendung

Global- Objekt

Als Laufzeitinstanz eines Programms ist das App-Objekt zwar das Objekt der Objekte, doch bei der Programmierung spielt es eher eine untergeordnete Rolle. Am hufigsten drften die Eigenschaften PrevInstance und Path von Interesse sein. PrevInstance gibt Aufschluss darber, ob bereits eine andere Instanz der Anwendung in Ausfhrung ist, und Path gibt Aufschluss ber den Pfad der Exe-Datei. (Der Name der Exe-Datei ergibt sich aus der Eigenschaft Title.) Ab und an sind aber auch die Mglichkeiten der Ereignisprotokollierung des App-Objekts von Nutzen, zum Beispiel wenn es darum geht, die Aktivitten eines Servers zu protokollieren. Seltener dagegen wird das App-Objekt fr die Gestaltung von Time-outs und Abbrchen bei Anforderungen an ActiveX-Server herangezogen. (Das Vorgabeverhalten ist hier in den meisten Fllen ausreichend. In speziellen Fllen, etwa wenn ActiveX-Server im Netzwerk verteilt sind, kann eine explizite Definition der entsprechenden Eigenschaften ntig sein.)
Warnung

................................................... Wa rnung

Die Time-out-Intervalle des App-Objekts lassen sich zwar beliebig ausdehnen, da die entsprechenden Eigenschaften den Typ Long tragen, doch ein zu langes Zeitintervall kann die Anwendung lahmlegen, wenn der kontaktierte Server nicht reagiert. Sollten Sie fr eine bestimmte Aufgabe die Time-outs des App-Objekts ndern mssen, empfiehlt es sich, die Werte nach Erledigung der Aufgabe umgehend wieder zu restaurieren, wenn die Anwendung mit mehr als einem ActiveX-Objekt arbeitet.
Beispiel

................................................... Beis piel

Der folgende Code verhindert den mehrfachen Start der Anwendung. Die Beschrnkung auf eine Laufzeitinstanz ist im Zusammenhang mit MDI-Anwendungen zwar nicht zwingend, aber doch weit verbreitet.
Private Sub Form_Load() If App.PrevInstance Then MsgBox ("Es gibt eine ltere Instanz der Anwendung") End End If End Sub

Der folgende Codeauszug demonstriert die Ereignisprotokollierung in eine Datei namens C:\Test.log. (Achtung: Kompilierung erforderlich).
Option Explicit Dim Nr As Long Private Sub Form_Load() App.StartLogging "C:\Test.log", 0 End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Nr = Nr + 1 App.LogEvent "Mousedown " + Str(Nr), vbLogEventTypeError End Sub

Die Ausgabe in die Datei c:\test.log hat folgende Gestalt:


Error Application C:\Test.log: Thread ID: -513437 ,Logged: Mousedown 1 Error Application C:\Test.log: Thread ID: -513437 ,Logged: Mousedown 2

268

CallByName- M ethode

CallByName- Methode
Function CallByName(Object As Object, ProcName As String, _ CallType As VbCallType, Args()) As Variant Sub CallByName(Object As Object, ProcName As String, _ CallType As VbCallType, Args())
Beschreibung

................................................... Bes c hreibung

Die globale CallByName-Methode ermglicht den Zugriff auf eine Funktion (Eigenschaft oder Methode) eines zur Laufzeit gebundenen Automatisierungsobjekts Object. Zur Spezifikation der Funktion ist ihr Bezeichner als Zeichenfolge ProcName anzugeben. Der Parameter CallType legt fest, ob die Funktion als Get, Set oder Let Property deklariert ist oder als gewhnliche Methode. Der Aufzhlungstyp VbCallType definiert dafr die Konstanten: vbMethod (1), vbGet (2), vbLet (4), vbSet (8). Etwaige Argumente fr den Aufruf lassen sich ber den Args-Parameter in Form eines Variant-Arrays oder als schlichte Parameterliste bergeben.
Anwendung

Global- Objekt

................................................... Anwendung

Der Visual-Basic-Compiler versucht, Objekte nach Mglichkeit bereits zur bersetzungszeit zu binden und Verweise auf ihre Eigenschaften und Methoden mglichst umgehend aufzulsen. Man spricht in diesem Zusammenhang von frher Bindung. Diese Art der Bindung ist aber bei COM-Objekten nicht immer mglich, etwa wenn das Objekt keine duale Schnittstelle besitzt (oder die Typbibliothek dafr nicht bekannt ist), sondern nur eine Automatisierungsschnittstelle (IDispatch) anbietet. Fr den Zugriff auf das Objekt bleibt dann nur noch die spte Bindung, das heit, die Bindung zur Laufzeit. Das ist beispielsweise der Fall, wenn der Programmierer mit Object-Verweisen hantiert und Automatisierungsobjekte zur Laufzeit via CreateObject instanziiert. Hinter der CallByName-Methode steckt brigens nichts weiter als ein Aufruf der Invoke-Funktion der IDispatch-Schnittstelle des Automatisierungsobjekts. Die CallByName-Methode ermglicht es nun, gewissermaen in letzter Sekunde auf Eigenschaften eines Objekts zuzugreifen, ohne dass diese bei der Kompilierung des Visual-Basic-Programms bekannt waren oder gar existiert haben. Auf diese Weise kann ein Programm mit maximaler Flexibilitt vom jeweils aktuellen Dienstangebot des Automatisierungsobjekts profitieren.
Beispiel

................................................... Beis piel

Da fr das Scripting-Objekt FileSystemObject eine Typbibliothek sowie eine duale Schnittstelle zur Verfgung stehen, kann der Compiler die Methoden des Objekts selbst auflsen. Wer will, kann aber die Methoden auch ber die Automatisierungsschnittstelle mit CallByName ansprechen. Die folgenden drei Print-Anweisungen leisten genau dasselbe, sie geben den gesamten Inhalt der Textdatei DateiName aus. (Da ReadAll die gesamte Datei ausliest, mssen immer zwei Print-Anweisungen auskommentiert sein.)
Set fs = CreateObject("Scripting.FileSystemObject") ' Print fs.OpenTextfile(Dateiname).ReadAll ' Datei en bloc ausgeben ' Print CallByName(fs, "OpenTextFile", VbMethod, Dateiname).ReadAll Print CallByName(CallByName(fs, "OpenTextFile", VbMethod, Dateiname), _ "ReadAll", VbMethod)
Verwandte Methoden

................................................... Verwa ndte Metho den


CreateObject, GetObject

269

Global- Objekt

Clipboard- Objekt
Public Clipboard As Clipboard
Beschreibung

................................................... Bes c hreibung

Global- Objekt

Das Clipboard-Objekt vermittelt den Zugriff auf die von allen Anwendungen gemeinsam fr den Datenaustausch genutzte Zwischenablage des Systems. Es gehrt der in der Bibliothek VB definierten gleichnamigen Klasse an und wird von Visual Basic in jeder Anwendung automatisch als globales Objekt vereinbart. Das Objekt besitzt zwei voneinander unabhngige Puffer, von denen der eine fr den Transport von Zeichenfolgen als Text, Text im RTF-Format oder DDE-Nachrichten fr OLE-Objekte gedacht ist, whrend der andere die bermittlung von Daten unterschiedlichen Formats (Grafiken oder Dateien) ermglicht. Eine zustzliche Formatinformation gibt Aufschluss ber die Art der in den Puffern enthaltenen Daten.
Methoden

................................................... Metho den


Function Clipboard.Clear() Function Clipboard.GetData( _ Format As ClipBoardConstants) As IPictureDisp Function Clipboard.GetFormat( _ Format As ClipBoardConstants) As Boolean Function Clipboard.GetText( _ [Format As ClipBoardConstants = vbCFText]) As String Sub Clipboard.SetData(Picture As IPictureDisp, _ [Format As ClipBoardConstants]) Sub Clipboard.SetText(Str As String, _ [Format As ClipBoardConstants = vbCFText]) Die sechs Methoden des Clipboard-Objekts ermglichen Zugriffe und Manipulationen der Zwischenablage (das heit: der Pufferinhalte sowie der Formatinformationen). Die folgende Tabelle gibt einen berblick ber die Aufgaben der einzelnen Methoden: Methode Clear GetData GetFormat Beschreibung Lscht alle Inhalte der Zwischenablage Liefert Grafikdaten aus der Zwischenablage Testet, ob die Zwischenablage Daten eines bestimmten Formats enthlt, und liefert True, wenn die Daten in der Zwischenablage das im Parameter bezeichnete Format tragen, ansonsten False Liefert Text (als Zeichenfolge) aus der Zwischenablage bertrgt Grafikdaten und Formatbeschreibung in die Zwischenablage bertrgt Text (als Zeichenfolge) in die Zwischenablage

GetText SetData SetText

Die folgende Tabelle gibt einen berblick ber die in Visual Basic fr das Clipboard-Objekt definierten Formatkonstanten:

27 0

Clipboard- Objekt

Formatkonstante vbCFLink vbCFRTF vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette vbCFEMetafile

Wert &HFFFFBF00 &HFFFFBF01 1 2 3 8 9 14

Beschreibung Zwischenablage enthlt Informationen fr DDE-Verbindung Zwischenablage enthlt eine RTF-Datei (Rich Text Format) Zwischenablage enthlt TXT-Datei (ASCII-Text) Zwischenablage enthlt eine Grafik vom Typ BMP (Bitmap)

Global- Objekt

Zwischenablage enthlt eine Grafik vom Typ WMF (Windows Metafile = Windows-Zwischendatei) Zwischenablage enthlt eine Grafik vom Typ DIB (gerteunabhngige Bitmap) Zwischenablage enthlt eine Farbpalette Zwischenablage enthlt eine Grafik vom Typ EMF (Enhanced Windows Metafile = erweiterte WindowsZwischendatei) Zwischenablage enthlt eine Dateiliste des Windows Explorers (wird vom Clipboard-Objekt zwar als Format angezeigt, jedoch nicht weiter untersttzt)

vbCFFiles

15

Anwendung

................................................... Anwendung

ber den Einsatz der Methode Clear muss man nicht viele Worte verlieren: Sie sollte immer dann zum Aufruf kommen, wenn der Inhalt der Zwischenablage nicht mehr vonnten ist. Sie sorgt fr die Freigabe der von dem Objekt belegten Ressourcen (die im Falle von Grafiken betrchtlich sein knnen). Die mit dem Ergebnistyp Boolean sicherlich etwas ungeschickt implementierte Methode GetFormat testet, ob die Daten in der Zwischenablage ein bestimmtes Format tragen. Nachdem die Zwischenablage allen Anwendungen gleichermaen zur Verfgung steht, ist eine solche Prfung in der Praxis unerlsslich, um Laufzeitfehlern aufgrund falscher Datenformate vorzubeugen. Die Methoden GetText und SetText dienen dem Transport von Daten im einfachen Textformat (TXT; Voreinstellung bei fehlendem Parameter Format), im Rich Text Format (RTF) sowie von Informationen, die im Zusammenhang mit DDE-Verbindungen bertragen werden. Der Imund Export von Text ist auf den Datentyp String ausgerichtet. Die Methoden GetData und SetData dienen dem Transport von Grafiken und binren Daten, die in verschiedenen Formaten vorliegen knnen. Der Im- und Export von Bitmaps ist auf den Datentyp Picture ausgerichtet und die Anzeige erfordert ein Steuerelement mit Picture-Eigenschaft. Bei dem im Prototyp der beiden Methoden genannten Datentyp IPictureDisp handelt es sich um die Automatisierungsschnittstelle des Picture-Objekts. Er stimmt in Visual Basic mit dem Datentyp Picture berein (diesen Typ liefert die TypeName-Funktion auch als Ergebnistyp der Methode GetData).
Tipp

................................................... Tipp

Das Clipboard-Objekt lsst sich auch fr die bermittlung anderer auf dem System registrierter Datenformate heranziehen. Analoges dazu finden Sie im Abschnitt OLEStartDrag-Ereignis (S. 250). Allerdings untersttzt das Clipboard-Objekt von Visual Basic nicht alle Operationen

27 1

Global- Objekt

der OLE-Zwischenablage. So zeigt es zwar an, wenn in der Zwischenablage Dateien enthalten sind (vbCFFiles), es besitzt aber keine Methoden fr den Austausch, da es (im Gegensatz zu einem DataObject-Objekt) keine Files-Eigenschaft verfgbar macht. Eine in der Zwischenablage befindliche Datei lsst sich aber in ein RTF-Steuerelement sowie in ein OLE-ContainerSteuerelement als Inhalt einfgen.
Beispiel

................................................... Beis piel

Das folgende fr seinen Funktionsumfang wirklich kurz geratene Projekt ZwischenAblage demonstriert recht eindrucksvoll den unkomplizierten Einsatz der Zwischenablage. Das Formular enthlt ein RTF-Steuerelement (RICHTX32.OCX) namens RichTextBox, ein BildausschnittSteuerelement (PICCLP32.OCX) namens PicClip1, ein Bildfeld-Steuerelement (PictureBox) namens Picture1 sowie ein Men mit den beiden Befehlen EINFGEN und KOPIEREN. Importiert man Text oder Text mit RTF-Format ber die Zwischenablage in das Programm, macht der Befehl EINFGEN diesen im RTF-Steuerelement sichtbar. (Da RTF-Steuerelemente aber auch von sich aus mit der Zwischenablage des Systems interagieren, wenn sie den Fokus haben, ist eine explizite Implementation der Zwischenablagenfunktionen eher unntig zumal der Funktionsumfang des Clipboard-Objekts in Visual Basic Einschrnkungen aufweist.) Importiert man in das Programm dagegen eine Grafik (beispielsweise einen mittels der Taste (Druck) erstellten Bildschirmabschuss), macht der Befehl EINFGEN diese im Bildfeld sichtbar. Der Befehl KOPIEREN ist dagegen so implementiert, dass er nur einen Ausschnitt des im Bildausschnitt-Steuerelement gespeicherten Bildes, nmlich 100100 Bildpunkte von links oben gesehen, in die Zwischenablage bertrgt. (Falls das Bild keine 100100 Bildpunkte hat, wird auf ein Viertel verkleinert.) EINFGEN bringt das Ergebnis dieser Operation zutage.
Private Sub mnuEinfgen_Click() If Clipboard.GetFormat(vbCFText) Then ' Text? RichTextBox1.Text = Clipboard.GetText End If If Clipboard.GetFormat(vbCFRTF) Then ' RTF-Text? RichTextBox1.TextRTF = Clipboard.GetText(vbCFRTF) End If If Clipboard.GetFormat(vbCFDIB) Then ' Grafik? PicClip1.Picture = Clipboard.GetData(vbCFDIB) Picture1 = PicClip1.Picture End If End Sub Private Sub mnuKopieren_Click() If PicClip1.Picture Then ' Bild zugewiesen? PicClip1.ClipHeight = 100 ' Bildausschnitt definieren PicClip1.ClipWidth = 100 Clipboard.SetData PicClip1.Clip, vbCFDIB ' In Zwischenablage End If End Sub
Verwandte Themen

Global- Objekt

................................................... Verwandte Them en

OLE-Drag&Drop (S. 501)

27 2

Command- M ethode

Command- Methode
Public Command As String
Beschreibung

................................................... Bes c hreibung

Die globale Command-Methode liefert die beim Aufruf der Anwendung angegebenen Kommandozeilenparameter als Zeichenfolge.
Anwendung

................................................... Anwendung

Seit Windows sind die Kommandozeile sowie die darin bergebenen Aufrufparameter zunehmend in den Hintergrund geraten. Von einer MS-DOS-Kommandozeile aus oder ber den Befehl AUSFHREN im START-Men von Windows knnen Sie eine als EXE-Datei vorliegende Anwendung aber jederzeit unter Angabe zustzlicher Kommandozeilenparameter, Schalter etc. aufrufen. Die Kommandozeile lautet:
MeinProgramm.exe Param1 Param2 Param3

Global- Objekt

Falls das Programm nicht kompiliert ist, lautet der Aufruf fr Visual Basic 6.0, der den sofortigen Start der Anwendung bewirkt und Kommandozeilenparameter bereitstellt, so:
Vb6 projekt1 /run /cmd Param1 Param2 Param3

Wenn Verzeichnisse fr Vb6.Exe und Projekt1.vbp nicht zum Suchpfad von Windows gehren (vgl. Umgebungsvariable PATH), mssen Sie natrlich die entsprechenden Pfade angeben:
"C:\Programme\Microsoft Visual Studio\VB98\Vb6" (fortgesetzt) "Vb60 Programme\Projekt1" /run /cmd Param1 Param2 Param3

In jedem der genannten Flle liefert die Command-Methode als Wert die Zeichenfolge:
"Param1 Param2 Param3"

CreateObject- Methode
Function CreateObject(Class As String, [ServerName As String]) As Object
Beschreibung

................................................... Bes c hreibung

Die CreateObject-Methode generiert eine neue Instanz des ActiveX-Objekts Class fr die Automatisierung und liefert einen Verweis vom Typ Object darauf zurck. Luft die fr das Objekt zustndige Serveranwendung zum Zeitpunkt des Aufrufs noch nicht, startet die Methode den Server. Um das Objekt (via DCOM) auf einem bestimmten Server im Netzwerk auszufhren, ist dessen Name optional ber den Parameter ServerName zu spezifizieren.
Anwendung

................................................... Anwendung

Visual Basic kann mittels CreateObject eine Bindung zur Laufzeit mit allen COM-Objekten herstellen, die ber eine Automatisierungsschnittstelle verfgen und daher Automatisierungsobjekte genannt werden. Diese Schnittstelle stellt einen standardisierten Mechanismus dar, der es einer Host-Anwendung (lies: einem Visual-Basic-Programm) ermglicht, auf eigens fr die Automatisierung exponierte Methoden und Eigenschaften des Objekts zuzugreifen, wobei die Bindung erst zur Laufzeit erfolgt. Man spricht dann von spter Bindung. Spte Bindung hat den Vorteil, dass zur bersetzungszeit auer den Bezeichnern fr das Objekt, seine Methoden und Eigenschaften nichts weiter ber das Objekt bekannt sein muss alle Informationen lassen sich zur Laufzeit ermitteln. Der Nachteil ist allerdings, dass sie einiges an Laufzeit verschlingt.
Dim fs As Object Set fs = CreateObject("Scripting.FileSystemObject")

27 3

Global- Objekt

Global- Objekt

Die meisten Automatisierungsobjekte besitzen aber eine duale Schnittstelle und ermglichen so auch eine Anbindung ber die fr die Klasse definierte Standardschnittstelle. Fr diese Art der Bindung, die bereits zur bersetzungszeit (bis auf einen einzigen Verweis auf eine zentrale Zeigertabelle) vollstndig vorbereitet werden kann und somit als frhe Bindung bezeichnet wird, muss dem Compiler allerdings die gesamte Objektdeklaration in Form einer Objektbibliothek (OLB) vorliegen. Um dem Compiler eine bestimmte Objektbibliothek zugnglich zu machen, rufen Sie das Dialogfeld VERWEISE ber das Men PROJEKT/VERWEISE auf und setzen ein Hkchen vor den gewnschten Objekttyp. Fr das Objekt Scripting.FileSystemObject wre das die Bibliothek Microsoft Scripting Runtime. ber den Aufbau des Scripting-Moduls, also die darin definierten Konstanten, Eigenschaften und Methoden, sowie die Objektstruktur der Eigenschaften, also wiederum deren Konstanten, Eigenschaften und Methoden etc., knnen Sie sich dann im Objektkatalog (aufzurufen ber ANSICHT/OBJEKTKATALOG) bis in alle Einzelheiten informieren.

Zum Scripting-Modul gehrige Objektbibliothek


Bei Verwendung der frhen Bindung deklarieren Sie die Objektvariable wie gewohnt unter Angabe eines konkreten Datentyps:
Dim fs As New Scripting.FileSystemObject

Vielfach spielt die Ausfhrungsgeschwindigkeit aber keine so groe Rolle, so dass der geringere Overhead sowie die groe Flexibilitt, die CreateObject ermglicht, nicht zu bersehende Vorteile bietet. Visual Basic ermglicht es auch, eigene ActiveX-Server zu implementieren, um anderen Anwendungen Automatisierungsobjekte zur Verfgung zu stellen. Hierfr gibt es die speziellen Projekttypen ActiveX-DLL und ActiveX-EXE.
Beispiel

................................................... Beis piel

Der folgende Code gibt den Inhalt einer Textdatei unter Verwendung des FileSystemObjectObjekts en bloc aus.

27 4

DeleteSetting- M ethode

Dim fs As Object Set fs = CreateObject("Scripting.FileSystemObject") Print fs.OpenTextfile(DateiName).ReadAll ' Datei en bloc ausgeben
Verwandte Methoden

................................................... Verwa ndte Metho den


CallByName, GetObject

DeleteSetting- Methode
Sub DeleteSetting(AppName As String, [Section As String], _ [Key As String])
Beschreibung

Global- Objekt

................................................... Bes c hreibung

Die Methode DeleteSetting ermglicht es, persistente Einstellungen eines Programms aus der Systemregistrierung wieder zu entfernen, die mittels der SaveSetting-Methode als Unterschlssel des Schlssels HKEY_CURRENT_USER\Software\VB and VBA Program Settings\ gespeichert wurden. Es gilt: AppName ist Unterschlssel von "VB and VBA Program Settings" und steht fr den Programmnamen, Section ist Unterschlssel von AppName und steht fr den Abschnitt und Key ist Bezeichner eines Werts in Section. Falls der zu lschende Schlssel, Unterschlssel oder Wert nicht existiert, lst die Methode den Laufzeitfehler 5 Ungltiger Prozeduraufruf oder ungltiges Argument aus.
Anwendung

................................................... Anwendung

Frher mussten Windows-Anwendungen ihre persistenten Einstellungen noch in je eigenen INIDateien ablegen. Sptestens seit Windows 95 (aber auch schon zuvor) gibt es eine Systemregistrierung, in der sich solche Daten an zentraler Stelle speichern lassen. Fr den Zugriff auf die Systemregistrierung von Visual Basic aus stehen im Wesentlichen vier Methoden zur Verfgung: GetSetting, GetAllSettings, SaveSetting und DeleteSetting, deren Funktion bereits durch die Bezeichner deutlich wird. Um auf andere Schlssel zuzugreifen, mssen Sie die entsprechenden Funktionen der Win32-API (RegDeleteKey, RegDeleteValue etc.) benutzen.
Beispiel

................................................... Beis piel

On Error Resume Next ' Fehler ignorieren DeleteSetting "MeineAnwendung" ' Alle Eintrge des Programms entfernen DeleteSetting "MeineAnwendung1", "Metrik" ' Abschnitt entfernen On Error Goto 0'
Verwandte Methoden

................................................... Verwa ndte Metho den


GetSetting, GetAllSettings, SaveSetting
Verwandte Themen

................................................... Verwandte Them en

Registrierung (S. 561)

27 5

Global- Objekt

DoEvents- Methode
Sub DoEvents()
Beschreibung

................................................... Bes c hreibung

Die DoEvents-Methode unterbricht die Ausfhrung der aktuellen Routine temporr, um die Behandlung gegebenenfalls anstehender Ereignisse zu ermglichen, und setzt die Routine danach wieder fort. Die Methode lsst sich als Prozedur und als Funktion verwenden. Als Funktion aufgerufen, liefert sie die Anzahl der geffneten Formulare.
Anwendung

Global- Objekt

................................................... Anwendung

Die DoEvents-Methode ist in Programmen mit nur einem einzigen Ausfhrungspfad (Thread) ein wichtiges Mittel, um die Reaktivitt der Benutzerschnittstelle auch im Verlauf lnger andauernder Operationen aufrechtzuerhalten. Da die in der Ereigniswarteschlange bereitstehenden Ereignisse immer nacheinander abgearbeitet werden, kann eine zeitintensive Routine die Behandlung anderer wartender Ereignisse sprbar (wenn nicht gar ewig) verzgern, was der Benutzer als zhe Reaktion auf seine Aktivitten zu spren bekommt. Damit zeitaufwndige Routinen quasi im Hintergrund ablaufen, fgen Sie an passender Stelle (nicht zu hufig, nicht zu selten; eine Faustregel ist: ca. jede Zehntelsekunde auf einem durchschnittlichen System) einen DoEvents-Aufruf ein.
Tipp

................................................... Tipp

In manchen Fllen lassen sich lngere Wartezeiten fr den Benutzer nicht vermeiden. Um ihm aber dennoch das Gefhl zu geben, dass etwas passiert, knnen Sie eine Fortschrittsleiste anzeigen oder zumindest die Mauszeigerform auf Sanduhr umschalten.
Warnung

................................................... Wa rnung

Wenn eine durch DoEvents unterbrochene Routine erneut aufgerufen wird, kommt es zur Rekursion. Rekursion an sich bereitet keine Probleme, solange Sie bei der Programmierung darauf achten, dass keine statischen oder globalen Variablen im Spiel sind. Wird die Rekursion jedoch zu tief, kommt es zum Laufzeitfehler Stapelberlauf. Ein weiteres Problem im Zusammenhang mit DoEvents sind die so genannten Stehaufmnnchen, die auftreten knnen, wenn Unload innerhalb einer DoEvents-Unterbrechung zur Ausfhrung kommt. In diesem Fall wird Visual Basic das Formularobjekt beim nchsten Zugriff auf eine Eigenschaft oder Methode automatisch erneut laden, und das ganze Spiel beginnt von vorne. Schlimmer noch: wenn das einmal passiert ist, lsst sich das Formular nicht mehr beenden, weil jeder Versuch es zu beenden eine neue Instanz hervorzaubert, selbst wenn keine DoEvents-Unterbrechung mehr vorliegt. (Wenn Sie es ausprobieren, mssen Sie das Programm ber das Entwicklungssystem beenden.) Sie umgehen das Problem, indem Sie den von DoEvents gelieferten Funktionswert auswerten. Dieser ist nmlich 0, wenn der Benutzer inzwischen das Formular geschlossen hat, ansonsten ungleich 0 (detailliertere Informationen dazu entnehmen Sie dem Abschnitt ApfelmannZoom eine Fahrt durch die Mandelbrotmenge, S. 478 im Praxisteil).
Beispiel

................................................... Beis piel

Die folgende Routine ist eine Variante des Apfelmnnchens, die mit regelmigen DoEventsAufrufen whrend der Bildberechnung die Benutzerschnittstelle am Leben erhlt.
Private Sub Apfel(m_x1, m_x2, m_y1, m_y2, step_x, step_y) Dim r1 As Double, re As Double, im As Double Dim zr As Double, zi As Double, it As Integer

27 6

Err- Objekt

For zr = m_x1 To m_x2 Step step_x ' alle Spalten in x-Richtung For zi = m_y1 To m_y2 Step step_y ' alle Punkte in Spalte zr re = 0 ' Realteil initialisieren im = 0 ' Imaginrteil initialisieren For it = 0 To cMaxIterat ' Iteration fr Punkt r1 = re * re im * im + zr im = 2 * re * im + zi re = r1 If re < -cGrenze Or re > cGrenze Or _ im < -cGrenze Or im > cGrenze Then PSet (zr, zi), it * 16 ' Punkt ausgeben Exit For End If Next it Next zi if DoEvents = 0 Then Exit Sub Next zr End Sub

Global- Objekt

Err- Objekt
Public Err As ErrObject
Beschreibung

................................................... Bes c hreibung

Fr den Umgang mit Laufzeitfehlern besitzt Visual Basic ein altes und eine neues Informationskonzept. Fr das alte steht die Error-Anweisung, fr das neue das Err-Objekt. Das von Visual Basic in jeder Anwendung automatisch als globales Objekt vereinbarte Err-Objekt gehrt der Klasse ErrObject aus der Bibliothek VBA an. Seine Aufgabe besteht darin, Laufzeitfehler zu signalisieren und spezifische Fehlerinformationen fr deren Behandlung bereitzustellen.
Eigenschaften

................................................... Eigens c ha ften


Das Err-Objekt verfgt ber eine Reihe von Eigenschaften fr die nhere Spezifikation eines Fehlers und dessen Behebung. Die folgende Tabelle gibt einen berblick ber alle Eigenschaften des Objekts: Eigenschaft Description HelpContext Beschreibung Zeichenfolge mit dem aktuellen Fehlertext Zeichenfolge mit der Kontextkennung fr das aktuelle Hilfethema in Hilfedatei. Wenn leer, wird die Kontextkennung ber den Wert von Number ermittelt. Zeichenfolge mit dem Zugriffspfad fr die Hilfedatei. Wenn leer, wird die Visual-Basic-Hilfedatei benutzt. zur Laufzeit schreibgeschtzter Long-Wert, der den Rckgabewert der zuletzt aufgerufenen DLL-Routine bermittelt. Die Bedeutung des Rckgabewerts ist der Dokumentation der entsprechenden Funktion zu entnehmen (vgl. Routinen aus DLLs und der Windows-API einsetzen, S. 185). Wert vom Typ Long mit der aktuellen Fehlernummer

HelpFile LastDllError

Number

27 7

Global- Objekt

Eigenschaft Source

Beschreibung Zeichenfolge mit dem Klassennamen des den Fehler signalisierenden Objekts (gegebenenfalls Objekt-ID) oder dem Namen des Programmmoduls; hilfreich, wenn keine modulinterne Behandlung des Fehlers erfolgt

Ein explizites Setzen der Eigenschaften erbrigt sich, da alle Eigenschaften im Zuge des RaiseAufrufs mit einem Wert versorgt werden knnen.
Methoden

Global- Objekt

................................................... Metho den


Sub Err.Clear () Sub Err.Raise(Number, _ [Source], [Description], [HelpFile], [HelpContext]) Die Methode Clear ermglicht es, das Err-Objekt in den Grundzustand zurck zu versetzen. Das ist beispielsweise im Zusammenhang mit der Anweisung On Error Resume Next erforderlich, wenn eine Inline-Fehlerbehandlung unmittelbar im Anschluss an eine Anweisung erfolgt. Die Methode Raise lst einen Laufzeitfehler mit der Nummer Number aus. Die benannten Parameter der Methode setzen die gleichnamigen Eigenschaften des Objekts. Der Wertebereich fr Visual-Basic-Fehler liegt zwischen 0 und 65.535, wobei der Bereich zwischen 0 und 512 fr Systemfehler reserviert ist, so dass fr benutzerdefinierte Fehler der Bereich zwischen 513 und 65.535 brig bleibt. In Klassenmodulen arbeitet man mit Fehlernummern, die den Offset vbObjectError haben.
Anwendung

................................................... Anwendung

Das Err-Objekt stellt gegenber dem traditionellen Fehlermechanismus von Visual Basic eine Verfeinerung dar, weil es eine bessere Kontrolle ber den Kontext eines Fehlers bietet. Am Fehlerbehandlungsmechanismus von Visual Basic ndert das Err-Objekt jedoch nichts (Einzelheiten dazu im Abschnitt Fehlerbehandlung, S. 43). Mit Ausnahme der Eigenschaft LastDllError, die nur im Zusammenhang mit Aufrufen der Win32-API eine Bedeutung hat, lassen sich die Eigenschaften des Fehlerobjekts an beliebiger Stelle in einer Funktion/Prozedur setzen. Im Allgemeinen wird man die Werte fr die diese Eigenschaften bei einem Raise-Aufruf bereitstellen. Beachten Sie aber, dass die Anweisungen Exit Function, Exit Sub, Exit Property sowie Resume Next implizit einen Clear-Aufruf des Err-Objekts veranlassen, so dass die Eigenschaften jedes Mal neu gesetzt werden mssen.
Tipp

................................................... Tipp

Die Fehlerbehandlung sollte bei der Entwicklung eines Programms von Anfang an einen sehr hohen Stellenwert haben. Testen Sie Ihre Fehlerroutinen ausgiebig auf alle Spezialflle und schlieen Sie aus, dass eine Fehlerbehandlungsroutine in die Verlegenheit kommt, Fehler zu behandeln, fr die sie nicht ausgelegt ist.
Beispiel

................................................... Beis piel ................................................... Verwandte Them en

Vgl. das Beispiel zu dem Thema Fehlerbehandlung (S. 43)


Verwandte Themen

Fehlerbehandlung (S. 43)

27 8

Forms- Auflistung

Forms- Auflistung
Forms As Object
Beschreibung

................................................... Bes c hreibung

Die nicht mit dem Datentyp Collection kompatible Forms-Auflistung enthlt eine Liste der aktuell von der Anwendung instanziierten Formularobjekte gewhnliche Formulare, MDIFormulare, MDI-Formularen untergeordnete Formulare. Elementtyp ist der Klassenname (Formularname) der jeweiligen Instanz. Einzige Eigenschaft der Auflistung ist Count, ber die sich die Anzahl Listenelemente in Erfahrung bringen lsst. Um die Pflege der Auflistung kmmert sich das Laufzeitsystem (im Rahmen von Load), so dass sie jederzeit auf dem neuesten Stand ist.
Anwendung

Global- Objekt

................................................... Anwendung

Sie knnen die Auflistung Forms mit einem For Each-Konstrukt durchlaufen, um festzustellen, welche Formulare es gibt, oder um beispielsweise den Anwendungsfokus an ein bestimmtes Formular weiterzureichen. Als Datentyp fr die Laufvariable vereinbaren Sie Object oder besser Form.
Beispiel

................................................... Beis piel

Dim Formular As Form For Each Formular In Forms Print Formular.Caption Next
Verwandte Themen

................................................... Verwandte Them en

Auflistungen und Collection-Objekte (S. 304)

GetAllSettings- Methode
Function GetAllSettings(AppName As String, Section As String) _ As String()()
Beschreibung

................................................... Bes c hreibung

Die Methode GetAllSettings ermglicht die Abfrage aller zum Abschnitt (Unterschlssel) Section gehrigen persistenten Einstellungen eines Programms AppName, die mittels der SaveSetting-Methode als Unterschlssel des Schlssels HKEY_CURRENT_USER\Software\VB and VBA Program Settings\ gespeichert wurden. Die Methode liefert ihr Ergebnis in einem zweidimensionalen Zeichenfolgenarray mit nullbasiertem Index, wobei in der ersten Dimension die Bezeichner der Werte und in der zweiten Dimension die Daten zu den Werten enthalten sind. Falls ein Schssel nicht existiert oder keine Werte enthlt, liefert die Methode den Wert Empty.
Anwendung

................................................... Anwendung

Frher mussten Windows-Anwendungen ihre persistenten Einstellungen noch in je eigenen INIDateien ablegen. Sptestens seit Windows 95 (aber auch schon zuvor) gibt es eine zentrale Systemregistrierung, in der sich solche Daten an zentraler Stelle speichern lassen. Fr den Zugriff auf die Systemregistrierung von Visual Basic aus stehen im Wesentlichen vier Methoden zur

27 9

Global- Objekt

Verfgung: GetSetting, GetAllSettings, SaveSetting und DeleteSetting, deren Funktion bereits durch die Bezeichner deutlich wird. Um auf andere Schlssel zuzugreifen, mssen Sie die entsprechenden Funktionen der Win32-API (RegOpenKeyEx etc.) benutzen.
Beispiel

................................................... Beis piel

Der folgende Code fgt vier Werte unter dem Schlssel Abschnitt in die Registrierung ein. Danach liest er sie wieder mittels GetAllSettings, gibt sie aus und lscht sie schlielich en bloc.
Dim a, i SaveSetting "MeineAnwendung", "Abschnitt", "Wert", 10 SaveSetting "MeineAnwendung", "Abschnitt", "Wert1", 20 SaveSetting "MeineAnwendung", "Abschnitt", "Hhe", 100 SaveSetting "MeineAnwendung", "Abschnitt", "Breite", 100 a = GetAllSettings("MeineAnwendung", "Abschnitt") If not IsEmpty(a) Then For i = 0 To UBound(a) Print a(i, 0) & " = " & a(i, 1) Next i End If DeleteSetting "MeineAnwendung"
Verwandte Methoden

Global- Objekt

................................................... Verwa ndte Metho den


DeleteSetting, GetSetting, SaveSetting
Verwandte Themen

................................................... Verwandte Them en

Registrierung (S. 561)

GetObject- Methode
Function GetObject([PathName As String], _ [AnwName.ObjektTyp As String]) As Object
Beschreibung

................................................... Bes c hreibung

Die GetObject-Methode liefert die Referenz auf ein ActiveX-Objekt (Automatisierungsobjekt) mit registrierter Klasse. Existiert das Objekt bereits als Datei, lsst es sich unter Angabe des entsprechenden Dateinamens (PathName) ffnen, was dazu fhrt, dass die fr das Objekt zustndige (lies: fr den Objekttyp registrierte) Serveranwendung automatisch gestartet wird. Optional lsst sich ber den zweiten String-Parameter die Klasse des zu aktivierenden Objekts noch genauer spezifizieren, falls in der Datei mehrere Objekte enthalten sind. Ist Pathname die leere Zeichenfolge, muss der zweite Parameter in jedem Fall angegeben sein, da die Methode dann eine Referenz auf ein neues Objekt dieser Klasse liefert.
Beispiel

................................................... Beis piel

Der folgende Code organisiert eine Referenz auf ein Word-Dokument sowie auf eine CorelDRAW-Zeichnung:
Dim Wdoc As Object, CorelDoc As Object Set Wdoc = GetObject("\Eigene Dateien\Basic.doc") Set Wdoc = GetObject("Zeichnung.cdr", "CorelDRAW.Graphic.7")

280

GetSetting- M ethode

Einige Anwendungen ermglichen es auch, einzelne Eigenschaften eines gegebenen Objekts zu aktivieren. Der Name der Eigenschaft wird dann durch ein Ausrufezeichen abgetrennt hinten angefgt.

GetSetting- Methode
Function GetSetting(AppName As String, Section As String, _ Key As String, [Default]) As String
Beschreibung

................................................... Bes c hreibung

Die GetSetting-Methode entspricht von der Funktionalitt her der GetAllSettings-Methode, mit dem Unterschied, dass sie nur die Daten zu einem bestimmten Wert Key des Abschnitts (Unterschlssels) Section liefert. Als Vorgabe fr den Fall, dass der Eintrag Key nicht existiert, kann der optionale Parameter Default angegeben werden.
Beispiel

Global- Objekt

................................................... Beis piel

Print GetSetting ("MeineAnwendung", "Abmessungen", "Breite", 100)


Verwandte Methoden

................................................... Verwa ndte Metho den