GetDataEditData

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen

Datenübertragung zwischen dem Programm und Xbase-Parts

Die meisten Xbase-Parts dienen dazu, Daten am Bildschirm zu präsentieren.

Der klassische Programmier-Ansatz sieht (in etwas) so aus:

Auslesen der Felder einer DBF-Datei
Ausgabe der Felder über die GET-Anweisung
Einlesen der Eingaben/Änderungen
Zurückschreiben der Felder in die DBF-Datei

Der Ansatz, der in Xbase++ gewählt wurde, weicht davon ab.

Betrachten wir dazu einmal ein XbpSLE() Objekt.


ein Xbase-Part als Endprodukt einer Vererbungskette

XbpSLE() ist die Summe folgender Klassen:

Die Instanzvariable :cargo wird beispielsweise von XbpPartHandler() beigesteuert.

Unser XbpSLE() ist aus Baukastenelementen zusammengesetzt, die - jedes für sich - bestimmte Aufgaben übernehmen und umsetzen.

Für das Standard-Verhalten (!) von :setData()/:getData() ist DataRef() verantwortlich.


Ererbtes von DataRef()

DataRef() erlaubt die Manipulation von Daten in Xbase-Parts. Vorsichtig formuliert, da der jeweilige Programmier-Stil hier grossen Einfluss auf die Verhaltenweise hat.


:dataLink

Die Instanzvariable :dataLink enthält einen Codeblock, der anweist, wie Daten zu laden und zu speichern sind.

Die Standard-Vorbesetzung ist

oXbp:dataLink := {|x| IIf(x==NIL, cText, cText := x)}

oder

oXbp:dataLink := {|x| IIf(x==NIL, DATEI->xFeld, DATEI->xFeld := x)}

Wird Eval(oXbp:dataLink) ausgeführt, und es wird kein Argument übergeben, dann wird der Wert aus cText (oder DATEI->xFeld) verwendet. Wird ein Argument übergeben, so wird der Inhalt des Argumentes in cText (oder DATEI->xFeld) gespeichert.

Die beiden Methoden :setData() und :getData() führen automatisch :dataLink aus, wenn ein CodeBlock hinterlegt ist.

Dies erklärt auch, warum die Methode :setData() nicht zwingend ein Argument braucht: die Herkunft der Daten ist über :dataLink geregelt.


:EditBuffer()

Über die Methode :editBuffer() erhält man Zugriff auf den Inhalt, der aktuell in einem Xbase-Part hinterlegt ist (bzw. angezeigt wird). Das Format ist immer abhängig von der Art des Xbase-Part, d.h. eine XbpCheckBox() liefert einen logischen Wert, und ein XbpSpinButton() liefert einen numerischen Wert zurück.

EditBuffer() akzeptiert keine Parameter, sondern liest nur den Inhalt des internen EditBuffer aus.

Der Zugriff auf diese Methode geschieht ohne dass :dataLink ausgeführt wird:


:getData()

Die Methode :getData() führt :dataLink aus und liefert im zweiten (!) Schritt den Wert zurück, den das betreffende Xbase-Part enthält.

Wenn :dataLink in der Zuweisung den Wert in ein DBF-Feld zurückschreibt, dann wird bei der Ausführung der :getData() Methode das korrespondierende DBF-Feld geändert.


Vergleich der Methoden in Abhängigkeit von :dataLink

Abhängig davon, ob :dataLink einen Codeblock enthält oder nicht, sind die Auswirkungen der Methoden unterschiedlich:

:dataLink :setData() :setData(x) :getData() reiner Zugriff auf Daten in EditBuffer
CodeBlock Datenzuweisung aus CodeBlock Datenzuweisung aus Parameter Zielfeld aus Codeblock wird geändert :editBuffer()
NIL Datenzuweisung wird ignoriert Datenzuweisung aus Parameter keine Änderung eines dritten Feldes :editBuffer() ODER :getData()


(artikelinarbeit)