MAL-Homepage Inhaltsverzeichnis



MAL Dokumentation: Menüs und Masken




Inhalt:

1. MASKEN
1.1. Vorbesetzungen
1.2. Bedienung von Masken
1.3. Überprüfung von Eingabedaten
2. MENÜS
3. BLÄTTERFUNKTIONEN
3.1. Spezielle Blätterfunktionen
3.2. Tabellen


1. MASKEN

Beschreibungsdatensätze für Bildschirmmasken sind Verbunde von Strings, die sich als Zeilen der Maske verstehen. Die Ein-/Ausgabefelder der Masken (aktive Felder) sind durch eine ununterbrochene Folge von ´_´ (Textfelder), ´#´ (Zahlenfelder) oder ´!´ (Textfelder ohne Echo) gekennzeichnet. Jedem aktiven Feld ist in der gleichen Zeile ein Feldname voranzustellen. Dieser muß vorne und hinten jeweils durch mindestens ein Blank von anderen Texten getrennt sein.

Zur Bearbeitung dieser Datensätze, also zum Aufrufen der Masken, können die Worte

verwendet werden.

Beispiel:

[
" PERSONENMASKE"
""
" Vorname _____________ Familienname ____________"
""
" Alter ###### Passwort !!!!!!!!"
] >> maske


maske writemask >> eingabedaten

eingabedaten .

[
Vorname=Franz
Familienname=Müller
Alter=34
Passwort=abc ]

MAL-Homepage Inhaltsverzeichnis


1.1. Vorbesetzungen

Existiert zu einem Ein/Ausgabefeld ein gleichnamiges Wort im MAL-Vokabular, so wird dieses zur Vorbesetzung verwendet.

Als Vorbesetzungen werden für Textfelder Strings und Realzahlen, für Nummernfelder nur Realzahlen akzeptiert. Es können auch Verbunde der jeweiligen Datentypen verwendet werden. Dann wird jeweils mit der ersten Komponente vorbesetzt und bei der Eingabe kann in dem entsprechenden Feld mit Ctrl-N und Ctrl-R geblättert werden (bei einer graphischen Benutzeroberfläche erscheint eine Scroll-Box).

Beispiel:

[
" PERSONENMASKE"
""
" Vorname _____________ Familienname ____________"
""
" Alter ###### Passwort !!!!!!"
] >> maske


10 >> Alter
[ "Müller" "Meier" "Huber" ] >> Familienname
maske writemask >> eingabedaten

Das Wort
modimask arbeitet wie writemask, allerdings scheinen im Ergebnisdatensatz nur jene Werte auf, deren Vorbesetzung verändert wurden.

MAL-Homepage Inhaltsverzeichnis


1.2. Bedienung von Masken

Bei MAL-Systemen, für die keine graphische Benutzeroberfläche implementiert ist (DOS, Linux) gilt folgendes:

Abgesehen von den normalen alphanumerischen Tasten können noch folgende Tasten für die Eingabe verwendet werden:

MAL-Homepage Inhaltsverzeichnis


1.3. Überprüfung von Eingabedaten

Sollen die in ein Feld eingegebenen Daten unmittelbar bei der Eingabe überprüft werden, so ist eine Doppelpunktdefinition mit folgender Syntax zu definieren:

eingegebene_daten -> flag

´flag´ = 0 bedeutet: Daten nicht akzeptabel.
´flag´ = 1 bedeutet: Daten sind aktzeptabel.


Der Name der Doppelpunktdefinition muß gleich dem Feldnamen, erweitert um die Zeichenfolge "_c" sein.

Beispiel:

: monatstag_c >> tag
tag 1 >=
tag 31 <= and ;


: wochentag_c [ "mo" "di" "mi" "do" "fr" "sa" "so" ] find count ;

[ "monatstag ##### wochentag __" ] writemask

MAL-Homepage Inhaltsverzeichnis


2. MENÜS

Das Wort
amenue dient zum Aufbau von Menüs.

Syntax:

[ kopfzeile escape_code
text1 code1
text2 code2
.
. 
] ->
´textI´ ist ein String, der in der I-ten Zeile des Menüs ausgegeben wird. Die Auswahl der Menüpunktes kann auch durch Eingabe des ersten Buchstabens von ´textI´ erfolgen. Daher sollte man darauf achten, daß die Texte unterschiedliche Anfangsbuchstaben haben, was man notfalls durch Voranstellen von Kennbuchstaben oder Ziffern erreichen kann.

