Steuerelemente erstellen
von Elmar Steinböck
Übersicht
Bevor ich Ihnen die Erstellung eines eigenen Steuerelements (ActiveX-Steuerelement oder auch OCX) erläutere, einige Hinweise:
Daß Sie ein Steuerelement erstellen können, heißt nicht, dass Sie es auch tun sollen. Es kommt darauf an, was Sie erreichen wollen. Man sollte sich vorher die Frage stellen, ob es nicht mit ein paar Zeilen Programmcode und Vewendung von Standardsteuerelementen einfacher und schneller geht. Und es kommt auf den Umfang an. Wenn Sie die Lade des CD-ROM-Laufwerks öffnen und schließen wollen, können Sie dies einfach mit einem API-Aufruf und ein paar Zeilen Code erledigen. Sie können natürlich auch ein Steuerelement anlegen und in dieses Element den Code verpacken. Die Handhabung ist jetzt einfacher geworden, nur werden Sie ein solches Steuerelement wahrscheinlich nicht oft brauchen. Etwas anders sieht es bei Steuerelementen aus, die mehr können, als Standardsteuerelemente und / oder besser aussehen.
Die Anleitung zur Erstellung von Steuerelementen könnte ein kleines Taschenbuch füllen, deshalb will ich mich hier auf die wichtigsten Elemente beschränken.
Mit freundlichen Grüßen
Elmar Steinböck elmar@activevb.de
Ein neues Projekt entsteht
- Starten Sie Visual Basic, wählen Sie Projekt/neu - ActiveX-Steuerelement. In der Entwicklungsumgebung öffnet sich nun ein neues Projekt mit einem “UserControl” anstatt einem Formular, so wie Sie es aus normalen Projekten (StandardEXE) gewohnt sind.
- Geben Sie Ihrem Projekt und dem UserControl einen eindeutigen Namen.
- In den Projekteigenschaften können Sie weitere Einstellungen vornehmen.
- Unter Projektbeschreibung geben Sie den Namen ein, der dann bei der Auswahl der Steuerelemente aufscheint ,wie zum Beispiel Microsoft Windows Common Controls 5.0 (SP2).
Erstellung des OCX
Sie können das Grundgerüst des Steuerelements händisch erstellen oder Sie lassen den ActiveX-Schnittstellenassistenten für sich arbeiten.
Der ActiveX-Assistent
Fügen Sie über das Menü von VB / ADD-INS / ADD-IN-Manager den Assistenten ein.
Starten Sie dann den Assistenten (Sie können diesen Assistenten übrigens auch später noch aufrufen und dies beliebig oft).
Der Assistent hilft Ihnen dadurch, indem er selbst fertigen Code produziert. Sie müssen Ihm nur mitteilen, welche Eigenschaften, Methoden oder Ereignisse unterstützt werden sollen.
Wählen Sie zB BackColor aus. Im nächsten Schritt ordnen Sie diese Eigenschaft einem Steuerelement zu. Wenn Sie UserControl wählen, wird die Eigenschaft BackColor nur auf UserControl übertragen. Wenn Sie also ein fertiges OCX in Ihre Anwendung eingefügt hätten und dort die Eigenschaft BackColor ändern, wirkt sich dies auf das UserControl aus und nicht auf eventuell andere eingefügte Steuerelemente, die Sie auf dem UserControl verankert haben.
Im nächsten Schritt können Sie den Datentyp abändern, einen Standardwert vergeben und die Eigenschaften getrennt für Laufzeit und Entwurfsmodus vorgeben. Außerdem ist es sinnvoll, eine Beschreibung anzugeben (Für BackColor wäre dies “Setzt die Hintergrundfarbe...” oder so ähnlich).
Wenn Sie den Assistenten beendet haben und das UserControl öffnen (Code-Ansicht), werden Sie feststellen, dass das Grundgerüst einigermaßen fertig ist. (Allerdings wirklich nur ein Gerüst).
Ablauf der Ereignisse
Es ist wichtig, zu verstehen, in welcher Reihenfolge die Ereignisse des OCX oder UserControls ausgelöst werden.
- UserControl_Initialize()
Tritt immer dann auf, wenn das Steuerelement das erste Mal geladen wird. - UserControl_InitProperties()
Tritt auf, wenn das Steuerelement in einem Formular platziert wird. - UserControl_Resize()
Dieses Ereignis tritt immer dann ein, wenn das eingefügte Steuerelement in seiner Größe geändert wird. - UserControl_ReadProperties()
Liest Werte aus und weist Sie dem Steuerelement zu. - UserControl_WriteProperties()
Schreibt die vom Anwender geänderten Werte über das Propertybag-Objekt zurück. Damit werden die Eigenschaften dauerhaft gespeichert und gehen bei einem Schließen und erneutem Öffnen eines Formulars nicht verloren.
Beispielprojekt
Sie können das Grundgerüst des Steuerelements händisch erstellen oder Sie lassen den ActiveX-Schnittstellenassistenten für sich arbeiten.
Enum eBorderStyle Keine Einfach End Enum
Listing 1
Als nächstes müssen diese Eigenschaften umsetzen bzw zuweisen.
Property Let BorderStyle(newB As eBorderStyle) UserControl.BorderStyle = newB PropertyChanged "BorderStyle" End Property Property Get BorderStyle() As eBorderStyle BorderStyle = UserControl.BorderStyle End Property
Listing 2
Die Funktion ”Let” weist der Eigenschaft BorderStyle (in diesem Fall eine Eigenschaft für das UserControl) den neuen vom Anwender eingestellten Wert zu. Vergessen Sie auf keinen Fall die PropertyChanged-Methode. Damit wird die Eigenschaft aktualisiert!
Um diese Einstellungen auch zu sichern, wenn der Entwurfsmodus beendet ist (also vor dem Zerstören der Entwurfsinstanz), müssen noch folgende Anweisungen eingefügt werden:
Private Sub UserControl_WriteProperties(PropBag As PropertyBag) PropBag.WriteProperty "BorderStyle", BorderStyle, 1 End Sub Private Sub UserControl_ReadProperties(PropBag As PropertyBag) BorderStyle = PropBag.ReadProperty("BorderStyle", 1) End Sub
Listing 3
Erläuterungen
Die WriteProperty-Methode speichert den Wert der BorderStyle-Eigenschaft in der PropertyBag. Es werden drei Argumente übergeben (Name der Eigenschaft, zu speichernder Wert und Standardwert).
Die ReadProperty-Methode liest den Wert aus und weist sie der Variable BorderStyle zu. Auch hier ist der Standardwert sinnvoll, um Laufzeitfehler zu vermeiden.
Um schon beim Einfügen des UserControls in das Formular einen Standardwert festzulegen (dies wäre in unserem Fall 0, also keine Umrandung), müssen wir Init_Properties bemühen:
Private Sub UserControl_InitProperties() UserControl.BorderStyle = Einfach End Sub
Listing 4
Anmerkung
Nach dem gleichen Schema können Sie alle anderen erforderlichen Eigenschaften wie BackColor, ForeColor, Font etc. erstellen. Testen Sie den ActiveX-Assistenten und ‘spielen’ Sie mit den Einstellungen.
Als nächstes wollen wir die Position festlegen. Das Steuerelement soll ja in einer bestimmten Größe und Form auf dem Formular erscheinen. Um zum Beispiel eine PictureBox richtig auszurichten, fügen Sie in das Ereignis UserControl_Initialize ein:
Picture1.Move 0, 0, ScaleWidth, ScaleHeight
Listing 5
Die gleiche Prozedur kommt in das Resize-Ereignis.
Perfektion im Detail
Wenn Sie Ihre Steuerelemente vertreiben wollen (verkaufen, verschenken, was auch immer), möchten Sie vielleicht einen Hinweis auf den Produzenten setzen. Sie finden in den Eigenschaften vieler Steuerelemente (nur im Entwurfsmodus) einen Hinweis auf den Urheber (About...)
Um ein Formular mit Ihrem Copyright oder sonstigen Hinweisen zu erstellen, gehen Sie wie folgt vor:
Fügen Sie in das Projekt ein ganz normales Formular ein. Sinnvollerweise sollte die Eigenschaft BorderStyle auf 1 gesetzt sein. Benennen Sie das Formular zB mit frmAbout, gestalten Sie es nach Ihren Wünschen und speichern Sie das Projekt. Fügen Sie in das UserControl folgenden Code ein:
Public Sub ShowAbout() On Error Resume Next frmABout.Show vbModal End Sub
Listing 6
Zum Entladen des InfoDialogs können Sie einen CommandButton einfügen, oder im FormClick-Ereignis des frmAbout den Code einfügen:
Unload me Set frmAbout = Nothing
Listing 7
Wie wird nun dieser Dialog eingebunden ?
Rufen Sie dazu aus der Menüleiste von VB die "Prozedurattribute" auf. Suchen Sie den Namen "ShowAbout". Klicken Sie auf "Erweitert" und stellen Sie die Prozedur-ID ein. Stellen Sie diese auf "AboutBox".
Eine Eigenschaftenseite erstellen
Sie sind es vielleicht von einigen Steuerelementen gewohnt, dass man eine Eigenschaftenseite (PropertyPage - nicht zu verwechseln mit PropertyBag) anzeigen kann, wo viele Einstellungen bequem geändert werden können.
Der Aufruf erfolgt über "Custom" oder "Benutzerdefiniert".
Legen Sie eine neue Eigenschaftenseite an, indem Sie über das Menü Projekt/Eigenschaftenseite hinzufügen entweder eine neue Seite erstellen oder eine vorhandene laden.
Sie können auch für diesen Zweck einen Assistenten bemühen, den Sie - falls noch nicht geschehen - über das Menü ADD-INS laden (Eigenschaften-Assistent).
Wollen Sie bestimmte Eigenschaften händisch hinzufügen, können Sie das bequem über Menü / EXTRAS / Prozedurattribute erledigen. Zum Beispiel: Sie haben eine Eigenschaft "Value", die in den Eigenschaften angezeigt und auch dort verändert werden soll. Suchen Sie "Value" und stellen Sie unter //Prozedurattribute/Optionen die betreffende Eigenschaftenseite ein.
Natürlich brauchen wir auch einen Code für die Eigenschaftenseite:
ApplyChanges wird ausgelöst, wenn der "Übernehmen"-Button gedrückt wird.
Private Sub PropertyPage_ApplyChanges() SelectedControls(0).Value = txtValue.Text End Sub
Listing 8
Damit werden die Änderungen in die Eigenschaften des UserControls übernommen.
Private Sub PropertyPage_SelectionChanged() txtValue.Text = SelectedControls(0).Value End Sub
Listing 9
Bei Änderungen in der Property-Page wird der "Übernehmen"-Button eingeschaltet.
Private Sub txtValue_Change() Changed = True End Sub
Listing 10
Fertigstellung
Sie haben jetzt ein UserControl erstellt. Wenn Sie jetzt das Projekt kompilieren, erstellt Visual Basic ein ActiveX-Steuerelement unter dem Projektnamen. Deshalb ist es auch wichtig, eindeutige Namen zu vergeben.
Wenn Sie jetzt ein neues Projekt starten (StandardEXE) und unter Komponenten nachsehen, werden Sie Ihr erstes OCX finden. Wenn Sie es auf dem Formular einfügen, bekommt es einem Namen (wie zum Beispiel das Steuerelement Label - Label1). Das ist der Name des UserControls!
Kompilieren oder nicht ?
Sie müssen das fertige Projekt nicht zu einem OCX kompilieren. Es wird dadurch nur öffentlich und kann von jedem Ihrer Projekte benutzt werden.
Wollen Sie dagegen ein OCX mit Ihren fertigen Programmen nicht ausliefern, empfiehlt es sich, das UserControl direkt in Ihre Applikation einzubinden. Um eine Wiederverwendbarkeit zu gewährleisten, kopieren Sie das betreffende userControl (Dateikennung *.ctl) in Ihren ProjektOrdner. Wenn Sie das UserControl in Ihr Projekt mit aufnehmen, werden die Deklarationen von VB automatisch von Public auf Private zurückgestellt. Etwaige Verweise auf AboutBox und PropertyPage werden ebenfalls zurück- gesetzt.
Zusammenfassung
ActiveX-Steuerelemente sind eigentlich nur universelle Erweiterungen in der Werkzeugsammlung. Es lohnt sich erst, wenn man Funktionen oder ein Design benötigt, die von anderen Herstellern nicht bereitgestellt werden, oder für die man bezahlen müsste.
Allerdings ist die Erstellung eines (sinnvollen) Steuerelements für den Anfänger sehr zeitaufwendig, was jedoch nicht abschreckend wirken soll.
RainbowProgressbar als Beispiel zum Download [50300 Bytes]
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.