Transformatortool Xbase ++ to Express
Ergebnis der Transformationsarbeit von XPP2DC ist "Express-Code" in der einfach zu lesenden @ x,y, Notation, der funktionsgleich zu nativen Xbase++ arbeitet, aber wesentlich einfacher zu pflegen ist.
Beispiel: Zusammenarbeit mit dem XPP-Formdesigner
Folgende Beispielmaske wurde mit dem XPP-Formdesigner erstellt:

Aus dieser Maske wurde nun mit dem Transformatortool Xbase-Code für Express erstellt, der nach Compilierung und dem Hinweis, daß 3 SLEs der Ausgangsmaske nicht aufgelöst werden konnten und manuell nachzubearbeiten sind, folgende Maske zum Ergebnis hat.

Der Grund, daß die transformierte Maske etwas größer ist als die
Ausgangsmaske ist folgender: Die Schriftart für die Says und "Get-Felder" wird in dem erzeugten Express-Code
durch den Rückgabewert der Funktionen
func DcSayFont() und
func DcGetFont()
bestimmt. Die Funktion DcGetFont lieferte für dieses Beispiel den Fixedspace-Font
Courier 10 zurück, daher muß das Format der transformierten Maske natürlich
etwas größer als in der XppFd-Ausgangsmaske sein, die für die SLE´s einen
Proportional-Font vorsah.
Der Zeichenabstand für die Berechnung der Zeichenabstände kann in Express jedoch durch die die "GetOption" COLPIXELS festgelegt werden, so daß auch das originale Erscheinungsbild der Maske mit nahezu identischen Abmessungen hergestellt werden könnte, wenn gewünscht.
Der in der Maske oben eingefügte Platz ist dafür vorgesehen, beim Einsprung in ein GET-Feld dort einen entsprechenden Eingabehinweis anzeigen zu können. Alle transformierten GET-Felder sind mit einer entsprechenden Funktion vorbelegt.
Der erzeugte Code enthält automatisch erzeugten Var-Declarationen für den Zugriff auf die Checkboxen, Sle´s usw. Die Kommentare wurden automatisch erzeugt. Hier ein Ausschnitt aus dem erzeugten Code:
|
Hier ein anderer Ausschnitt:
|
Die Verfahrensweise bei der Transformation im Einzelstepmodus:
Der XPP-Formdesigner erstellt folgenden Code aus der XFF-Datei:
|
Ich modifiziere dann die Datei zum Test der Form MIETER.PRG auf folgende Art und produziere dann damit den Express-Code :
|
Ich binde dann die erzeugte Datei "Xpp2Dc_.PRG" in das Link-Script und ändere die Procedure Main wie folgt, dann ist es soweit :
|
Drei SLEs konnten in der obigen Beispielmaske vom XPP2DC-Transformatortool nicht aufgelöst werden. Der Grund war jeweils, daß im XppFd für diese SLEs kein :datalink angegeben wurde. Entsprechende Express-GETs wurden trotzdem erzeugt (so hat man wenigstens schon mal die genaue Position der SLEs im Express-Code), mussten aber von mir manuell auskommentiert werden. Dann compilierte es fehlerfrei durch.
Dann noch linken und das Ergebnis ist oben zu sehen. Dauer der Transformation bis zum Ergebnis: Ca. 5 Minuten vom nach dem Erstellen der XppFd-Form an gerechnet.
Mit der Transformation dieser Maske hat XPP2DC zwar schon einiges getan, aber dieses Tool kann noch mehr:
Transformation von "handcodierten" Xbase-pur Masken
(Mit handcodierten Xbase-Pur-Masken meine ich Masken, die nicht mehr in dem Format vorliegen, wie es auf dem Formdesigner rauskam, sondern die schon angepasst worden. Beispielsweise kann das die Einbindung neuer Klassen sein, z.B. DataDlg oder auch die nachträgliche Bestückung von Slots wie validate, killinputfocus, usw. mit Codeblöcken. Auch können das Masken sein, die gleich ganz ohne den Formdesigner erstellt worden sind.)
Der besondere Witz des XPP2DC-Tools liegt in einer speziell auf die spezifische Maske abgestimmten statischen "Express<->Xbase-Pur"-Kompatibilitätsklasse
|
die für jede auch noch so komplex aufgebaute Xbase-Maske vom Tool erzeugt wird und die Weiterverwendung des mit der alten Xbase-Pur-Codes und der alten XppForm zusammenhängenden Codes (sofern solcher schon geschrieben wurde) ermöglicht! Und das (oft) ohne* Eingriffe am Code und dies natürlich unter Verwendung der Expressmaske und auch im Zusammenhang mit der neuen Expressmaske.
* Alle in Callback-Slots wie :killInputFocus(), :setInputFocus(), Methoden wie :setdata() :getdata() und IVars wie validate der zu transformierenden Maske implementierten Codeblöcke und Funktionsaufrufe werden nicht nur in den Express-Code übernommen, sondern funktionieren im allgemeinen auch weiter so wie bisher. Dies ist nicht selbstverständlich, denn die aufgerufenen Funktionen greifen ja nach wie vor auf die IVars, Methoden und Slots der alten "Xbase-Pur"-Objekte zu, und nicht auf die neuen von Express-Objekte. Eine kleine Einschränkung gibt es allerdings: Aus Codeblocks heraus aufgerufenen Funktionen, die die Inhalte der Maske ändern, müssen an die die neue Express-GET-Objekte angepasst werden. Der Aufwand ist jedoch sehr überschaubar. In den aufgerufenen Funktionen müssen (soweit ich erkennen kann) nur noch die Aufrufe von XbpSLE:setdata() angepasst werden-> o:setdata( "Neuer Wert") wird zu o:XbpSle:Setdata( "Neuer Wert"). Dies jedoch kann wohl kaum jemals durch ein Tool automatisiert werden, insofern leistet das doch Tool schon so ziemlich alles, was zur automatischen Transformation bei maximalem Erhalt und Weiterverwendung des Ausgangscodes überhaupt möglich ist.
Ein weiteres kleines Detail
Manche Programmierer bevorzugen es, nicht direkt auf der Datenbank zu editieren, sondern lesen die zu editierenden Daten erst einmal in ein Array, editieren das Array und schreiben dann alles komplett zurück. Etwa so:
|
So wird vermieden, daß der Datensatz im Netz lange gelockt werden muß. Auf diese Arrays wird dann zwecks Lesbarkeit meist mit symbolischen Konstanten zugegriffen (wie oben, zumeist aber per .ch-files eingebunden). Diese symbolischen Konstanten sind natürlich zur Laufzeit des Programms (wenn das Tool diese Maske analysiert und daraus Express-Code erzeugt) aufgelöst.
XPP2DC erlaubt die "Rückwärtsauflösung" von Arrays, die zum Einlesen benutzt werden, so daß im erzeugten Code wieder gut lesbarer Code (mit symbolischen Konstanten) steht.
Ein nützlicher Nebeneffekt von XPP2DC:
FALLS BISHER KEINE SYBOLISCHEN KONSTANTEN IM CODE ZUM EINLESEN VON ARRAYS
BENUTZT WURDEN, KANN MAN DAS TOOLS AUCH DAZU VERWENDEN, KONSTANTEN DURCH
SYMBOLISCHE KONSTANTEN ZU ERSETZEN, INDEM MAN EINFACH PER CH-FILE DIE
ERSETZUNGEN VORGIBT.