Session D-FUN

Having Fun with OLE

Markus Egger
EPS-Software


Überblick

Diese Session gibt einen allgemeinen Überblick über die OLE-Fähigkeiten von Visual FoxPro 5.0. Sinn dieser Session ist nicht, detaillierte Informationen über die verschiedenen OLE-Fähigkeiten zu geben, sondern ganz allgemein zu zeigen, was möglich ist. Das inkludiert Inplace-Activation, OLE Automation, ActiveX-Support und OLE Servers.

Inplace Activation

Visual FoxPro 5.0 bietet wie auch schon Visual FoxPro 3.0 die Möglichkeit andere Applicationen über Inplace Activation einzubinden. Das geschieht über das OLE Container Control. Wenn man dieses Control einem Formular zufügt, fragt FoxPro, welches OLE Objekt man einfügen möchte.

In dem von mir erwähnten Beispiel verwende ich ein Winword Dokument - Objekt. Wenn man ein solches Formular instanziiert und das Objekt aktiviert (doppelklickt), sieht das folgendermaßen aus.

In dieser Ansicht hat man die komplette Winword-Funktionalität zur Verfügung. Wenn das Objekt deaktiviert wird, sieht man lediglich das Layout des Dokuments:

OLE Automation

Über OLE Automation können Sie OLE-Server-fähige Applikationen “fernsteuern”. Eine dieser Applikationen ist z.B. Microsoft Excel.

Um Excel verwenden zu können, müssen Sie es zuerst installieren. Das geschieht auf dieselbe Art und Weise, wie Sie FoxPro-interne Objekte erstellen:

oExcel = CreateObject(“Excel.Application”)

Nachdem FoxPro diesen Befehl ausgeführt hat, werden Sie vorerst keine sichtbaren Resultate feststellen können. Excel ist nämlich vorerst nicht sichtbar. Das ist sehr hilfreich. Sie können auf diese Art und Weise nämlich alle OLE-Aktionen vor dem Anwender verstecken. Um Excel sichtbar zu machen, setzen Sie einfach dessen Visible-Property:

oExcel.Visible = .T.

Durch diesen Befehl wird Microsoft Excel sichtbar. Wie Sie sehen, gibt es jedoch noch kein Dokument in Excel. Wir erstellen daher ein neues mit folgendem FoxPro-Befehl:

oExcel.Workbooks.Add

Nun können wir das erstellte Spreadsheet mit Daten füllen:

oExcel.Cells(1,1).Value = “Test”
oExcel.Cells(2,2).Value = “=Sum(B3:B4)”
oExcel.Cells(3,2).Value = 100
oExcel.Cells(4,2).Value = 2367

Natürlich ist es sinnvoll, das erstellte Spreadsheet abzuspeichern:

oExcel.Worksheets(1).SaveAs(“Test”)

Verwenden von ActiveX Controls

ActiveX Controls waren bisher als OCX-Controls oder OLE-Controls bekannt. Das sind Controls (Steuerelemente), die über OLE (ActiveX) in Visual FoxPro eingebettet werden können. Das geschieht über das OLE Container Control:

ActiveX Controls verhalten sich weitestgehend wie FoxPro-eigene Controls. In folgendem Beispiel verwende ich ein PageFrame Control, das die Header am unteren Ende haben kann:

ISimpleFrame

In Visual FoxPro 5.0 wird nun auch ISimpleFrame unterstützt. ISimpleFrame bedeutet, daß ein OLE Control ein Container ist, der Controls des Hosts (in unserem Fall Visual FoxPro) enthalten kann. Visual Basic und Visual FoxPro sind die einzigen Produkte, die ISimpleFrame unterstützen.

ActiveX Subclassing

Mit Visual FoxPro können Sie Subklassen von ActiveX Controls kreieren. OLE Subklassing ist ein von OLE selbst eigentlich nicht unterstütztes Feature. Visual FoxPro ist das einzige Produkt, das dieses Feature unterstützt. Dies stellt eine enorm mächtiges Feature dar.

Erstellen von ActiveX Controls mit Visual C++

Eine der Möglichkeiten, ein ActiveX Control zu erstellen, ist Visual C++. Visual C++ hat einen Wizard, der die Erstellung von ActiveX Controls sehr einfach macht.

Dieser Wizard erstellt ein Grundgerüst für ein ActiveX Control. Wir können dieses Gerüst später um sinnvolle Funktionalität erweitern. Dies geschieht vor allem mit Hilfe des Class Wizards. Dieser automatisiert das Erstellen neuer Methoden und Properties und erleichtert später das Editieren derselben. Dieser Wizard generiert Sourcecode, wie Sie ihn im folgenden Bild sehen können:

Das mit diesem Wizard erstellt Control wird automatisch in die Registry eingetragen und steht uns somit in FoxPro zur Verfügung. Wir können es also ganz normal über ein OLE Container Control in eine FoxPro-Form einfügen.

Erstellen von ActiveX Controls mit Visual Basic

Ein neues Feature vo Visual Basic 5.0 ist das Erstellen von ActiveX Controls. Es gibt sogar eine eigene Version von Visual Basic, die nur ActiveX Controls erstellt. Diese Version ist Freeware und kann vom Internet heruntergeladen werden.

Um ein Visual Basic ActiveX Control zu erstellen, wähl man einfach das ActiveX Control Template:

