Lade...
 

Zugriffsfunktion

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_INTEGER) 
           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! 

InstantView Scriptsprache