Die Community zu .NET und Classic VB.
Menü

vbRichClient installieren und Visual Basic einrichten

 von 

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.