Der String ´kopfzeile´ wird in den Kopf der Maske eingeblendet und darf auch ein Leerstring sein. Die Strings ´code1´, ´code2´ usw. werden vom MAL-Interpreter ausgeführt, wenn der entsprechende Menüpunkt aufgerufen wird und ´escape_code´ wird ausgeführt, wenn die Esc-Taste gedrückt wird. Alle Codes müssen folgender Syntax entsprechen:

-> folgemenü

wobei ´folgemenü´ ein Datensatz wie oben angeführt, oder ein Leerverbund sein kann. Auf diese Weise können auch kompliziert geschachtelte Menüstrukturen aufgebaut werden, ohne daß das Wort ´amenue´ rekursiv aufgerufen werden muß. Als Ausgang aus dieser Menüschleife gilt ein Leerverbund anstelle einer Menübeschreibung.

Beispiel:

[ "Minimenü" "[ ]"
"1 .. Liste aller Worte" "vlist menübeschreibung"
"2 .. Menü verlassen" "[ ]"
"3 .. MAL beenden" "[ ] bye"
] >> menübeschreibung


menübeschreibung amenue

MAL-Homepage Inhaltsverzeichnis


3. BLÄTTERFUNKTIONEN

Zur interaktiven Verwaltung von Verbunden mit gleichartigen Komponenten ist das Wort
browse geeignet.

Syntax:

men liste formatzeile zeilenaufbau ->

browse baut eine Bildschirmseite auf, bei der für jede Komponente des Verbundes ´liste´ eine Zeile ausgegeben wird. Zum Blättern können die gleichen Tasten wie beim MAL-Editor verwendet werden (gilt nur eingeschränkt für graphische Benutzeroberflächen).

Am Bildschirmrand wird ein Menü eingeblendet (beschrieben durch den Datensatz men ). Am oberen Bildschirmrand befindet sich eine Kopfzeile (definiert durch den Datensatz ´formatzeile´).

Die Datensätze von 'liste' müssen nicht alle gleich sein, wichtig ist nur, daß mit der Prozedur zeilenaufbau aus allen eine gleichartige Zeile gewonnen werden kann, und daß die Prozeduren des Menüs mit den Komponenten arbeiten können. Die Doppelpunktdefinition zeilenaufbau wird beim Aufbau der Bildschirmseite jeweils zur Berechnung einer Zeile herangezogen. Sie muß folgender Syntax genügen:

komponente_aus_liste -> [ spalte1 spalte2 ... ]

wobei ´spalteI´ ein String ist, der in der I-ten Spalte ausgegeben wird.

Die Spalteneinteilung erfolgt aufgrund des Strings 'formatzeile'. Jeweils zusammenhängende Zeichenfolgen ohne Blank signalisieren eine Spalte. Sinnvoller Weise verwendet man als Zeichenfolge gleich eine Überschrift für die jeweilige Spalte.

Einfaches Beispiel ohne Menü:

[
[ "Hugo" 17 ]
[ "Willi" 25 ]
[ "Anna" 34 ]
[ "Hans" 20 ]
] >> liste


"Vorname_____ Alter" >> formatzeile


: zeilenaufbau >> eintrag
[ eintrag 1 , eintrag 2 , >string ] ;


[ ] liste formatzeile cool zeilenaufbau browse

Die Menübeschreibung ist ein Verbund mit folgendem Aufbau:

[ text1 code1 text2 code2 . . ]

Im Gegensatz zu den Menübeschreibungen von amenue müssen die Codes hier kein Folgemenü am Stack übergeben (ergäbe in diesem Fall keinen Sinn). Sie erhalten bei Ausführung jeweils den Verbund ´liste´ und jene Komponente, auf die gerade der Cursor zeigt, übergeben. Als Ergebnis müssen sie den (unter Umständen) veränderten Verbund ´liste´ übergeben. Sie müssen also folgender Syntax entsprechen:

liste komponente -> neuliste

Beispiel:

: schreiben drop (Komponente wird nicht benötigt)
[ "Vorname _________ Alter #####" ] writemask
append ( an ´liste´ anfügen) ;


: lesen >voc
[ "Vorname ________ Alter #####" ] readmask ;


: loeschen >> komponente >> liste
komponente liste find 1 , index
liste index remove ;


[ "Schreiben" "schreiben"
"Anzeigen" "lesen"
"Löschen" "loeschen" ] >> menü


menü liste formatzeile cool zeilenaufbau browse

