Lade...
 

Mapping zwischen Modellobjekt und Windowoberfläche

Mapping Modellobjekt ↔ Windowoberfläche

Um Daten in jeder beliebigen Form und Zusammenstellung zu präsentieren, müssen die in der InstantView®-Engine enthaltenen Grundalgorithmen zur Visualisierung wie Bausteine kombiniert werden. Diese Flexibilität erreicht InstantView® durch eine Abbildung der Daten auf die Windowobjekte der Oberfläche. Den Windowobjekten (Eingabefeldern) werden Zugriffsausdrücke zugeordnet, welche die Datenein- und Ausgabe steuern.

Auch die Beziehungen zwischen Objekten werden auf diese Weise visualisiert.

Der Datentransfer vom Modell zur Oberfläche und umgekehrt wird durch vier InstantView®-Anweisungen ausgelöst:

FillWindow Modell → Oberfläche Eingabefelder eines Windows, Objektbox zur Darstellung von Relationen
DrainWindow Oberfläche → Modell Eingabefelder eines Windows, Objektbox zur Darstellung von Relationen
FillObox Modell → Oberfläche Objektmenge als Tabelle in Objektbox
OboxEdit Oberfläche → Modell Objekte in Tabelle editieren

Am Beispiel von drei hypothetischen Klassen wird gezeigt, wie InstantView® die Windowobjekte der Oberfläche an Daten der Modellobjekte bindet: Die Klassen A, B beschreiben eine Person, der beliebig viele (oder auch keine) Adressangaben – Klasse C – zugeordnet werden:


   class A
   {
      . . .
      char *name;
      char *firstName;
      short sex;
   };

   class B : public A
   {
      . . .
      os_Set address;  // 0 ... n addresses
      . . .
   };

   class C
   {
      . . .
      char *city;
      . . .
   }
 

Diese Daten werden in einem Window dargestellt, wobei maximal drei Adressen vorgesehen sind:

Window(win1, 30, 30, 600, 110, "F i l l W i n d o w") { Prompt(p1, 10, 10, T("Name:", "name:", "nom:")) String(A::name, 70, 10, 140) Prompt(p2, 250, 10, T("Vorname:", "first name:", "prénom:")) String(A::firstName, 350, 10, 140) Enum(A::sex, 350, 20, 115, 30) // bis zu drei Adressen werden dargestellt: Prompt(p3, VOLATILE(adr1), 10, 40, T("Adresse 1:", "1st address", "adresse 1")) String(B::address[0].city, VOLATILE(adr1), 129, 40, 200) Prompt(p4, VOLATILE(adr2), 10, 50, T("Adresse 2:", "2nd address", "adresse 2")) String(B::address[1].city, VOLATILE(adr2), 129, 50, 200) Prompt(p5, VOLATILE(adr3), 10, 60, T("Adresse 3:", "2nd address", "adresse 2")) String(B::address[2].city, VOLATILE(adr3), 129, 60, 200) }

Zwischen einem beliebigen Objekt der Klasse B und den Windowobjekten besteht folgende Beziehung:

Variable 'person' enthalte die oben gezeigte Instanz der Klasse B. Mit

        person  FillWindow(win1)
 
erhält man:


Man beachte, dass FillWindow die Ableitung A → B   berücksichtigt. Da die Collection 'address' nur zwei Objekte der Klasse C enthält, wird die Zeile für Adresse 3 ausgeblendet.

Im obengenannten Beispiel wurden Windowobjekte und Datenfelder einander eindeutig zugeordnet. Ist das nicht möglich, bieten Zugriffsfunktionen eine Möglichkeit, kompliziertere Zusammenhänge zwischen Datenfeldern und Windowoberfläche zu realisieren, ohne dass die prinzipielle Trennung zwischen Modellklassen und Visualisierung aufgegeben werden muss.