Session V-MAXX

Highlights der neuen ClassMaxX-Version 6.0

Andreas Flohr
INDISOFT GmbH - Hannover


Einleitung

ClassMaxX, das deutsche Framework für Visual FoxPro ist jetzt auch in einer Version für VFP6 erhältlich. Dabei handelt es sich nicht nur um eine neukompilierte Version mit dem alten Quellcode, selbstverständlich sind auch die neuen Möglichkeiten von Visual FoxPro 6 genutzt worden, um Ihnen ein noch einfacheres Arbeiten zu ermöglichen. Weiterhin sind vielfältige Erweiterungen sowie neue Funktionalitäten, auch durch die Vorschläge unserer Anwender, integriert worden, um Ihnen die Entwicklung von professionellen, stabilen und office-kompatiblen Windows-Datenbankanwendungen noch einfacher zu machen.

Für alle, die ClassMaxX noch nicht kennen, hier noch einmal in Kürze die bereits bewährten Funktionalitäten des Frameworks:

  • ClassMaxX erstellt für Sie mit seinem Application-Builder einen individuellen Anwendungsrahmen für Ihre Anwendung inkl. des Anwendungsprojektes sowie der benötigten Dateien.
  • ClassMaxX erzeugt für Sie die Standard-Funktionalitäten der Anwendungsarchitektur, wie z.B. Main-Programm, Standard-Anwendungsmenü, Erstellen eines mächtigen Applikations-Objektes, Intro-Fenster, Benutzeranmeldung und Verwaltung, Formular-Steuerung, Datensatz-Navigation und den kompletten Standard-Datendialog.
  • ClassMaxX sorgt für die Synchronisation von Menü und Toolbar
  • ClassMaxX stellt Ihnen in seinen Klassenbibliotheken über 60 Klassen zur Verfügung, die Sie in Ihrer Anwendung nutzen können, die aber trotzdem transparent für jede eigene Erweiterung und Anpassung sind.

ClassMaxX - Was ist neu ?

Nachfolgend werden wir Ihnen einige der Highlights der neuen ClassMaxx-Version vorstellen, wie z.B:

  • Erweiterter Application-Builder
  • Vollständige und durchgängige Unterstützung der Entwicklung von Client-Server Anwendungen mit Remote-Views und/oder SQL-Passthrough Technologie ohne zusätzlichen Programmieraufwand durch die neuen SQL-Klassen mit Ihren Wrapper-Methoden
  • Komplette Behandlung von Aktualisierungkonflikten im Netzwerk für Fileserver und Client-Server-Anwendungen.
  • Automatische Verwaltung von Form-zu-Form Verbindungen mit automatischen kaskadierten Refresh() und Destroy()-Methoden.
  • Ein zentrales Error-Management für die gesamte Anwendung inkl. vielfältiger Einstellungsmöglichkeiten für Errorlogging.
  • Neue Debugging- und Ausgabemöglichkeiten in einer laufenden EXE-Datei, inkl. Kommandointerpreter.
  • Business-Objects für ClassMaxX: Eine völlig neue Art der Anwendungsentwicklung

Application-Builder

Der erweiterte Application-Builder ist der 1. Schritt in der Erstellung einer Anwendung mit ClassMaxX. Durch Eingabe von Anwendungsverzeichnis und -name können Sie bereits die Anwendung erstellen. Alle anderen Einstellungen werden dann mit Default-Werten versehen, die Sie natürlich zu einem späteren Zeitpunkt immer noch ändern können:

Neu ist die Seite Daten des Application-Builders. Auf dieser Seite können Sie jetzt zusätzlich zu den Einstellungen für Ihre Datenbank auch die Namen der User- und Modultabelle vorgeben und sogar die Feldnamen der Usertabelle bestimmen.

Neu ist auch die Eigenschaft Datenbanktyp. Wenn Sie hier einen anderen Datenbanktyp als Visual FoxPro auswählen (z.B. MS-SQL Server V.6.x), wird die Seite Remote-Daten aktiviert:

Auf dieser Seite können Sie die Grundeinstellungen für Ihre Client-Server Anwendung, wie z.B. Verbindungsname, Automatischer Aufbau einer Verbindung bei Programmstart und weitere Einstellungen für Remote-Views vornehmen. Lassen Sie dann den Anwendungsrahmen generieren, definieren Sie die Verbindung im Datenbankcontainer und Ihre Anwendung ist fertig vorbereitet, um mit Remote-Daten zu arbeiten !

Die anwendungsspezifische Klassenbibliothek