Nun sehen Sie einen Editor, der dem Visual FoxPro Klassendesigner sehr ähnlich ist. In diesem Editor können Sie Ihre Controls zeichnen und ihnen Code zufügen:

Alle von Visual Basic erstellen ActiveX Controls werden automatisch im System registriert und können somit sofort von Visual FoxPro verwendet werden.

OLE Server

Eines der wichtigsten und mächtigsten neuen Features von Visual FoxPro 5.0 ist das Erstellen von OLE Servern. Dies bedeutet, daß FoxPro bzw. Ihre mit FoxPro erstellten Applikationen von nun an auch “ferngesteuert” werden können. Erreicht wird diese Funktionalität duch die Einführung des “Application” Objektes (bzw. des “_VFP” Objektes) und durch das Schlüsselwort “OLEPublic”.

Über das Application-Object kann Visual FoxPro als Ganzes angesteuert werden. Ein weiteres Feature erlaubt, komplett neue OLE Server zu kreieren. Visual FoxPro ist das einzige Produkt, das diese beiden Funktionalitäten vereinigt. Andere Produkte unterstützen jeweils nur eines der beiden Features. Office-Produkte halten üblicherweise ein Application-Objekt bereit, während Entwicklertools (VC++, VB…) OLE Server kreieren können.

Das Application Object

Das Application Objekt erlaubt anderen OLE-fähigen Applikationen, eine Instanz von Visual FoxPro zu erstellen. Diese Applikation könnte z.B. Visual FoxPro selbst sein:

oFoxPro = CreateObject(“VisualFoxPro.Application”)
oFoxPro.Visible = .T.

Das VisualFoxPro.Application Objekt stellt Ihnen zwei sehr wichtige Methoden zur verfügung:

VisualFoxPro::DoCmd()
VisualFoxPro::Eval()

Mit diesen Methoden kann man FoxPro Befehle ausführen bzw. deren Ergebnisse abfragen. Folgende Befehle würden z.B. die Browser.dbf öffnen, den Satzzeiger bewegen und einen Wert zurückgeben:

oFoxPro = CreateObject(“VisualFoxPro.Application”)
oFoxPro.DoCmd( “Use Browser.dbf” )
oFoxPro.DoCmd( “Go 20” )
lPlatform = oFoxPro.Eval( “Browser.Platform” )

Man kann FoxPro natürlich auch von anderen OLE-fähigen Applikationen ansteuern. Z.B. mit Visual Basic:

Dim oFoxPro As Object
Set oFoxPro = CreateObject("VisualFoxPro.Application")
oFoxPro.DoCmd ("use home()+'browser'")
oFoxPro.DoCmd ("go 20")
MsgBox (oFoxPro.Eval("Platform"))

Erstellen von eigenen OLE Servern

Mit Hilfe des OLEPublic Schlüsselwortes können Sie auch eigene OLE Server erstellen. Hier ein einfaches Demo:

DEFINE CLASS MyFirstOLEServer AS CUSTOM OLEPUBLIC
FUNCTION Method1( lcText )
RETURN “This is a test... (“ + Alltrim(lcText) + “)”
ENDDEFINE

Für dieses Programm muß nun ein Projekt erstellt werden. Nehmen wir an, das Projekt heißt “Test”. Wenn Sie dieses Projekt kompilieren, sehen Sie folgenden Dialog:

Wie Sie sehen, gibt es in diesem Dialog zwei neue Optionen:

  1. Build OLE DLL
    Diese Option erlaubt Ihnen reine OLE DLLs zu erstellen. In unserem Beispiel bleiben wir jedoch bei einer EXE. Ein OLE Server kann nämlich eine EXE oder eine DLL sein.
  2. Regenerate OLE Server IDs
    FoxPro erstellt automatisch GUIDs. Diese Abkürzung steht für “Global Unique IDs”. Das sind IDs, über die OLE Objekte identifiziert und angesprochen werden. FoxPro generiert diese IDs normalerweise automatisch und behält die ID für ein und dasselbe Projekt immer bei. Wenn wir diese Checkbox ankreuzen können wir das Erstellen einer neuen ID erzwingen.

Den nun erstellten OLE Server können wir z.B. aus FoxPro heraus ansprechen (in diesem Beispiel gehe ich davon aus, daß das Projekt “Test” genannt wurde):

oTest = CreateObject( “Test.MyFirstOLEServer” )
? oTest.Method1( “Das ist ein Test” )

Wir können diese Klasse aber auch in anderen Applikationen (wie z.B. Visual Basic) instanziieren.

Internet und OLE

OLE Server haben die angenehme Eigenschaft, auch über das Internet angesprochen werden zu können. Um dies zu machen, benötigen Sie lediglich die FOXISAPI.DLL, die mit Visual FoxPro 5.0 ausgeliefert wird.

In folgendem Beispiel wird der oben beschriebene OLE Server ohne Parameter aufgerufen und gibt somit einfach den Text “This is a test…()” zurück. Dieser Text stellt eine gültige HTML Seite für beliebige Web-Browser dar.

Die Idee ist es nun, HTML Seiten mit Hotlinks zu verschiedenen Methoden zu erstellen. Diese Links können in Form eines Buttons oder ähnlichem erstellt werden. Diese Methoden würden dann neue HTML Seiten (on the fly) erstellen. Auf diese Art und Weise können Sie eine komplette Internet Applikation erstellen.