Zugriffsfunktion
Neben dem direkten Zugriff auf ein Datenmember erlaubt InstantView® den indirekten Zugang über eine Funktion, die als letzter Term im Zugriffsaufdruck steht. Die Zugriffsfunktion muss den Datentransfer in beiden Richtungen behandeln. Als erster Parameter wird ein Descriptor übergeben:
class CXS_VIEW_DESCRIPTOR { public: CXS_VIEW_DESCRIPTOR(ZIL_OBJECTID _type, unsigned int _flags); ZIL_OBJECTID type; // Datentyp short altered; // wurden Daten geändert? union { unsigned int flags; // Flags char *backRef; // Name einer Backreferenz } ctl; union { void *p; // Daten char *s; int *i; CXB_MULTIPLE_STRING *m; } data; };
Dazu folgendes Beispiel:
C++-Code:
class C : public CX_CLASS // a hypothetical class { . . . void Z(CXS_VIEW_DESCRIPTOR *d); int z; . . . }; void C::Z(CXS_VIEW_DESCRIPTOR *d) { if (d->type != IDX_<span class="no_deepl_translate">INTEGER</span>) THROW1(CXE_ACCESS_FUN_CANNOT_HANDLE); // a MA function has not to support // all types given below if (d->data.i) // InstantView® --> object z = abs(*d->data.i); else // object --> InstantView® *d->data.i = z; }
Aufruf in InstantView®:
Integer(C::Z(), 100, 12, 200)
Der Deskriptor beschreibt den Type des Parameters und enthält einen Pointer auf den Wert. Der Typ hängt ab vom Kontext, in dem die Funktion benutzt wird:
verwendet mit | ergibt Typ | Bemerkung |
---|---|---|
Windowobjekt String | IDX_STRING | |
Windowobjekt Prompt | IDX_STRING | |
Windowobjekt Combobox | IDX_STRING | |
Windowobjekt MultipleString | IDX_MULTIPLE_STRING | |
Windowobjekt Integer | IDX_INTEGER | |
Windowobjekt Radio | IDX_INTEGER | |
Windowobjekt Checkbox | IDX_INTEGER | |
Windowobject Enumeration | IDX_INTEGER | |
Windowobject ObjectList | IDX_COLL | mit Flag SELECT_MULTIPLE oder ENTIRE |
Windowobject ObjectList | IDX_POINTER | sonst |
Windowobject ObjectCombobox | IDX_POINTER | |
Windowobject Auto | IDX_UNKNOWN | siehe *) |
Put mit Zeichenkette | IDX_STRING | |
Put mit integer | IDX_INTEGER | |
Copy | IDX_STRING | |
Get | IDX_CLASS |
*) | Die Funktion wird zweimal aufgerufen: Zuerst, um den Typ zu erfragen, nach dem sich das Auto-Widget in ein konkretes Windowobjekt verwandelt; danach ein zweites mal für den eigentlichen Datentransfer mit einem Typ entsprechend des aus Auto hervorgegangenen Windowobjekts. |
Im Descriptor werden die Flags des Windowobjekts (String, Combobox, ...) bzw. bei OboxEdit die Flags des entsprechenden Formatelements der ObjektBox übergeben. Bei der Bindung an eine ObjektBox wird statt dessen die Back-Referenz in den Deskriptor gestellt. Bei Put/Copy ist der Wert des Flags immer Null.
Der erste Parameter (CXS_VIEW_DESCRIPTOR) erscheint nicht im InstantView®-Code. Im MDI wird dafür das Schlüsselwort MA (Member access function) angegeben. Weitere (normale) Parameter können folgen:
void C::Z(CXS_VIEW_DESCRIPTOR *d, char *s, int k) { . . . }
Aufruf in InstantView®:
Integer(C::Z("abcdef", 3), 100, 12, 200)
Hinweis: Eine MA-Funktion unterstützt den Datenaustausch in einem bestimmten Kontext (Windowobjekt + FillWindow/DrainWindow bzw. Get, Copy oder Put. Der Kontext bestimmt, was die Funktion leisten soll.
Bei einem Aufruf mit Call bleibt offen, was von der Funktion erwartet wird.
Deshalb gilt: MA-Funktionen dürfen nicht mit Call aufgerufen werden!