Nachdem Sie Ihre Anwendung mit dem Application-Builder erstellt haben, nennen wir Sie einmal DEVCON98, steht Ihnen in Ihrer Anwendung eine sauber strukturierte Anwendungsspezifische Klassenbibliothek (DEVCLASS.VCX) mit mehreren Custom-Klassen zur Verfügung. In diesen Klassen sind die im Application-Builder festgelegten Einstellungen Ihrer Anwendung hinterlegt. Im Einzelnen handelt es sich dabei um:
DevApp l Die Klasse, aus der das Applikationsobjekt (oApp) instanziiert wird. Sie enthält
grunsätzliche Einstellungen für die Anwendung, die Methoden zum Aufruf von
Formularen u.v.m.
DevEnvironment Eine Klasse, in der sich die Umgebungsinformationen, einschließlich der Zugriffs-
methoden für Ini-Dateien u.ä. befindet. Diese Klasse wird als Unterobjekt des
Applikationsobjektes instanziiert (oApp.oEnv).
DevTools Diese Klasse enthält eine Sammlung von nützlichen Methoden, die Sie immer wieder
in Ihrer Anwendung benötigen werden. Diese Klasse wird als Unterobjekt des
Applikationsobjektes instanziiert (oApp.oTool).
DevData Diese Klasse ist standardmäßig leer. Sie ist dafür gedacht, um Eigenschaften und Methoden aufzunehmen, die Sie in dieser Anwendung benötigen, und auf die Sie in der gesamten Anwendung Zugriff benötigen. (vergleichbar mit Globalen Variablen und einer Prozedurdatei in der prozeduralen Programmierung). Diese Klasse wird als Unterobjekt des Applikationsobjektes instanziiert (oApp.oData).
DevSQL(NEU) Die SQL-Klasse enthält alle Informationen, welche die Daten Ihrer Anwendung betreffen. Diese Klasse wird als Unterobjekt des Applikationsobjektes instanziiert (oApp.oSQL). Sie wird im nächsten Kapitel näher beschrieben.
DevError(NEU) Bei dieser Klasse handelt es sich um das globale Fehlerobjekt, in dem sich die gesamte Steuerung für Fehlerbehandlungen während der Entwicklung und zur Laufzeit befindet. Diese Klasse wird als Unterobjekt des Applikationsobjektes instanziiert (oApp.oErr). Eine detaillierte Beschreibung folgt weiter unten.

Die SQL-Klasse und ihre Kinder

Die SQL-Klasse ist die Steuerungsklasse für weitere spezielle SQL-Kommandoklassen. In der Standard SQL-Klasse befinden sich die allgemeinen Infomationen über die Daten. Nachfolgend sehen Sie die gesetzten Standardeinstellungen in der SQL-Klasse für eine VFP-Datenbank und für eine Remote-Datenbank nach der Erstellung des Anwendungsrahmens:

Die SQL-Klasse ist intelligent, d.h daß sie beim Programmstart der Anwendung erkennt, mit welchem Datenbanktyp diese Anwendung arbeitet, und dementsprechend die richtige SQL-Kommandoklasse als Commandobjekt instanziiert (oApp.oSQL.oCMD). Der Zugriff auf die Daten geschieht dann nur noch über die entsprechende SQL-Kommandoklasse. Im einzelnen gibt es folgende SQL-Kommandoklassen:
kiSQLCmd Die Standard SQL-Kommandoklasse für den Zugriff auf VFP-Datenbanken
kiSQLCmdMSSQL6 SQL-Kommandoklasse für den Zugriff auf den Microsoft SQL-Server V.6.x
kiSQLCmdOrac7 SQL-Kommandoklasse für den Zugriff auf Oracle V.7.x
kiSQLCmdOBDC SQL-Kommandoklasse für den Zugriff auf beliebige weitere ODBC-Treiber,
wie z.B. ACCESS.

Diese SQL-Kommandoklassen enthalten alle den gleichen Satz von SQL-Wrapper-Methoden für den Zugriff auf die Daten. Sie greifen innerhalb Ihrer Anwendung immer mit den gleichen Methoden und den gleichen Aufrufen auf die Daten zu, und das Commandobjekt sorgt dafür, daß die erforderlichen Datenzugriffe ausgeführt werden. Die Intelligenz befindet sich in den Klassen, Sie brauchen sich darum nicht zu kümmern.

Aktualisierungskonflikte von Daten im Netzwerk

