Die Community zu .NET und Classic VB.
Menü

Steuerelemente erstellen

 von 

Ü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

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.

Property's importieren - User4711 23.12.12 16:18 9 Antworten