MAL-Homepage Inhaltsverzeichnis


3.1. Spezielle Blätterfunktionen

Das Wort
FO_browse ist speziell für das Blättern in Foldern ausgelegt (siehe Kapitel Folder).

Das Wort browse_voc kann zum Blättern in Vokabularsfoldern, also Foldern mit MAL-Worten, verwendet werden. Das Wort benötigt keine Versorgung über den Stack. Man muß nur zuvor den entsprechenden Folder mit >voc in das Vokabular laden.

Beispiel:

public \ folderdir \ startup_folder >voc
browse_voc


Das Wort common_browser ist für den häufig auftretenden Standardfall, nämlich das Blättern in reinen Text/Zahlen-Tabellen ausgelegt. Die Tabellen können entweder im Speicher oder auf Platte (in einem Pool) gespeichert sein.

Die Besonderheit bei common_browser ist, dass einige Menüpunkte und Hilfsfunktionen intern (als lokale Worte) vordefiniert sind. Für rein speicherresidente Tabellen empfiehlt sich aber die Klasse table_class (siehe unten), weil die Versorgung von common_browser aufwändig ist.

Folgende Worte sind in common_browser lokal definiert:

modify_object
Das Wort modify_object hat folgende Syntax:

alter_eintrag neuer_eintrag ->

Wenn man einen eigenen Menüpunkt entwickelt, der den ausgewählten Tabelleneintrag verändern soll, so muss dieser die alte und neue Version des Eintrags am Stack legen und modify_object aufrufen.

Beispiel (Menüpunkt zum Umrechnen von Schilling auf Euro):

: schilling>euro >> alter_eintrag
alter_eintrag \ Betrag 13.7603 * >> neuer_betrag
alter_eintrag neuer_betrag "Betrag" replace >> neuer_eintrag
alter_eintrag neuer_eintrag modify_object ;

update_relation
Das Wort update_relation wird in Menüpunkten benötigt, wenn Eintrage gelöscht oder hinzugefügt werden. Es erwartet nur die neue Relation (= die Tabellendaten) am Stack. Es erkennt selbst, ob die Relation im Hauptspeicher oder auf Platte gespeichert ist.

MAL-Homepage Inhaltsverzeichnis


3.2. Tabellen

Die Klasse
table_class bindet das Wort common_browser (siehe oben) in eine menügesteuerte Bedienoberfläche ein.

Die Instanzen der Klasse table_class beinhalten nebst den Tabellendaten eine Beschreibungsliste aller Attribute (=Tabellenspalten), eine Eingabemaske und eine Menübeschreibung.

Mit der Funktion create_table wird eine leere, unkonfigurierte Tabelle mit einem Standardmenü erzeugt. Diese kann mit den Funktionen admin und edit_menu interaktiv konfiguriert werden. Mit der Funktion browse können anschließend Einträge eingetragen, modifiziert usw. werden.

Beispiel:

Einrichten einer Tabelle:

interface_of table_class >voc
create_table >> tabelle
Konfigurieren der Attribute und Menüpunkte:
tabelle admin edit_menu -> tabelle
Blättern in der konfigurierten Tabellen:
tabelle browse -> tabelle
Beim Aufruf der Funktion admin erscheint zunächst eine Liste der bereits eingerichteten Attribute (bei einer neuen Tabelle ist diese leer). Wird mit Insert ein neues Attribut eingerichtet, so erscheint folgende Eingabemaske

Die Werte dieser Maske verstehen sich wie folgt:

typ
Im Feld 'typ' können folgende Typen von Attributen ausgewählt werden:

Definition eigener Menüpunkte:
Jeder Menüpunkt ist ein MAL-Wort, das mit zwei Stackeinträgen versorgt wird:

relation eintrag -> relation

Die meisten Menüpunkte müssen die Relation nicht verändern, desshalb können sie auch folgender Syntax genügen:

eintrag ->

Beispiel:

Wenn man ein Attribut 'Zufallszahlen' vom Typ * mit dem Preset-Code 1000 random eingerichtet hat, so könnte man eine Menüpunkt Histogramm folgendermaßen definieren:
: histogramm >> eintrag
eintrag \ Zufallszahlen ahisto screen ;
Im Menü (editiern des Menüs siehe oben) müsste dann folgende Zeile stehen, um den Menüpunkt aufrufbar zu machen:
[
.
.
"Histogramm" "histogramm"
.
.
]

MAL-Homepage Inhaltsverzeichnis