Ein immer wiederkehrendes Problem bei der Anwendungsentwicklung von netzwerkfähigen Applikation sind die auftretenden Aktualisierungskonflikte von Daten und deren Behandlung. Durch die optimistische Pufferung von Daten, bei der die zu ändernden Daten erst beim Zurückschreiben gesperrt werden, tritt folgende Problematik häufiger als früher auf:

Herr A. hat einen Datensatz im Zugriff, um Änderungen an den Daten vorzunehmen. Dann klingelt das Telefon, und Herr A. ist mit dem Telefonat beschäftigt. Währenddessen hat an einem anderen Arbeitsplatz Frau B. den gleichen Satz aufgerufen, um ebenfalls Änderungen an diesem Satz vorzunehmen. Sie speichert Ihre Änderungen ab. Nachdem Herr A. sein Telefonat beendet hat, führt er seine Änderungen durch und speichert den Satz ebenfalls ab. Je nach Aufruf der Tableupdate()-Funktion verliert jetzt entweder Frau B. ihre Änderungen, oder Herr A. kann seine Änderungen nicht abspeichern.

Wieviel Zeit wird damit verbracht, Lösungen zu programmieren, die diese Konflikte abfangen. Damit ist jetzt Schluß !

ClassMaxX bietet Ihnen ein fertiges Konzept zur Behandlung von Aktualisierungskonflikten. Integriert in den intelligenten SQL-Klassen ist die komplette Behandlung von Aktualisierungskonflikten. Dabei ist es völlig unwichtig, ob Sie dabei mit VFP-Datenbanken oder mit Remote-Datenbanken arbeiten. ClassMaxX zeigt diese Konflikte auf und bietet Strategien zur Lösung an. Sie legen nur noch durch Setzen einer Eigenschaften innerhalb der SQL-Klasse fest, nach welcher Strategie verfahren werden soll.

Das folgende Beispiel zeigt die Stategie, wenn es dem Anwender erlaubt ist, selbst zu entscheiden, was im Falle eines Aktualisierungskonfliktes passieren soll. In einem Fenster werden Ihm die Werte seines ursprünglich eingelesen Datensatzes, die aktuell in der Datenbank gespeicherten Werte und seine in der Maske eingegebenen Werte angezeigt:

Mit der Auswahl Neue Werte Speichern werden die aktuellen Werte der Datenbank mit den eigenen eingegebenen Werten überschrieben.

Die Auswahl Aktuelle Werte übernehmen überschreibt die eigenen eingegebenen Werte mit den aktuellen Werten aus der Datenbank.

Die Auswahl Alte Werte wiederherstellen überschreibt die aktuellen Werte in der Datenbank mit den ürsprünglich eingelesen Werten.

Selbstverständlich können Sie auch eine automatische Behandlung von Aktualisierungskonflikten festlegen, wenn der Anwender keine Möglichkeit haben soll, eigene Entscheidungen zu treffen.

Bei besonders sensiblen Daten können Sie auch noch einstellen, daß der Anwender Feldweise die Änderung von Daten im Dialog bestätigen muß.

Verwalten von Form-zu-Form Verbindungen

Der Aufruf eines neuen Formulars aus einem bereits geöffneten Formular und nicht über das Menü, ist eine beliebte Technik in der Anwendungsentwicklung. Sie bringt aber auch eine Menge an zusätzlicher Programmierarbeit und Problemen mit sich, wenn die Formulare nicht-modal sind.

  • Wie gebe ich Änderungen im aufrufenden Formular an das aufgerufene Formular weiter ?
  • Wie aktualisiere ich das aufgerufene Formular, wenn im aufrufenden Formular der Datensatz gewechselt wird ?
  • Wie beende ich das aufgerufene Formular, wenn ich das aufrufende Formular beende ?
  • Wie verhindere ich, daß hängende Referenzen, der Alptraum eines jeden VFP-Programmierers, überbleiben, die meine Anwendung zum Absturz bringen. ?

Mit der neuen Version von ClassMaxX gehören diese Probleme der Vergangenheit an !

ClassMaxX Formulare, d.h. Formulare die von der ClassMaxX-Userklasse frm oder deren Ableitungen erstellt werden, besitzen ein zusätzliches Customobjekt, welches beim Instanziieren der Form ebenfalls erstellt wird (thisform.oEnv) In diesem FormEnvironmentobjekt befinden sich Eigenschaften und Methoden, die dafür zuständig sind, daß Form-zu-Form Verbindungen sauber erstellt und auch wieder abgebaut werden. Es gibt keine Begrenzung der Verschachtelungstiefe der Formularaufrufe. Jedes Formular kennt seinen Vater, von dem es aufgerufen wurde, und seine Kinder, die es selbst aufgerufen hat. Kaskadierte Refresh() und Destroy()-Methoden sind vorhanden und laufen automatisiert ab.

