Diverser Code in Classic Visual Basic
- Ermitteln des Textinhalts eines Word-Dokuments
- Öffnen einer Website im Standardwebbrowser
- Drucken von Text mit Ausrichtung
- Zeilenweises Ausdrucken einer Textdatei
- Abspielen einer Melodie auf dem Systemlautsprecher
- Formatieren von Zahlen für die Ausgabe
- Umstellen des Papierformats in Word-VBA
- Ermitteln der Zeitdifferenz zwischen jetzt und einem anderen Zeitpunkt
- Benutzen eines Excel-Arbeitsblatts als Datenbank
- Vertauschen zweier Zahlen
- Korrekte Verwendung der Funktion
Now
- Kaufmännisches Runden von Zahlen
- Entfernen eines Eintrags aus einem Array
- Umwandeln von vorzeichenlosen in vorzeichenbehaftete Ganzzahlen
- Zurücksetzen von Objekten für ihre erneute Verwendung
- Vergleichen zweier Instanzen eines benutzerdefinierten Datentyps
Ermitteln des Textinhalts eines Word-Dokuments
Um den Text, der in einem Word-Dokument enthalten ist, zu bestimmen, kann Word automatisiert werden. Im Folgenden ist der Quellcode einer Prozedur GetWordDocumentText
angegeben, die das Dokument öffnet, den Text ausliest und ihn als Rückgabewert der Funktionsprozedur zurückgibt. Es ist zu beachten, daß die Implementierung unoptimiert und nur als Lösungsskizze zu verstehen ist:
Soll lediglich ein Word-Dokument im Textformat gespeichert werden, kann auf folgenden Code zurückgegriffen werden:
Öffnen einer Website im Standardwebbrowser
Die Funktion ShowWebsite
kann eingesetzt werden, um eine Website im Standardbrowser anzuzeigen:
Drucken von Text mit Ausrichtung
Um Text mit Ausrichtung auf dem Drucker auszugeben, kann folgende Funktion verwendet werden:
Der Aufruf zum Ausdrucken von zentriertem Text könnte dann folgendermaßen aussehen:
Zeilenweises Ausdrucken einer Textdatei
Diese Funktion wird verwendet, um eine Textdatei zeilenweise auf dem Drucker auszugeben. Tritt dabei ein Fehler auf, wird die Fehlernummer zurückgegeben:
Abspielen einer Melodie auf dem Systemlautsprecher
Unter Windows NT/Me/2000 ist es wieder möglich, Töne über den internen Lautsprecher des PCs auszugeben. Dies kann über die API-Funktion Beep
geschehen. Damit läßt sich leicht der PLAY
-Befehl von QuickBasic nachbauen:
Formatieren von Zahlen für die Ausgabe
Die Anweisung Format$
kann verwendet werden, um Zahlen für die Ausgabe zu formatieren. Folgendes Beispiel zeigt, wie Zahlen schön nach dem Dezimaltrennzeichen rechts ausgerichtet werden, wie dies bei Rechnungen der Fall ist:
Die Ausgabe würde wie folgt aussehen:
Folgender Code richtet die beiden Zahlen rechts bzw. links aus:
Die Ausgabe würde dann aussehen, wie unten angegeben:
Umstellen des Papierformats in Word-VBA
Mit nachfolgendem Makro kann das Papierformat eines Dokuments zwischen Hoch- und Querformat umgeschaltet werden:
Ermitteln der Zeitdifferenz zwischen jetzt und einem anderen Zeitpunkt
Die im Folgenden angegebene Funktion kann verwendet werden, um zu berechnen, wie lange es noch bis zu einem bestimmten Zeitpunkt dauert bzw. wieviel Zeit seither vergangen ist. Als Ausgabe wird eine formatierte Zeichenfolge mit der Zeitdifferenzangabe zurückgegeben, die Differenz wird intern über die Visual-Basic-Funktion DateDiff
errechnet:
Benutzen eines Excel-Arbeitsblatts als Datenbank
Auch wenn es manche nicht glauben, man kann auch Excel-Dateien mit ADO als Datenbank einsetzen:
Excel verwaltet sich intern als Datenbank, die Funktionen werden nur von Excel draufgesetzt. Aber nicht desto trotz sollte man nach Möglichkeit davon absehen, Excel als Datenbank zu nutzen.
Vertauschen zweier Zahlen
Um Zahlen zu vertauschen, stehen mehrere Möglichkeiten zur Verfügung. Die am öftesten verwendete Methode benutzt eine temporäre Variable, in die zuerst der Wert der ersten Variable abgelegt wird, dann wird diese Variable mit der anderen überschrieben, danach wird der zweiten Variablen der Wert der temporären Variablen zugewiesen. Im Folgenden wird ein Code angegeben, der dieses Verfahren implementiert:
Die oben angegebene Methode läßt sich auch bei anderen Datentypen einsetzen. Störend an diesem Verfahren ist die temporäre Variable, die immer neu angelegt werden muß. Klarerweise kann man diese durch eine globale Variable ersetzen, die immer wiederverwendet wird. Betrachtet man aber die Subtraktion von Zahlen genauer, kann man feststellen, daß sich die neuen Werte der beiden Variablen durch folgende Gleichungen ausdrücken lassen:
Mit diesem Wissen kann man den folgenden Algorithmus zum Austauschen der Werte der Variablen formulieren:
Der Operator Swap
ist zwar gut und schön, allerdings gibt es doch einige Dinge, die beachtenswert sind:
Die Verwendung mit Gleitpunktzahlen ist nicht zu empfehlen, da sich numerische Rechenfehler ergeben können. In diesem Fall sollte das herkömmliche Verfahren zum Austauschen verwendet werden.
Es ist sicherzustellen, daß die Variablen Werte in einem vom Datentyp abhängigen Bereich besitzen, da es sonst zu Bereichsüberschreitungen kommen kann. Folge sind falsche Resultate.
Eine weitere Variante ist eine andere Schreibweise des vorigen Beispiels: Man verwendet dabei anstelle der numerischen Operationen bitweise exklusive Oder-Verknüpfungen. Dieses Verfahren ist in Visual Basic 6.0 sogar schneller als die Version mit den numerischen Operatoren.
Korrekte Verwendung der Funktion Now
Vorsicht mit dem Gebrauch der Funktion Now
. Probieren Sie die folgenden beiden Beispiele:
Das obige Beispiel funktioniert nur vor 12 Uhr mittags, sollte es später sein, so rundet Visual Basic auf den nächsten Tag auf, da die Funktion Now
einen Wert des Typs Variant
liefert, der in diesem Fall auf den nächsten Tag aufgerundet wird. Mit der Int
-Anweisung kann Abhilfe geschaffen werden:
Kaufmännisches Runden von Zahlen
Die Round
-Funktion kann nicht kaufmännisch runden. Folgendes Beispiel würde 2 als Ergebnis liefern:
Verwendet man jedoch die die folgende Funktion, erhält man den kaufmännisch gerundeten Wert 3. Bei negativen Zahlen wird ein eigentlich nicht korrektes Resultat zurückgegeben, der Leser kann sich aber leicht überlegen, wie der Code richtig aussehen müßte:
Entfernen eines Eintrags aus einem Array
Folgende Funktion kann eingesetzt werden, um ein Element aus einem Array zu entfernen. Es werden dabei alle nachfolgenden Elemente um einen Platz nach vor kopiert und das letzte Element entfernt. Diese Funktion hat aber im schlimmsten Fall lineare Laufzeit. Muß man aus einem Array Elemente entfernen, kann ggf. die Datenstruktur der linearen Liste bessere Resultate liefern, da hier die selbe Operation in konstanter Zeit durchgeführt werden kann, weil keine Elemente kopiert werden müssen:
Der Aufruf könnte folgendermaßen erfolgen:
Umwandeln von vorzeichenlosen in vorzeichenbehaftete Ganzzahlen
Um einen vorzeichenlosen Integer
(im Bereich von 0 bis 65.536) in einen Visual-Basic-Integer
zu konvertieren, um ihn z. B. an API-Funktionen zu übergeben, kann folgende Funktion verwendet werden:
Zurücksetzen von Objekten für ihre erneute Verwendung
Bei der Verwendung von eigenen Klassen in Schleifen kommt es oft vor, daß nach jedem Durchlauf die Eigenschaften des Objekts zurückgesetzt werden. Im schlimmsten Fall handelt es sich dabei um eine große Anzahl von Eigenschaften und Variablen, die entweder öffentlich zugänglich sind oder innerhalb der Klasse durch eigene Methoden auf bestimmte Startwerte gesetzt werden. In diesem Fall werden viele Programmierer auf eine bedeutend einfachere Methode zurückgreifen.
Nehmen wir an, wir müssen in einer Schleife 1.000 mal eine Klasse einsetzen, um bestimmte Operationen durchzuführen. Zu beachten ist, daß wir an Position (1) im folgenden Code immer erwarten, daß alle internen Variablen der Klasse zurückgesetzt sind. Anstatt eine aufwendige Reset
-Prozedur zu implementieren, die auch noch bei Änderungen der Mitglieder der Klasse angepaßt werden muß, machen es sich viele Programmierer leichter und setzen nach jedem Schleifendurchlauf die Klasse auf das Schlüsselwort Nothing
, wodurch der Speicher freigegeben wird und damit auch alle Variablen gelöscht werden. Anschließend wird am Anfang der Schleife der Variablen dann wieder eine neue Instanz der Klasse zugewiesen:
Zusammenfassend kann gesagt werden, daß im obenstehenden Code immer für jeden Schleifendurchlauf Speicher (und das kann bei einer umfangreichen Klasse gar nicht so wenig sein) freigegeben und anschließend wieder neu belegt werden muß. So schnell Speicheroperationen auch sind, bei einer großen Anzahl von Durchläufen kann dies bereits sehr viel Zeit in Anspruch nehmen.
Wie bereits erwähnt, wäre es in den meisten Fällen effizienter, eine eigene Reset
-Methode bzw. mehrere spezifische Reset
-Methoden zu programmieren, in denen dann nur die entsprechenden Variablen zurückgesetzt werden. Dadurch entfällt die Freigabe des Speichers, das erneute Anfordern und das Setzen der Variablen auf die Anfangswerte. Der Code würde dann folgendermaßen aussehen:
Vergleichen zweier Instanzen eines benutzerdefinierten Datentyps
Variablen und Konstanten des gleichen Datentyps können mit dem Operator =
auf Gleichheit getestet werden. Bei benutzerdefinierten Datentypen ist dies nicht so einfach möglich. Ein Ansatz, trotzdem zwei „Instanzen“ eines benutzerdefinierten Typs auf Gleichheit zu überprüfen besteht darin, die von den beiden Strukturen belegten Speicherbereiche in jeweils einer Zeichenfolge zu kopieren und diese dann zu vergleichen: