vbRichClient installieren und Visual Basic einrichten
von W. Wolf
Download und Installation
Um den RC5 (Abkürzung für vbRichClient Version 5) verwenden zu können, müssen Sie das Framework von der Seite http://www.vbrichclient.com herunterladen und auf Ihren Anwendungsrechner einrichten. Auf der Seite finden Sie unter Downloads eine ca. 2,3 MB große zip-Datei, aktuell in der Version 5.0.31.
Entpacken Sie diese Datei an einen beliebigen Ort. Ich verwende hier auf meinem Entwicklungs-rechner das Verzeichnis C:\RC5\. Das können Sie sich wahllos anders einrichten, wichtig ist nur, dass Sie bei der Weitergabe Ihrer fertigen Anwendung die DLLs aus genau diesem Ordner mitliefern. Sollten Sie für die Weitergabe ein Setup erstellen wollen, dann müssen Sie im Script des Setups ebenfalls diesen Pfad als Quelle für die DLLs angeben. Die DLLs müssen bei Ihren Anwendern nicht registriert werden.
In der heruntergeladenen Zip finden Sie mehrere Dateien. Wichtig sind die drei DLLs aus denen das Framework besteht. Diese DLLs sollten immer im gleichen Ordner liegen, bei Ihren Kunden vorzugsweise im Ordner wo auch die Exe-Datei Ihrer Anwendung liegt.
Damit sie auf ihren Entwicklungsrechner das Framework verwenden können, muss es registriert werden. Olaf Schmidt, der Autor vom vbRichClient macht es Ihnen leicht: Im entpackten Ordner finden Sie eins Datei RegisterRC5inPlace.vbs. Dieses Script sollten Sie als Administrator einmalig ausführen. Alternativ können Sie die Registrierung auch mit dem Windows-Tool regsvr32 durchführen. Wenn alles richtig funktioniert hat, wird Sie das Registrier-Tool mit einer Erfolgsmeldung benachrichtigen.
Die zweite Script-Datei RegisterVBWidgetsInPlace.vbs brauchen Sie vorerst nicht. Diese versucht eine vbWidgets.dll zu registrieren. Das brauchen Sie nicht, zumal diese DLL nicht im Lieferumfang enthalten ist.
Im entpackten Ordner finden Sie noch zwei Textdateien. Eine davon, die _Library-Licenses.txt, ist wichtig. Sie enthält eine Vorlage mit Lizenzbestimmungen für die Weitergabe des Frameworks. Diese Lizenzbestimmungen sollten Sie Ihrer Anwendung unbedingt beilegen, bzw. in das Setup-Script einbinden.
Das Framework in VB verwenden
Starten Sie wie gewohnt VB mit einen neuen Projekt. Unter Projekt/Verweise sollten Sie nun in der Liste Verfügbare Verweise den Eintrag vbRichClient5 finden. Aktivieren Sie das Kästchen neben diesem Eintrag. Alternativ können Sie auch über den Schalter Durchsuchen die vbRichClient5.dll aus dem Installationsordner auswählen. Quittieren Sie die Einstellung mit OK.
VB ist nun für die Verwendung des Frameworks vorbereitet. Wir können noch schnell testen ob alles funktioniert. Entfernen Sie im Projekt-Explorer die Form1. Cairo-Programme verwenden keine VB-Fenster. Binden Sie stattdessen ein neues Modul (Projekt / Modul hinzufügen) ein. In das neue Modul schreiben Sie folgenden Code:
Option Explicit Sub Main() With New cConstructor With .Cairo .WidgetForms.Create(vbSizable, "Hallo Cairo!").Show .WidgetForms.EnterMessageLoop End With End With End Sub
In den Projekteigenschaften müssen Sie als Startobjekt die Sub Main eintragen. Danach können Sie das Projekt mit F5 ausführen. Wenn alles richtig funktioniert, sollte auf Ihrem Bildschirm Ihr erstes Cairo-Fenster erscheinen.
Den vbRichClient regless einbinden
Diese Mini-Anwendung könnten Sie bereits jetzt zu einer funktionierenden Exe kompilieren. Die Exe benötigt aber noch immer nach alter VB-Manier die registrierte vbRichClient.dll. Deshalb werden wir uns als nächstes um die registrierfreie Einbindung kümmern. Damit erstellen wir uns eine Vorlage, die Sie als solche auch in die Projektvorlagen von VB aufnehmen können. Das erleichtert zukünftig die Anlage neuer RC5-Projekte.
Es gibt unterschiedliche Methoden wie eine ActiveX-DLL (die vbRichClient.dll ist eine ActiveX Bibliothek) ohne Registrierung verwendet werden kann. Ein möglicher Weg wäre die Einbindung der DLL über eine Manifest-Datei. Der RC5 bietet alternativ dazu eine Funktion über die enthaltene DirectCOM.dll. Diese DLL ist eine Standard-Windows-Bibliothek und benötigt keine Registrierung. Die Bibliothek bietet eine Funktion GetInstanceEx mit deren Hilfe COM-Objekte aus nicht registrierten DLLs erzeugt werden können. Binden wir also diese Funktion in unser Modul ein:
Declare Function GetInstanceEx Lib "DirectCom" _ (StrPtr_FName As Long, _ StrPtr_ClassName As Long, _ ByVal UseAlteredSearchPath As Boolean) As Object
Statt With New cConstructor könnten wir nun die Instanziierung wie folgt durchführen:
With GetInstanceEx(StrPtr(App.Path & _ "vbRichClient5.dll"), StrPtr("cConstructor"), True)
Praxistauglich ist dieser Code noch nicht. Wie sie sehen, wird die vbRichClient5.dll im Anwendungsverzeichnis erwartet. Später, wenn sich die DLLs im gleichen Verzeichnis befinden, wie die Exe-Datei ist alles in Ordnung. In der Entwicklungsumgebung werden die Pfade zu den DLLs jedoch nicht gefunden. In der Praxis hat sich folgendes Vorgehen bewährt. Es wird zuerst eine Instanziierung mit GetInstanceEx versucht. Wenn diese scheitert wird die klassische Instanziierung vorgenommen, die allerdings die Registrierung der DLL voraussetzt. Genau das ist in der IDE gegeben, wenn die vbRichClient5.dll über Verweise eingebunden ist.
Auf die With-Anweisung wird verzichtet, wir deklarieren dafür eine wiederverwendbare globale Objektvariablen für New_c und Cairo. Diese werden in RC5-Programmen immer wieder und überall gebraucht, weshalb einmalig instanziierte und programmweit verfügbare Objekte sinnvoll sind.
Option Explicit Declare Function GetInstanceEx Lib "DirectCom" _ (StrPtr_FName As Long, _ StrPtr_ClassName As Long, _ ByVal UseAlteredSearchPath As Boolean) As Object Public New_c As cConstructor Public Cairo As cCairo Public AppPath As String Sub Main() Dim regCaption As String AppPath = App.Path If Right$(App.Path, 1) <> "\" Then AppPath = AppPath & "\" On Error Resume Next Set New_c = GetInstanceEx(StrPtr(AppPath & "vbRichClient5.dll"), _ StrPtr("cConstructor"), True) If New_c Is Nothing Then Set New_c = New cConstructor regCaption = "Hallo Cairo - Reg" Else regCaption = "Hallo Cairo - Regless" End If Set Cairo = New_c.Cairo Cairo.WidgetForms.Create(vbSizable, "Hallo Cairo!").Show Cairo.WidgetForms.EnterMessageLoop End Sub
Starten Sie die Anwendung in der IDE und beobachten Sie den Text in der Titelleiste des Fensters. Hier sollte Hallo Cairo - Reg stehen. Kompilieren Sie nun Ihre Anwendung in das Verzeichnis, in dem sich die RC5-DLLs befinden. Starten Sie die neue Exe. In der Titelleiste des Fensters sollte nun Hallo Cairo - Regless stehen. Das wäre der Beweis, dass New_c mittels GetInstanceEx regfree instanziiert wurde.
Die Klasse cConstructor
Sie werden in allen RC5-Programmen und Code-Beispielen immer wieder auf die Objektvariable New_c stoßen. Diese Objektvariable haben wir als Public in unseren Modul deklariert und gleich beim Programmstart instanziiert.
In VB werden neue Objekte mittels Schlüsselwort New erzeugt. Im RC5 sind viele Klassen als PublicNotCreatable gekennzeichnet, was zur Folge hat, dass Sie von diesen Klassen keine Objekte mittels New erzeugen können. Das ist durchaus gewollt und bringt einige Vorteile.
VB kann Objekte mittels New nur aus registrierten DLLs erzeugen. Das wollen wir aber zukünftig vermeiden. Ein weiterer Nachteil ist die Art und Weise wie VB Objekte erzeugt. Vielleicht haben Sie schon in anderen objektorientierten Sprachen Konstruktoren kennengelernt. Ein Konstruktor ist eine Prozedur in einer Klasse, die automatisch beim Instanziieren eines Objektes ausgeführt wird. Dieser Prozedur können auch Parameter übergeben werden. Das ist sehr praktisch, weil so die Objekterzeugung parametrisiert werden kann. Wie gesagt, das kann unser VB leider nicht. Die Class_Initialize-Prozedur einer Klasse ist privat und erlaubt darüber hinaus keine Parameter. RC5 geht deshalb einen anderen Weg. Zum Erzeugen von RC5-Objekten wird eine sogenannte Factory (abstrakte Fabrik) verwendet. Eine Factory definiert eine Schnittstelle zur Erzeugung einer Familie von Objekten. Wenn Sie also ein neues RC5-Objekt brauchen, lassen Sie sich dieses Objekt von der RC5-Factory erzeugen. In unserem Beispielcode (in Sub Main) haben wir so z.B. eine globale Instanz der cCairo-Klasse erzeugt. Hier ein weiteres Beispiel:
'Statt Set myCollection = New Collection 'VB-Collection 'schreiben wir Set myCollection = New_c.Collection 'RC5-Collection
Wie Sie sehen, ist Collection eine Methode der Factory New_c. Methoden können Parameter enthalten. Beim Erzeugen einer RC5-Collection können wir über optionale Parameter Einstellungen für die Instanziierung übergeben. Die Deklaration der Collection-Funktion im RC5 sieht wie folg aus:
Function Collection(_ [CompatibleToVBCollection As Boolean = Wahr], _ [StringCompareMode As StringCompareModeEnum = 1], _ [UniqueKeys As Boolean = Wahr], _ [Content]) As cCollection
Die Funktion liefert ein Collection-Objekt, dessen Eigenschaften während der Erzeugung festgelegt werden.
RegFree über alle Instanzen
Wie Sie gesehen haben, liefert die mit GetInstanceEx erzeugte RC5-Factory Objekte ohne dass die DLL registriert sein muss. RC5 kann aber auch Objekte aus anderen Klassen liefern. Ihre ActiveX DLLs müssen in Zukunft auf den Anwendungsrechnern nicht mehr registriert werden. Lediglich der Pfad zur DLL muss bekannt sein. Den Ärger mit nicht korrekt installierten und registrierten DLLs können Sie sich also ab jetzt sparen. Erzeugen Sie zukünftig die Objekte aus Ihren eigenen oder fremden ActiveX-Dlls wie folgt:
With New_c.RegFree Set myObj = .GetInstance(AppPath & "myDll.dll", "clsObj") End With
Das ist aber noch nicht alles, es wird noch viel besser! Mittels RegFree können Sie ein Objekt aus Ihrer ActiveX-Dll in einem neuen Thread laufen lassen. Die Instanziierung ist denkbar einfach:
With New_c.RegFree Set myObj = .ThreadObjectCreate( _ "myThreadKey", _ AppPath & "myDll.dll", _ "clsObj") End With
RC5-Cairo-Fenster
In unserem Beispielcode haben wir bereits ein Fenster erzeugt. Das funktioniert wie gezeigt schon recht gut, ist aber nicht die Art wie Sie zukünftig Ihre Anwendungen programmieren werden. In VB haben Sie ihrem Projekt Formulare hinzugefügt. Den internen Programmcode dafür haben Sie in der Code-Ansicht des Fensters bearbeitet. Cairo-Projekte verwenden keine VB-Formulare. Der Code für Cairo-Fenster wird in VB-Klassen eingefügt.
Fügen Sie Ihrem Projekt eine neue Klasse hinzu und nennen Sie diese Klasse z.B. cfMain. In diese Klasse fügen Sie folgenden Code ein:
Option Explicit Private WithEvents mForm As cWidgetForm Private Sub Class_Initialize() Set mForm = Cairo.WidgetForms.Create(vbSizable, "Hallo Cairo!") End Sub Public Sub Show(Optional Modal As FormShowConstants, _ Optional OwnerForm As Object, _ Optional ShowNonFocused As Boolean) mForm.Show Modal, OwnerForm, ShowNonFocused End Sub
Die Sub Main-Prozedur ändern wir wie folgt ab:
'Cairo.WidgetForms.Create(vbSizable, "Hallo Cairo!").Show Dim fMain As New cfMain fMain.Show
Was hat sich geändert? Statt einer WidgetForms-Instanz erzeugen wir nun eine Instanz unserer eigenen Klasse. Dahinter verbirgt sich natürlich wieder die WidgetForms. Allerdings ist diese nun in unserer Klasse gekapselt und kann von außen nicht mehr direkt erreicht werden. Ein weiterer Vorteil besteht darin, dass wir die interne mForm nun mit dem Zusatz WithEvents deklariert haben. Das WidgetFenster wird uns also Events liefern, die wir im Klassenmodul abfangen und auswerten können. Wenn wir uns die Events der Klasse cWidgetForm ansehen oder im Codefenster die Events-Combobox aufklappen, werden wir viele bekannte Ereignis-Namen entdecken. Olaf Schmidt macht es dem VB-Entwickler leicht mit den Cairo-Forms umzugehen. Vieles fühlt sich bekannt an. Wenn wir genau hinsehen, werden wir aber auch einige neue Eigenschaften, Methoden und Ereignisse entdecken. Zum Beispiel die Methode SetMinMaxDimensions. War im alten VB gar nicht so einfach die Dimensionen eines Fensters zu begrenzen. Wer hingegen fürs Tablet programmieren will, sollte mal im Objektkatalog den Suchbegriff Touch eingeben.
Fazit
RC5-Cairo-Projekte verwenden keine VB-Fenster. Cairo-Fenster sind VB-Klassen, die per Code instanziiert werden. Das macht auch die Auslagerung dieser Klassen in separate ActiveX-DLLs leicht. Über die Registrierung dieser DLLs beim Anwender brauchen Sie sich keine Gedanken machen, das RC5-RegFree-Objekt liefert Ihnen Objekte aus ihren nicht registrierten DLLs. Es macht jedoch Sinn diese DLLs auf dem Entwicklungsrechner zu registrieren, weil damit die Verwendung in der VB-IDE komfortabler ist.
Ihre Meinung
Falls Sie Fragen zu diesem Artikel 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.