Was müssen Sie tun ?

Standardmäßig rufen Sie im ClassMaxX ein Formular aus dem Menü oder der Toolbar mit der Methode:

oApp.DoForm(<formularname>)

auf. Wenn Sie jetzt ein Formular aus einem bereits geöffneten Formular aufrufen wollen, z.B. in der Click-Methode eines Buttons des Formulars, um weitere Informationen zu diesem Datensatz anzuzeigen, tun Sie dies mit dem Aufruf:

thisform.oEnv.DoForm(<formularname>)

Das ist alles, den Rest übernimmt ClassMaxX für Sie !

Error-Management und Debugging-Möglichkeiten

Bei der Entwicklung von Anwendungen treten Fehler auf. Wer kennt nicht die Fehlermeldungen von Visual FoxPro, die nicht immer unbedingt aussagekräftig sind. Gerade bei objektorientierter Anwendungsentwicklung ist das Errormanagement nicht so einfach wie bei prozeduraler Programmierung.

Auch zur Laufzeit der Anwendungen treten Fehler auf. Dabei ist es dann besonders wichtig zu unterscheiden, ob ein Fehler zu einem geordneten Schließen der Anwendung führen muß, oder ob es möglich ist, den Fehler zu bereinigen und den Programmlauf fortzusetzen.

Wir haben uns Gedanken über diese Problematiken gemacht und stellen Ihnen im ClassMaxX entsprechende Funktionalität zur Verfügung, die es Ihnen, den Entwicklern, erheblich einfacher macht, mit auftretenden Fehlern umzugehen sowie Fehler zur Laufzeit von Anwendungen zu finden und zu beseitigen.

Das Objekt, bei dem ein Fehler auftritt, versucht diesen Fehler in seiner eigenen Error-Methode() zu bereinigen. Wenn dies nicht möglich ist, gibt es den Fehler an das nächste übergeordnete Objekt weiter. Diese Hierarchie wird solange fortgeführt, bis entweder ein Objekt diesen Fehler behandeln kann oder das zentrale Error-Management aufgerufen wird.

Das zentrale Error-Management wird von dem Customobjekt oErr durchgeführt, welches beim Anwendungsstart als Unterobjekt des Applikationsobjektes instanziiert wird. (oApp.oErr). Dieses Objekt hat vielfältige Möglichkeiten zum Behandeln von Fehlern, wie z.B. Fehlerkategorien zur Fehlerprotokollierung, zur Anzeige eines Formulars, in dem der Anwender zusätzliche Informationen zu diesem Fehler eingeben kann usw. Sie können über die Eigenschaften des Error-Objektes einfach festlegen, wie sich das Objekt verhalten soll.

Ein weiteres Problem sind Fehler, die beim Anwender auftreten, die sich aber nicht auf dem Entwicklungssystem nachvollziehen lassen.

Um sie beim Lösen solcher Probleme zu unterstützen stellt Ihnen ClassMaxX Debugging und Ausgabemöglichkeiten innerhalb der laufenden EXE-Datei zur Verfügung. Dieses Tool beinhaltet sogar einen Kommandointerpreter, der es Ihnen ermöglicht, während des Programmlaufes oder beim Auftreten eines Laufzeitfehlers VFP-Kommandos und Befehle einzugeben, um sich zusätzliche Informationen aus der Anwendung zu verschaffen.

Links sehen Sie das Ausgabefenster für Kommandos, im rechten Fenster befindet sich oben die Kommandozeile, darunter eine Listbox mit einer Historie der ausgeführten Kommandos und darunter eine Editbox, in die alle Ausgaben des Debugmodes geleitet werden. Selbstverständlich sind beide Fenster in der Größe veränderbar.

Late-Initialisierung von Objekten.

Die Reihenfolge, in der Visual FoxPro die Objekte instanziiert, d.h. das der Init-Event der Objekte, die sich in einem Container befinden, vor dem Init-Event des Containers ausgeführt werden, kann in gewissen Situationen zu Schwierigkeiten oder sehr umständlichem Code führen. Man stelle sich vor, daß erst der Init-Event des Formulars die Controlsourcen der im Formular enthaltenen Steuerelemente füllt, diese aber bereits in Ihrem Init-Event anhand der Controlsourc-Eigenschaft die Input -oder Formateigenschaft setzt. Dann würde der Code im Init-Event der Steuerelemente keine Funktion haben, oder im schlimmsten Fall sogar zu Fehlermeldungen führen.

Deshalb bietet ClassMaxX jetzt in jeder seiner Basisklassen eine PostInit-Methode an, welche vom Init-Event des Objektes aufgerufen wird. Sie können dieses Verhalten aber so ändern, daß die Postinit-Methode erst nach dem Init des übergeordneten Containers ausgeführt wird. Dazu müssen Sie nur die Eigenschaft lNoInit auf .T. im übergeordneten Container setzten. Damit haben Sie die Möglichkeit, den Ablauf der Codeausführung auf einfachste Weise zu steuern, ohne evtl. doppelten oder wesentlich komplizierteren Code in Ihre Objekte aufnehmen zu müssen.

Business-Objects für ClassMaxX

Mit den zusätzlich erhältlichen Business-Objects für ClassMaxX bieten wir Ihnen ab dieser Version eine Sammlung von Komponenten in einer anwendungsunabhängigen Klassenbibliothek an, die eine neuartige Containerklassen-Technik benutzt, damit Sie mit geringstem Aufwand Dialogmasken erstellen und erweitern können. Diese Technik jetzt hier zu erklären, würde den Rahmen dieses Scriptes sprengen, deshalb sei hier nur soviel gesagt:

Die Business-Objects für ClassMaxX bilden eine 2.Generation von Klassen. Diese Komponenten enthalten für eine Menge von Standardtabellen, wie Adressen, Banken, Postleitzahlen, Dokumente usw. bereits fertige Container inkl.der Steuerelemente, einer Mehrsatzanzeige per Combo-,Listbox oder Grid, sowie der Basistabelle mit dem dazugehörigen View.

Sie binden die Tabelle in Ihre Datenbank ein, setzen den Container auf eine Form und Ihr Formular ist fertig und lauffähig, inklusive aller Dialogfunktionalität zum Neuanlegen,Löschen und Speichern!

Jetzt werden Sie sagen, ja aber meine Adresstabelle benötigt noch diese und jene Felder, die sicherlich nicht vorhanden sind. Kein Problem, fügen Sie Ihre Tabelle mit den entsprechenden Feldern der Datenbank hinzu, setzen Sie die zusätzlichen Steuerelemente in die vorgegebene Ableitung des Containers ein, und Sie sind fertig!

Diese Containertechnik bietet einen weiteren Vorteil. Sie können eine nicht unerhebliche Performancesteigerung in komplexen Masken dadurch erreichen, daß Sie die Container zur Laufzeit erst dann laden, wenn sie benötigt werden.

Jeder BO-Container kann Vater oder Kind sein, d.h. Sie können zwischen den Containern beliebige 1:n:n Beziehungen in beliebiger Verschachtelungstiefe aufbauen und das ohne zusätzlichen Programmieraufwand.

Erstellen Sie sich Ihre eigenen, wiederverwendbaren Komponenten in dem Sie diese aus den Standard BO-Klassen erzeugen.

Zusammenfassung

Auf den vorhergehenden Seiten konnten wir Ihnen nur in sehr komprimierter Form einige der Highlights der neuen ClassMaxX-Version 6.0 zeigen. Natürlich gibt es noch viele weitere Änderungen und Erweiterungen, die wir hier nicht alle aufzählen können. ClassMaxX wird permanent weiterentwickelt, um Ihnen die Anwendungsentwicklung mit Visual FoxPro noch leichter zu machen, damit Sie Zeit und damit auch Geld sparen.

Ein weiterer Schritt in diese Richtung sind die neuen Business-Objects für ClassMaxX, mit denen Sie jetzt auch auf der visuellen Ebene eine noch größere Unterstützung bei Ihrer Entwicklung erhalten.

Bei allem jedoch, was wir Ihnen mit dem ClassMaxX anbieten, vergessen Sie bitte nie:

Wir geben Ihnen die Standardfunktionalität einer professionellen Windows-Anwendung an die Hand, ohne Sie jedoch einzuzwängen. Sie selbst bestimmen das Ergebnis.

Für Fragen steht Ihnen das INDISOFT-Team jederzeit zur Verfügung. Sie erreichen uns auch unter webmaster@indisoft-gmbh.de, im dFPUG-Forum auf Compuserve unter CIS 106205,3221 oder auf unserer Website www.indisoft-gmbh.de.