Code zu Steuerelementen in Classic Visual Basic
- Manipulieren des Eingabefeldes von ComboBox-Steuerelementen
- Ändern von Fensterstilen
- Verwenden eines ScrollBar-Steuerelements als Größenänderungsdreieck
- Ausrichten der Beschriftung von Steuerelementen
- Arbeiten mit der
Controls
-Auflistung - Definieren aktiver Regionen innerhalb eines Bildes
- Beschränken der Eingabe eines Textfeldes auf Zahlen
- Markieren des Inhalts eines Textfeldes bei Fokuserhalt
- Anwenden von Standardoperationen auf ein TextBox-Steuerelement
- Unterbinden des Pieptons bei Drücken der Eingabetaste in einem TextBox-Steuerelement
- Schnelles Füllen von ListBox- und ComboBox-Steuerelementen
- Aktivieren von Steuerelementen ohne Laufzeitfehler
- Entfernen des Rahmens eines WebBrowser-Steuerelements
- Entfernen der Bildlaufleisten eines WebBrowser-Steuerelements
- Entfernen des Kontextmenüs eines WebBrowser-Steuerelements
- Die Verlaufsliste des WebBrowser-Steuerelements
- Bestimmen der ausgewählten Option in einem Array von Optionsfeldern
- Anzeigen von Laufwerken, Ordnern und Dateien in einem ListBox-Steuerelement
- Suchen eines Eintrags in einem ListBox-Steuerelement
- Mehrzeilige Textfelder und Standardschaltflächen
- Drehen einer Linie um einen Punkt
- Kopieren des Textes des aktiven Steuerelements in die Zwischenablage
- Erstellen von 3D-Trennlinien
- Anpassen der Höhe eines Label-Steuerelements an den darzustellenden Text
- Unterscheiden zwischen „normaler“ Eingabetaste und jener am Ziffernblock
- Entfernen von Einträgen aus einem DriveListBox-Steuerelement
- Setzen von Tabulatoren in einem TextBox-Steuerelement
Manipulieren des Eingabefeldes von ComboBox-Steuerelementen
Das ComboBox-Steuerelement unter Visual Basic bietet keine Möglichkeit, die Länge des eingegebenen Textes zu begrenzen, das Textfeld für Eingaben zu sperren oder den eingegebenen Text mit einem Platzhalterzeichen unlesbar zu machen. Über die API-Funktion SendMessage
kann diese Funktionalität nachgerüstet werden:
Ändern von Fensterstilen
Visual Basic bietet keine Möglichkeit der direkten Manipulation der Fensterstile von Formularen und Steuerelementen. Die nachfolgend angegebene Prozedur SetStyleBits
vereinfacht das Setzen von normalen und erweiterten Fensterstilen:
Verwenden eines ScrollBar-Steuerelements als Größenänderungsdreieck
Fenster, die in der Größe geändert werden können, besitzen vielfach ein Größenänderungsdreieck, das sich in der rechten unteren Ecke eines Fensters befindet. Es gibt verschiedene Möglichkeiten, ein solches Dreieck in mit Visual Basic erstellten Anwendungsfenstern zu erzeugen. Ein ausgefallener Weg bedient sich dazu einer Bildlaufleiste, die durch Manipulation ihrer Fensterstile und ihrer Eigenschaften in ein Größenänderungsdreieck verwandelt wird. Die Vorgehensweise funktioniert sowohl mit horizontalen als auch vertikalen Bildlaufleisten. Das folgende Beispiel setzt voraus, daß sich auf dem Formular eine Bildlaufleiste mit Namen HScroll1
befindet:
Wurde das Aussehen erst einmal angepaßt, muß noch dafür gesorgt werden, daß das Dreieck immer in der rechten unteren Ecke des Fensters gehalten wird, wenn sich dieses in seiner Größe ändert. Dazu wird in der Behandlungsroutine des Resize
-Ereignisses des Formulars die Bildlaufleiste neu positioniert.
Ausrichten der Beschriftung von Steuerelementen
Einige Steuerelemente unterstützen direkt das Ändern der Ausrichtung ihrer Beschriftung mittels Eigenschaften. Manche Steuerelemente besitzen jedoch keine derartigen Eigenschaften. Für Steuerelemente, die sich von der Fensterklasse BUTTON
ableiten, wie etwa Schaltflächen, Rahmen, Auswahlfelder und Optionsfelder, kann über die im Folgenden vorgestellte Technik die Ausrichtung der Beschriftung festgelegt werden:
Arbeiten mit der Controls
-Auflistung
Die Steuerelemente eines Formulars können über dessen Controls
-Auflistung durchlaufen werden. Dabei ist es auch möglich, auf Eigenschaften eines Steuerelements, von dem nur der Name als Zeichenfolge bekannt ist, zuzugreifen bzw. diese zu manipulieren. Das folgende Beispiel ändert die Enabled
-Eigenschaften der Steuerelemente mit den Namen Command1
bis Command6
:
Einzelne Elemente aus Steuerelementenfeldern können angesprochen werden, wie das folgende Beispiel zeigt. Hier wird immer das Element mit Index 2 deaktiviert:
Das folgende Beispiel setzt die Text
-Eigenschaften aller Textfelder des Formulars auf die leere Zeichenfolge:
Es ist auch möglich, Steuerelemente zur Laufzeit in die Controls
-Auflistung aufzunehmen. Im folgenden Beispiel wird eine ereignissensitive Schaltfläche erzeugt:
Definieren aktiver Regionen innerhalb eines Bildes
In verspielten Oberflächen kommen oft Bilder zum Einsatz, bei denen der Benutzer auf bestimmte Stellen klicken kann, um eine Aktion auszulösen. Das ist auch einfach in Visual-Basic-Anwendungen realisierbar, indem auf einem PictureBox-Steuerelement, das die Grafik enthält, Label- oder Image-Steuerelemente in der Größe der aktiven Region plaziert werden. Die Eigenschaft BackStyle
muß auf transparent und die Eigenschaft BorderStyle
auf vbBSNone
festgelegt werden. Weiters sollten vorhandene Steuerelementbeschriftungen gelöscht werden. Nun können wie gewohnt die Ereignisse MouseMove
und Click
des Label-Steuerelements ausgewertet werden.
Beschränken der Eingabe eines Textfeldes auf Zahlen
Wenn in ein Textfeld nur Zahlen eingegeben werden sollen, dann muß dafür nicht unbedingt ein zusätzliches Steuerelement, wie etwa MaskedEdit, herangezogen werden. Diese Funktionalität läßt sich auch mit wenigen zusätzlichen Zeilen Quellcode realisieren. Die beiden vorgestellten Lösungen sind nicht immun gegen das Einfügen von beliebigem Text über die Zwischenablage.
Wichtig ist dabei das Ereignis KeyPress
des TextBox-Steuerelements. Es wird für ein Steuerelement ausgelöst, wenn eine Taste gedrückt wurde und es gerade den Fokus besitzt. Im Parameter KeyAscii
wird der Code des Zeichens übergeben, welcher der gedrückten Taste entspricht. Wird dieser Parameter in der Prozedur KeyPress
auf 0 gesetzt, so wird der Tastendruck ignoriert und das Zeichen erscheint nicht im Textfeld. Mit der Funktion InStr
kann die Eingabe auf beliebige Zeichen eingeschränkt werden:
In diesem Beispiel wurde auch noch Chr$(vbKeyBack)
an die Zeichenfolge der erlaubten Zeichen angehängt, damit mit der Löschtaste eingegebene Zeichen auch wieder gelöscht werden kann. Wenn die Umwandlung des Zeichens mit Chr$(KeyAscii)
zu umständlich oder zu langsam ist, kann stattdessen direkt den Zeichencode geprüft werden. Dies führt jedoch zu schwerer lesbarem Code (die Zahlen 0 bis 9 entsprechen den Zeichencodes 48 bis 57):
Markieren des Inhalts eines Textfeldes bei Fokuserhalt
Um den gesamten Inhalt eines Textfeldes zu markieren, wenn dieses den Fokus erhält, können zwei Methoden verwendet werden. Dabei bezeichnet Text1
das TextBox-Steuerelement:
Anwenden von Standardoperationen auf ein TextBox-Steuerelement
Um Standardfunktionen wie Kopieren, Einfügen und Ausschneiden auf ein TextBox- oder RichTextBox-Steuerelement anzuwenden, bietet sich die generische Routine DoEdit
an:
Unterbinden des Pieptons bei Drücken der Eingabetaste in einem TextBox-Steuerelement
Nach dem Drücken der Eingabetaste in einem Textfeld erfolgt kein Beep:
Schnelles Füllen von ListBox- und ComboBox-Steuerelementen
Die von Visual Basic bereitgestellten Methoden der ListBox-Klasse sind sehr langsam im Vergleich zu den entsprechenden Windows-API-Funktionen. Damit folgendes Beispiel funktioniert wird ein Formular mit einer Schaltfläche cmdFillList
und eine ListBox List1
benötigt. Damit das Beispiel auch mit Kombinationsfeldern funktioniert, muß anstelle von LB_ADDSTRING
die Konstante CB_ADDSTRING = &H143&
verwendet werden. In diesem Beispiel wird außerdem zuerst ein Informationstext der ListBox hinzugefügt, die Aktualisierung der ListBox unterbunden, die Elemente hinzugefügt, das Informationselement entfernt und die Fensteraktualisierung wieder aktiviert:
Aktivieren von Steuerelementen ohne Laufzeitfehler
Die SetFocus
-Methode der Steuerelemente unter Visual Basic hat einen großen Nachteil: Ist beispielsweise das Steuerelement, dessen Methode SetFocus
aufgerufen wurde, nicht sichtbar oder deaktiviert, so löst der Aufruf über Control1.SetFocus
(Control1
bezeichnet hier ein Steuerelement) einen Laufzeitfehler aus. Dies kann umgangen werden, indem der Fokus über die API-Funktion SetFocus
gesetzt wird. Der Rückgabewert dieser Funktion gibt Auskunft über den Erfolg, der aber normalerweise uninteressant ist:
Um den Fokus auf Control1
zu setzen, wird dann folgender Code verwendet:
Entfernen des Rahmens eines WebBrowser-Steuerelements
Das WebBrowser-Steuerelement hat standardmäßig eine Clientkante als Rahmen, aber es besitzt keine Eigenschaft BorderStyle
, um diesen Rahmen zu entfernen oder zu ändern. Dies ist besonders dann notwendig, wenn die Formularoberfläche eine HTML-Seite sein soll. Dabei sollte der Übergang zwischen HTML-Dokument und Formular möglichst unsichtbar sein.
Die intuitive Lösung zum Entfernen des Rahmens ist denkbar einfach, allerdings nicht sehr professionell: Man erstellt vier rahmenlose Frame-Steuerelemente und plaziert sie so über dem WebBrowser-Steuerelement, daß dessen Rahmen überdeckt wird. Dazu sollte der Rahmen der Frames entfernt werden und die Hintergrundfarbe auf vbButtonFace
eingestellt werden.
Jedoch gibt es auch eine professionelle Lösung, den Rahmen vom Steuerelement weg zu bekommen. Der 3D-Rahmen sowie die horizontale Bildlaufleiste, die selbst dann angezeigt wird, wenn sie nicht benötigt wird, sind nämlich nicht Teil des Steuerelements sondern des darin angezeigten Dokument. Für eine Änderung des Rahmens ist es also erforderlich, daß bereits ein Dokument in das Steuerelement geladen wurde und über die Document
-Eigenschaft bereitsteht. Dies ist mit Eintritt des Ereignisses DocumentComplete
des WebBrowser-Steuerelements gegeben. In diesem Ereignis kann daher die Eigenschaft border
des Document
-Objekts, die sich über Document.body.style.border
erreichen läßt, ändern:
Entfernen der Bildlaufleisten eines WebBrowser-Steuerelements
Die dauerhaft angezeigte Bildlaufleiste kann in gleicher Weise im DocumentComplete
-Ereignis beeinflußt werden: Soll sie nur dann angezeigt werden, wenn sie benötigt wird, um durch den Inhalt scrollen zu können, kann hierfür die Eigenschaft Document.body.scroll
auf "auto"
gesetzt werden; soll die Leiste hingegen nie angezeigt werden, dann kann dazu der Wert "no"
angegeben werden. Im folgenden Beispiel wird eingestellt, daß die Bildlaufleiste nur bei Bedarf sichtbar ist:
Entfernen des Kontextmenüs eines WebBrowser-Steuerelements
Bei HTML-Oberflächen in Anwendungen ist es meist vorteilhaft, wenn der Benutzer keine Möglichkeit hat, Text und andere Dokumentelemente zu kopieren. Der Mauszeiger kann in der HTML-Datei auf default
gesetzt werden, weiters muß jedoch die Auswahl unterbunden werden. Dazu kann man den gesamten Inhalt der HTML-Datei in eine Tabelle schreiben, die folgendermaßen aussieht (wichtig dabei ist der nicht korrekt geschlossene Hyperlink!):
Jetzt muß nur mehr das Kontextmenü des WebBrowser-Steuerelements entfernt werden. Dies ist über JavaScript möglich. Das öffnende body
-Element müßte folgendermaßen modifiziert werden:
Befehle des WebBrowser-Steuerelements
Der Inhalt eines WebBrowser-Steuerelements kann gedruckt oder ausgewählt werden. Es gibt auch noch zahlreiche andere Funktionen, die über die Methode ExecWB
ausgeführt werden können. Der nachstehende Code zeigt, wie man den gesamten Inhalt eines WebBrowser-Steuerelements auswählt und wie man eine HTML-Datei damit ausdruckt:
Die Verlaufsliste des WebBrowser-Steuerelements
Das WebBrowser-Steuerelement besitzt u. a. die Methode Navigate
, bei der im zweiten Parameter Flags angegeben werden können. Wird die Konstante navNoHistory
hier angegeben, fügt das WebBrowser-Steuerelement die Seite, zu der navigiert wird, nicht der Verlaufsliste hinzu. Bei einigen Programmierern führt dies zur großen Verwunderung, da die besuchte Seite trotzdem in der Verlaufsliste aufscheint.
Daher soll hier darauf hingewiesen werden, daß die Verlaufsliste nicht gleich der History ist: Die History ist eine interne Liste, die dem Webbrowser dazu dient, vorwärts und rückwärts navigieren zu können. Bei der Angabe der angeführten Konstanten wird die Seite lediglich nicht in den interne History aufgenommen, im Verlauf scheint sie aber trotzdem auf.
Bestimmen der ausgewählten Option in einem Array von Optionsfeldern
Folgende Funktion bestimmt die ausgewählte Option in einem Array von Optionsfeldern. Zu beachten ist dabei, daß das Array von Steuerelementen als Object
übergeben wird:
Ein Aufruf könnte folgendermaßen aussehen:
Dabei ist Option1
ein Feld von Optionsfeldern.
Anzeigen von Laufwerken, Ordnern und Dateien in einem ListBox-Steuerelement
Das FileListBox-Steuerelement ist ziemlich langsam. Windows stellt für Listenfelder einen eigenen Darstellungsmodus zur Verfügung, bei dem Laufwerke, Ordner und Dateien wahlweise angezeigt werden können. In folgendem Beispiel bezeichnet List1
ein ListBox-Steuerelement:
Der Einsatz wäre mit dem folgenden Code möglich:
Suchen eines Eintrags in einem ListBox-Steuerelement
Um zu prüfen, ob sich ein Element bereits in einer ListBox befindet, muß man nicht alle Elemente über eine Schleife durchgehen und vergleichen, bis das Element gefunden oder das Ende der ListBox erreicht wurde. In folgendem Beispiel werden zwei Zeichenfolgen in der ListBox List1
gesucht:
Mehrzeilige Textfelder und Standardschaltflächen
Die Verwendung von Standardschaltflächen (Eigenschaft Default
) ist allgemein gebräuchlich. Ein Problem ergibt sich dabei, wenn auf einem Formular ein mehrzeiliges Textfeld (Eigenschaft MultiLine
) und eine Standardschaltfläche plaziert sind. In diesem Fall kann nämlich der Benutzer nicht durch Drücken der Eingabetaste einen Zeilenumbruch im Textfeld erzwingen, sondern es wird der Code hinter der Standardschaltfläche ausgeführt und kein Ereignis des Textfeldes.
Es gibt aber eine einfache Abhilfe, die sich des Windows-API bedient, mit dem dieses Problem gelöst werden kann. Im Folgenden bezeichne cmdOK
die Schaltfläche, deren Default
-Eigenschaft aktiviert ist, Text1
sei das mehrzeileige Textfeld:
Durch das Drücken der Eingabetaste wird nämlich nicht der Fokus auf ein anderes Steuerelement gesetzt, sondern bleibt dem Textfeld erhalten. Es muß also lediglich getestet werden, ob die TextBox immer noch den Fokus besitzt, ist dies der Fall, dann wurde die Eingabetaste in der TextBox gedrückt und es wird ein Zeilenumbruch an der aktuellen Position eingefügt.
Drehen einer Linie um einen Punkt
Nachstehender Code erfordert ein Formular, auf dem ein Timer-Steuerelement mit dem Namen Timer1
und ein Line-Steuerelement Line1
plaziert ist. Es wird eine Linie um einen Punkt gedreht, wie bei einem Zeiger einer analogen Uhr:
Kopieren des Textes des aktiven Steuerelements in die Zwischenablage
Ab und zu ist es sinnvoll, im Programm die Möglichkeit anzubieten, die Auswahl im aktuellen Steuerelement in die Zwischenablage zu kopieren. Zu diesem Zweck kann der folgende Code verwendet werden:
Je nach Typ des aktiven Steuerelements kann ein anderer Inhalt in die TextBox abgelegt werden. Man kann auch überprüfen, ob das aktive Steuerelement gleich einem bestimmten Steuerelement ist. Dazu muß man einfach Screen.ActiveControl
über den Operator Is
mit dem gewünschten Steuerelement vergleichen.
Erstellen von 3D-Trennlinien
Unter Windows verwenden viele Anwendungen dreidimensionale Trennlinien, um die Formulare in zusammengehörende Bereiche zu unterteilen. Eine solche Linie kann man entweder durch Zusammensetzen zweier Line-Steuerelemente erzielen oder man schreibt dafür ein eigenes Benutzersteuerelement. Folgender Code muß in ein Benutzersteuerelement, dessen Windowless
-Eigenschaft aktiviert ist, eingefügt werden:
Im Resize
-Ereignis wird sichergestellt, daß das Steuerelement nicht mehr als zwei Pixel hoch gezogen wird. Bei einer Größenänderung wird die Oberfläche neu gezeichnet. Jetzt muß man nur noch die Linien auf den Formularen aufziehen. Wenn man auch vertikale Linien zeichnen will, dann muß man den Code entsprechend anpassen, indem man beispielsweise eine Eigenschaft Orientation
hinzufügt, bei der der Benutzer angeben kann, ob es sich um eine horizontale oder vertikale Trennlinie handeln soll. Zum Zeichnen von 3D-Rahmen kann man auch die API-Funktion DrawEdge
verwenden.
Anpassen der Höhe eines Label-Steuerelements an den darzustellenden Text
Ab und zu ist es erforderlich, daß ein Label in seiner Höhe angepaßt werden muß, damit es einen bestimmten Text aufnehmen kann, ohne dabei jedoch die Breite des Steuerelements zu verändern. Die API-Funktion DrawText
bietet eine Möglichkeit, das für die Darstellung eines Textes auf einem angegebenen Gerätekontext zu berechnen. Die im Folgenden angegebene Prozedur AdaptLabel
paßt das übergebene Label so an, daß es den im zweiten Parameter übergebenen Text aufnehmen kann:
Der Code kann leicht umgeschrieben werden, um die Maße eines Textes zu ermitteln, ohne dabei automatisch umzubrechen. Zu diesem Zweck darf im Parameter wFormat
von DrawTextEx
nicht das Flag DT_WORDBREAK
gesetzt werden.
Unterscheiden zwischen „normaler“ Eingabetaste und jener am Ziffernblock
Es ist nicht möglich, mit reinen Visual-Basic-Mitteln zwischen der „normalen“ Eingabetaste und jener am Ziffernblock zu unterscheiden. Zu diesem Zweck kann man im KeyDown
-Ereignis mit der API-Funktion PeekMessage
die letzte Fensternachricht ermitteln und überprüfen:
Entfernen von Einträgen aus einem DriveListBox-Steuerelement
Die API-Funktion SendMessage
wird verwendet, um über die Fensterzugriffsnummer (übergeben im Parameter hWnd
) der DriveListBox den im Parameter wMsg
abgelegten Befehl CB_DELETESTRING
an das Steuerelement zu senden. Dem Parameter wParam
wird dazu der Index des zu löschenden Eintrags übergeben, lParam
ist hier nicht von Bedeutung und wird daher auf 0 gesetzt:
Setzen von Tabulatoren in einem TextBox-Steuerelement
Will man in einem Textfeld tabellarische Daten darstellen, dann kann man den Text durch Tabulatorzeichen trennen, um Spalten zu simulieren. Visual Basic bietet jedoch keine direkte Möglichkeit, die Breite der Spalten zu beeinflussen. Hierzu kann man die API-Funktion SendMessage
in Verbindung mit EM_SETTABSTOPS
verwenden. Will man die Breite der Tabulatoren individuell festlegen, kann man deren Positionen in einem Array ablegen und dieses an die Funktion übergeben. Die Positionen der Tabulatoren muß dabei allerdings in Dialogeinheiten (Dialog Untis) angegeben werden.
Im folgenden Beispiel soll ein zweispaltiges Textfeld realisiert werden, das einen Tabulator genau in der horizontalen Mitte hat. Das Umrechnen der Position aus der Einheit Pixel in Dialogeinheiten gestaltet sich schwierig, da das Windows-API hierzu keine vorgefertigten Funktionen anbietet. Die im nächsten Listing gezeigte Funktionsprozedur GetDialogUnitsPerPixel
implementiert ein heuristisches Verfahren zur Ermittlung dieses Wertes auf Basis der Fonteinstellungen des durch die im Parameter hWnd
übergebene Fensterzugriffsnummer identifizierten Steuerelements.
Folgendes Beispiel erfordert ein Formular mit einem Textfeld, dessen MultiLine
-Eigenschaft auf True
gesetzt ist, sowie ein Line-Steuerelement: