Session D-FOND

VFP 6 Foundation Classes in eigenen Anwendungen nutzen

Andreas Flohr
INDISOFT GmbH - Hannover


Einführung

Visual FoxPro 6.0 wird mit einer Sammlung von Klassenbibliotheken, die Foundation Classes genannt werden, ausgeliefert. Dabei handelt es sich um einen Sammlung von über 100 Klassen, die auf den VFP-Basisklassen aufsetzen. Alle diese Klassen sind mit VFP-Code geschrieben und erweitern die Standardfunktionalität der VFP-Basisklassen erheblich.

Die Visual FoxPro Foundation Classes ermöglichen dem Entwickler, seine Anwendungen fast oder ganz ohne Programmierung mit zusätzlicher Funktionalität zu versehen. Weiterhin enthalten die Foundation Classes generische Klassen, welche immmer wiederkehrende Aufgaben übernehmen, so daß man nicht bei jeder Anwendung das Rad wieder neu erfinden muß.

Die Foundation Classes bieten dem Entwickler z.B. Unterstützung in der Anwendungsentwicklung in den Bereichen:

  • Gebräuchliche Datenbankentwicklungstools und -strukturen
  • Schnelle, erweiterbare generische Komponenten
  • Komponenten zur Verbesserung und einfachen Entwicklung von Web-Seiten
  • Nutzung von System-API-Funktionen
  • Funktionen für ein professionelles Erscheinungsbild einer Anwendung

Die Foundation Classes befinden sich im Unterverzeichnis \Ffc. Sie können frei mit den von Ihnen erstellten Anwendungen vertrieben werden.

Struktur der Foundation Classes

Sicherlich ist Ihnen bekannt, daß man bei der Entwicklung von Anwendungen nicht direkt die Basisklassen von Visual FoxPro nutzen sollte. Dazu ist es erforderlich, zuerst in einer eigenen Klassenbibliothek eine Ableitung aller Basisklassen abzulegen.

Selbstverständlich ist dieses Konzept auch bei den Foundation Classes angewandt worden. In der Klassenbibliothek _base.vcx befindet sich eine Ableitung aller VFP-Basisklassen, und (fast) alle anderen Foundation Classes sind von den Klassen der Klassenbibliothek _base.vcx abgeleietet.

Man kann sich die abgeleiteten Basisklassen in der Komponentengalerie ansehen. Im Katalog "My Base Classes" werden alle Klassen der Klassenbibliothek _base.vcx angezeigt. Durch einen Doppelklick auf eine der angezeigten Klassen kann diese im Klassendesigner zur Änderung geöffnet werden.

Basierend auf diesen Klassen befinden sich im Katalog "Visual FoxPro Catalog" und dort im Ordner Classes alle anderen Foundation Classes. Dies Klassen sind in weiteren Unterordnern nach Funktionsgruppen sortiert, so daß Sie eine Klasse, welche Sie für eine bestimmte Funktionalität benötigen, sehr schnell finden können: In der Abbildung auf der nächsten Seite sehen Sie z.B. den geöffneten Unterordner Dialogs, in dem sich die folgenden generischen Formularklassen befinden:

  • About Dialog Ein einfaches About-Formular für Ihre Anwendungen
  • Password Dialog Ein einfaches Login-Formular für Ihre Anwendungen
  • Splash Screen Ein einfacher Eröffnungsbildschirm für Ihre Anwendungen
  • Thermometer Fortschrittsanzeige während der Ausführung einer Aktion
  • Keywords Anzeige und Auswahl einer Liste von Schlüsselwörtern
  • Item Locator Ein Formular zum Suchen und Auswählen von Dateien

Bevor Sie Ihrer Anwendung eine Foundation Class hinzufügen können, müssen Sie die Basisklasse einer Foundation Class kennen. Bestimmte Foundation Classes können nur als visuelle Objekte in Formularen verwendet werden, wohingegen andere nicht-visuell sind und programmgesteuert aufgerufen werden können, ohne zuvor in einem Formular plaziert werden zu müssen. Sie können in der Komponentengalerie für jede Foundation Class ein Kontextmenü mit der rechten Maustaste aufzurufen. Wählen Sie aus dem Kontextmenü Eigenschaften, und klicken Sie dann auf die Registerkarte Klassen, um die Basisklasse anzuzeigen.

Visuelle und Nicht-Visuelle Foundation Classes

Man unterscheidet bei den Foundation Classes grundsätzlich zwischen visuellen und nicht-visuellen Klassen.

Die visuellen Foundation Classes können häufig ohne zusätzliche Programmierung verwendet werden. Sie können diese Klassen entweder auf ein Formular ziehen, oder direkt eine Form aus dieser Klasse erzeugen. Die Visuellen Foundation Classes stellen z.B. Dialogfunktionalität für Ihre Formulare, sowie um zusätzliche Funktionalität erweiterte Steuerelemente zur Verfügung.

Die nicht visuellen Foundation Classes basieren oftmals auf der Klasse _custom. Zum Einsatz dieser Klassen in Ihre Anwendung ist zusätzlicher Programmcode erforderlich. Diese nicht-visuellen Foundation Classes führen häufig allgemeine Aufgaben wie z.B. das Überprüfen von Informationen in der Windows-Registrierung, die Behandlung von Umgebungseinstellungen oder die Handhabung von Anwendungsfehlern aus.

Sie können diese nicht-visuellen Klassen in ein Formular ziehen, aber damit diese in Ihrer Anwendung arbeiten, ist etwas zusätzliche Arbeit erforderlich. Bei einigen Klassen wird ein Steuerelement-Assistent gestartet, wenn Sie eine Foundation Class in ein Formular ziehen, in dem Sie zur Eingabe von Eigenschaften und Methoden aufgefordert werden.

Verwenden der Foundation Classes in eigenen Anwendungen

Die nachfolgenden Beispiele zeigen auf, wie man die visuellen und nicht-visuellen Foundation Classes in den eigenen Anwendungen verwenden kann.

Beispiel: Foundation Class _splash (_dialogs.vcx)

Die visuelle Foundation Class _splash kann in Ihrer Anwendung beim Anwendungsstart einen Einführungsbildschirm ausgeben, der eine einstellbare Zeit angezeigt und dann automatisch geschlossen wird. Die Einbindung in Ihre Anwendung wird wie folgt vorgenommen:

  1. Ziehen Sie die Foundation Class "Splash Screen" aus der Komponentengalerie (Ordner Classes\Dialogs) in Ihr Projektfenster. Sie haben jetzt folgende Möglichkeiten:
    • Die Klasse dem Projekt hinzufügen
    • Eine Ableitung der Klasse zu erstellen
    • Ein Formular, basierend auf dieser Klasse zu erstellen

Erstellen Sie ein Formular mit dem Namen Mysplash.scx, welches auf dieser Klasse basiert, damit Sie keine Anpassungen an der Klasse vornehmen müssen.

  1. Füllen Sie die Formulareigenschaft Picture mit einem für Ihre Anwendung passenden Bitmap, um ein Bild auf dem Formular auszugeben. Ändern Sie die Caption-Eigenschaft des im Formular befindlichen Labelobjektes auf den Namen Ihrer Anwendung. Optional können Sie noch die Anzahl der Sekunden, die dieses Formular angezeigt wird, in der Eigenschaft nDuration verändern. Der Defaultwert ist 3 Sekunden. Starten Sie dann das Formular, um sich das Ergebnis anzusehen:
  2. Jetzt müssen Sie nur noch dieses Formular innerhalb Ihrer Anwendung aufrufen. Dieses Formular sollte im Startprogramm Ihrer Anwendung als erstes Formular und noch vor dem READ EVENTS Befehl geschehen.
DO FORM MySplash

Beispiel: Foundation Class _aboutbox (_dialogs.vcx)

Die visuelle Foundation Class _aboutbox ist ein Info-Formular, basierend auf der Klasse _form, welches bei den neutigen Anwendungen über den Menüpunkt Hilfe/Info erreichbar sein sollte. Typischerweise werden in einem solchem Formular Informationen, wie z.B. Versionsnummer, Copyright, Lizenzsierter User u.ä. angezeigt. Zusätzlich ist ein Button für den Auruf des Programmes msinfo.exe vorgesehen. Die Einbindung in Ihre Anwendung wird wie folgt vorgenommen:

  1. Ziehen Sie die Foundation Class "About Dialog" aus der Komponentengalerie (Ordner Classes\Dialogs) in Ihr Projektfenster. Sie haben jetzt folgende Möglichkeiten:
    • Die Klasse dem Projekt hinzufügen
    • Eine Ableitung der Klasse zu erstellen
    • Ein Formular, basierend auf dieser Klasse zu erstellen

Erstellen Sie ein Formular mit dem Namen Myinfo.scx, welches auf dieser Klasse basiert, damit Sie keine Anpassungen an der Klasse vornehmen müssen.

  1. Füllen Sie die Picture-Eigenschaft des Imageobjektes mit einem für Ihre Anwendung passenden Bitmap. Ändern Sie den Caption-Eigenschaft der im Formular befindlichen Labelobjekte auf die passenden Werte für Ihre Anwendung ab. Starten Sie dann das Formular, um sich das Ergebnis anzusehen:

  1. Jetzt müssen Sie nur noch dieses Formular innerhalb Ihrer Anwendung aufrufen. Dazu fügen Sie mit dem Menüdesigner einen Menüpunkt Info im Menü Hilfe ein. Als auszuführenden Befehl geben Sie ein:
DO FORM MyInfo

Beispiel: Foundation Class _resizable (_base.vcx)

Die nicht-visuelle Foundation Class _resizable ist ein Custom-Objekt, welches beim Resize eines Formulars dafür sorgt, daß sich alle sichtbaren im Formular befindlichen Objekte in der Größe und Position an das Formular anpassen. Damit geben Sie dem Benutzer Ihrer Anwendung die Möglichkeit, sich die Größe seiner Formulare individuell, auch im Bezug auf die Bildschirmauflösung, einzustellen. Die Einbindung in Ihre Anwendung wird wie folgt vorgenommen:

  1. Ziehen Sie die Foundation Class "Resize Object" aus der Komponentengalerie (Ordner Classes\User Controls ) in Ihre Form. Damit wird ein Unterobjekt ihres Formulars mit dem Namen _resizable1 erstellt.
  2. Jetzt müssen Sie Ihrem Formular programmatisch Code hinzufügen, damit die Resize-Funktionalität auch ausgeführt werden kann. In der Visual FoxPro Hilfe steht dazu folgender Satz:

"Wenn Sie die Klasse zu einem Formular hinzufügen, müssen Sie die Methode AdjustControls des Resize-Ereignisses der Steuerelemente des Formulars spezifizieren."

Was will uns der Autor dieses Satzes damit sagen ??

Das Resize-Ereignis eines Formulars tritt ein, wenn Sie am Rand des Formulars anfassen und dann mit gedrückter Maustaste die Maus verschieben und die Formulareigenschaft Borderstyle = 3 (Sizable) ist. Wenn wir jetzt Code in das Resize-Event des Formulars einfügen, wird dieser beim Auftreten des Ereignisses ausgeführt. Die Foundation Class _resizable besitzt eine Methode AdjustControls, die für die Größenanpassung der Steuerelemente des Formulars zuständig ist. Also rufen wir diese Methode im Resize-Event des Formulars auf:

Thisform._resizable1.AdjustControls()

Das ist alles. Starten Sie ihr Formular und ändern Sie die Größe.

Alternative

Sie können eine nicht-visuelle Foundation Class in Ihrer Anwendung auch verwenden, ohne diese in ein Formular zu ziehen. Dazu müssen Sie allerdings die Klasse in das zur Erstellung Ihrer Anwendung verwendete Projekt einschließen. Der folgende Code illustriert, wie Sie die Klasse _resizable benutzen können, ohne daß sie in ein Formular gezogen wurde.

   *-- Im Init()-Event der Form tragen Sie folgendes ein:
   DODEFAULT() && Den Code der Parentklasse ausführen
   thisform.AddObject("oResize","_resizable")
   *-- Im Resize()-Event der Form tragen Sie folgendes ein:
   Thisform.oResize.AdjustControls()
Anmerkung: Wenn Sie eine nicht-visuelle Foundation Class verwenden, müssen sie wissen, wie und wo die Klasse in Ihrer Anwendung verwendet wird, damit der Gültigkeitsbereich richtig gewählt wird. Verwendet nur ein einziges Formular die Klasse, so können Sie diese einfach in das Formular ziehen. Wird die Klasse jedoch von vielen Formularen oder gar global in der Anwendung verwendet, so sollte die Foundation Class einen globalen Gültigkeitsbereich in der Anwendung haben, so daß in der ganzen Anwendung auf sie zugegriffen werden kann. Ein globaler Gültigkeitsbereich könnte auch zur Erhöhung der Leistung beitragen.

Änderungen/Erweiterungen der Foundation Classes

Sie können die Visual FoxPro Foundation Classes verändern oder erweitern, damit diese den Bedürfnissen Ihrer Anwendungen gerecht werden. Führen Sie dies Änderungen bzw. Erweiterungen jedoch NIEMALS in den Foundation Classes selbst durch, da diese mit Sicherheit in zukünftigen Version aktualisiert werden.

Szenario

Nehmen wir einmal an, Sie möchten alle Ihre Formulare mit der Foundation Class _resizable versehen (siehe Beispiel) und Ihre Formulare wären alle von der Foundation Class _form aus _base.vcx abgeleitet.

Jetzt könnten Sie in der Foundation Class _form den entsprechenden Code einfügen und alle von dieser Klasse abgeleiteten Formulare hätten die gewünschte Funktionalität. Wenn Sie jedoch dann die Visual FoxPro Foundation Classes mit einer neuen Version aktualisieren, sind alle Ihre gemachten Änderungen an diesen Klassen verloren !

Vorgehensweise

Wenn Sie mit der Entwicklung von Anwendungen beginnen, welche die Foundation Classes nutzen, sollten Sie nachfolgende Vorgehensweise wählen:

  • Erstellen Sie von allen Visual FoxPro Basisklassen Ableitungen in eine eigene benutzerdefinierte Klassenbibliothek, z.B. mit dem Namen MyBase.vcx. (Sofern Sie nicht bereits eine solche Klassenbibliothek besitzen.) In dieser Klassenbibliothek können Sie dann die Klassen mit zusätzlicher Funktionalität versehen, die für Ihre Anwendungen erforderlich sind.
  • Definieren Sie die Foundation Classes in _base.vcx um, so daß diese von Ihren eigenen Klassen aus der Klassenbibliothek MyBase.vcx abgeleitet sind. Sie können dies im Klassenkatalog über den Button "Neu definieren" durchführen. Dadurch erben auch alle Foundation Classes, die sich nicht in der _base.vcx befinden automatisch von Ihren Basisklassen.
  • Jetzt können Sie in Ihrer Anwendung die Visual FoxPro Foundation Classes nutzen und haben zusätzlich alle Ihre Änderungen und Erweiterungen im Zugriff. Bei einer neuen Version der Foundation Classes sind Ihre Änderungen bzw. Erweiterungen nicht betroffen und können sofort weiter verwendet werden.
Hinweis: In den Foundation Classes in der Klassenbibliothek _base.vcx befindet sich für alle Klassen Programmcode in den Standardmethoden Destroy(),Init(),Release() und Error(). Leider hat man dort den Aufruf von DODEFAULT() vergessen, so daß ein eventueller zusätzlicher Code, der sich in Ihren Basisklassen in den gleichen Methoden befindet, nicht ausgeführt wird.

Zusammenfassung

Die neuen Visual FoxPro Foundation Classes bieten eine Menge neuer Funktionalitäten und können dem Entwickler bei der Anwendungserstellung einiges an Arbeit abnehmen. Vor dem Einsatz einer Foundation Class ist allerdings immer ein Blick in die Hilfe empfehlenswert, dort wird erklärt, welche Eigenschaften gefüllt werden müssen, und welche Methoden evtl. auszuführen sind, um das gewünschte Verhalten zu erreichen. Eine gute Hilfe ist auch die Beispielanwendung Solutions.App, in der die weitergehenden Möglichkeiten einiger Foundation Classes gezeigt und beschrieben werden.

Die Foundation Classes sind mit Sicherheit ein Schritt in die richtige Richtung, trotzdem darf nicht vergessen werden, daß es sich bei den Foundation Classes um eine Sammlung von Klassen handelt, die nicht mit einem kommerziellen Framework verglichen werden kann (und auch nicht soll.)

Auf der CD-ROM zur Devcon finden Sie eine Beispielanwendung, welche die Nutzung von weiteren Foundation Classes zeigt.

Für Fragen stehe ich Ihnen jederzeit unter Flohr@indisoftware.de zur Verfügung. Sie erreichen mich auch im dFPUG-Forum auf Compuserve unter CIS 106205,3221 oder auf unserer Website http://www.indisoftware.de.