Ein umfangreiches Beispiel zur Anwendung der LIST-DIALOG-Funktion

Das Beispielprogramm erzeugt einen Dialog, der immer dann aufgerufen wird, wenn in einem Eingabefeld in INVEP die Tastenkombination fk eingegeben wird.
Dieses OBAS-Programm wird normalerweise im Unterverzeichnis makros des Standard-OBAS-Verzeichnisses abgelegt, damit wird es automatisch beim Start von INVEP eingelesen.

#pragma RAW
! zuerst definieren wir einige Direktiven für den Makroprozessor
#pragma fkeymakro =fk das wird unser Makrokürzel
#pragma makroresult = ignore Makro liefert kein Ergebnis
#pragma makromodul =0 Makro ist allgemein verfügbar
#pragma filename = AnfechtungsTags.obas
#pragma comment = Dialog zur Eingabe von Anfechtungstags
! Das folgende Programm zeigt, wie mit Hilfe der Listenfunktionen
! ein eigener Dialog aufgebaut werden kann.
! Zuerst wird eine Liste erzeugt, die das Aussehen und die Funktion des
! Funktionen des Dialogs definiert.
! Danach wird die Listen-Dialog-Funktion aufgerufen.
! Das Ergebnis der Listen-Dialog-Funktion ist eine Liste, die für
! jedes definierte Element einen Rückgabewert entwählt.
! Wir benutzen den Dialog, um mit dem Gesamtergebnis ein XML-Tag
! zu erzeugen, das wir ausgeben.
! Wenn man dieses Programm als INVEP-BASIC-Makro speichert, so
! kann man dadurch menügeführte Makros erzeugen
! Die erste Zeile mit dem Eintrag !RAW weist die Makro-Verarbeitung
! an, dass dieses Programm nicht vorverarbeitet werden soll, also
! keine Verarbeitung der Escape-Zeichen erfolgt.
INIT VARSPACE
DIM D$[2000]; r$[2000]
COM LastAction$[1000]
LastAction$=""
! DialogAction " Test " 10 20
! Wir erstellen den zu erzeugenden Dialog in Form einer Liste.
! Zuerst definieren wir den Dialog an sich. Die Option "Verbose"
! gibt an, dass das Layouting des erzeugten Dialogs in
! Die Protokolldatei geschrieben wird. Die Option timeout gibt an,
! dass der Dialog nach 60 Sekunden ohne Tastendruck beendet, d.h.

