GetDataEditData
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)