! abgebrochen wird.
d$ ="{ DialogName -> \" Anfechtungs - Tags \"; Timeout -> 60000;"
d$=d$ &" Verbose ; XOffset -> 5; "
! Jetzt erstellen wir die einzelnen Widgets. Aus Lesbarkeitsgründen
! ein Widget pro Zeile Jedes Widget wird als eigenständige Liste
! Liste erzeugt. Die Variablen, die den Feldbezeichnern zugeordnet
! werden, müssen nur dann in Anführungszeichen gesetzt werden, wenn
! wenn Sonderzeichen enthalten sind.
! zuerst zwei Datumseingabefelder ( Type DATE )
d$=d$&"{ Typ -> DATE ; Label -> Datum ;"
d$=d$&" QHELP -> \" Datum der Rechnung \" }; "
d$=d$&"{ Typ -> DATE ; Label -> \"Fälligkeit \" }; "
! jetzt ein mittellanges Eingabefeld für Gleitkommazahlen
d$=d$&"{ Typ -> DOUBLE_M ; Label -> Betrag ; "
d$=d$&" QHELP -> \"Höhe der Rechnung \" }; "
! jetzt ein mittellanges Feld für die Eingabe von Text
d$=d$&"{ Typ -> TEXT_M ; Label -> Rechnungsgrund }; "
! damit der Dialog etwas übersichtlicher wird, machen wir in der nächsten
! Zeile weiter. Dafür gibt es das Pseudowidget "NEWLINE"
d$=d$&"{ Typ -> NEWLINE }; "
! Es folgt die Definition eines Check-Box-Widgets (ein/aus)
d$=d$&"{ Typ -> TBUTTON_S ; Label -> Titel ;"
d$=d$&" QHELP -> \" Ist die Forderung tituliert ?\" }; "
! jetzt kommt wieder ein Text-Eingabefeld
d$=d$&"{ Typ -> TEXT_M ; Label -> Titel ;"
d$=d$ &" QHELP -> \"z.B. VB vom 02.05.2013\" }; "
! Eine Selection-Box wäre auch möglich , brauchen wir hier nicht,
! bleibt daher auskommentiert
! d$=d$ &"{ Typ -> CBUTTON_S ; Label -> Auswahl ;"
d$=d$&" Widgets -> { \" Ja \" ; \" Nein \" ; \" Weiß nicht \" }; "
! jetzt definieren wir noch zwei Buttons für Ende und Abbruch
d$=d$&"{ Typ -> BUTTON_S ; Action -> DialogAction ;"
d$=d$&" Label -> Check }; "
d$=d$&"{ Typ -> BUTTON_S ; Action -> EXIT };"
d$=d$&"{ Typ -> BUTTON_S ; Action -> ABORT } }"
! Falls in der Eingabe eine Rechnung durchgeführt wird, so würde das
! Ergebnis hier ausgegeben werden.
! Diese Ausgabe schalten wir mit DISCARD OUTPUT aus
DISCARD OUTPUT ON
r$=LIST DIALOG$(d$)
DISCARD OUTPUT OFF
DROP PENDING OUTPUT
! Unser Ergebnis wird in Form einer Liste geliefert, deren Elemente
! in der gleichen Reihenfolge wie die Widgets vorliegen. Wenn wird als
! Ergebnis keine Liste bekommen haben, wurde die Eingabe abgebrochen.
! Daher schauen wir erstmal, ob überhaupt eine Liste vorliegt
IF LIST TEST(r$) THEN
  ! Hurra, der Anwender hat etwas eingegeben. Der Code-Lesbarkeit halber
  ! weisen wir die Listenelemente selbsterklärenden Variablen zu
  datum$=LIST GET$(r$ ;1)
  faellig$=LIST GET$(r$ ;2)
  betrag$=LIST GET$(r$ ;3)
  grund$=LIST GET$(r$ ;4)
  ! Ob ein Titel vorliegt, ist eine Ja/Nein-Thematik, das Liestenergebnis
  ! liegt jedoch in Form einer Zeichenkette vor, also nehmen wird eine
  ! numerische Umwandlung vor
  isttitel=IVAL( LIST GET$(r$ ;5))
  titeltext$=LIST GET$(r$ ;6)
  ! jetzt haben wir alles zusammengesammelt und können Stück für Stück
  ! das Tag bauen
  DISP "< Rechnung "
  ! Die einzelnen Elemente schreiben wir nur, wenn die Ergebnis-
  ! zeichenketten nicht leer sind, wenn also eine Eingabe erfolgte
  IF SLEN(datum$) THEN DISP ", DATUM =" datum$
  IF SLEN(faellig$) THEN DISP ", Faellig =" faellig$
  IF SLEN(betrag$) THEN DISP ", Betrag =" betrag$
  IF isttitel THEN DISP ", IstTitel "
  IF SLEN(titeltext$) THEN DISP ", TitelText =\"" titeltext$ "\""
  ! hiermit beenden wir den ersten Teil des Tags
  DISP ">"
  ! Ist der Grund der Forderung angegeben worden, wenn ja, dann
  ! geben wir ihn aus
  IF SLEN(grund$) THEN DISP "\"" grund$ "\""
  ! jetzt beenden wir unser Tag
  DISP "</ Rechnung >"
  DISP "\n"
END IF
DISP LastAction$ "\n"
STOP PROG



Schatten