[Allegro] Trick 51: Sitzungsdaten vorbesetzen

Bernhard Eversberg ev at biblio.tu-bs.de
Mo Aug 6 08:29:31 CEST 2007


Trick 51 (= 3*17): Gesetzt den Fall ...
                    Sitzungsdaten vorbesetzen

Aufgabe: Für eine Sitzung bestimmte Werte voreinstellen, die jederzeit
          während der Sitzung in jedem FLEX bereitstehen, um Unterschei-
          dungen aller Art treffen zu können. Also z.B. so etwas wie
          "Gesetzt den Fall, vorher in dieser Sitzung wäre ...
          noch nicht erfolgt, dann soll jetzt ... passieren".

Warum: Bei den recht umfangreichen Funktionssystemen, die man sich
        mit FLEX basteln kann, ist es oft erwünscht, je nach Situation
        unterschiedlich reagieren zu können. Dann braucht man
        a) sog. Flags, die eine Ja/Nein-Entscheidung ermöglichen
         oder auch
        b) Zustandsvariablen, die etwas über die Situation aussagen

Lösungen:
Boolesche Variablen, die NUR Ja/Nein (oder 0/1) besagen können, gibt
es im System nicht. Man braucht sie aber auch gar nicht. Es reicht,
feststellen zu können, ob eine Variable belegt ist oder nicht, und das
geht ganz simpel mit dem if-Befehl:
if <variablenname> <befehl>
führt den Befehl aus, wenn die Variable existiert (etwas enthält).
Jede beliebige Variable taugt damit zugleich als Flag - das ist
der Trick!

Weil wir aber schon dabei sind, ein paar Bemerkungen über Setzungen und
ihre Auswertung.
Jede Variable und jedes Datenfeld im allegro-System kann eine variabel
lange Zeichenfolge enthalten - nichts anderes. Wahlweise kann sie damit
als Text, als Zahl oder eben als Flag interpretiert und genutzt werden.
Wenn sie leer ist, dann gibt es sie gar nicht. Anders gesagt: Das
Belegen mit der leeren Zeichenfolge ist gleichbedeutend mit Löschen.
[In richtigen Programmiersprachen kann man Variablen, sind sie einmal
deklariert, innerhalb des Gültigkeitsbereichs nicht mehr loswerden.]

Und wie/wann kann man Variablen vorbesetzen? Man kann

1. Schon im  _start.flx  geeignete Variablen besetzen und sie
    dann bei Bedarf heranziehen,

2. Oder/und in einem eigenen Initialisierungs-FLEX beliebig
    viele Einstellungen für Spezialanwendungen vornehmen.
    Beispiele sind o-init.flx und a-init.flx für Erwerbung / Ausleihe.

Nebenbei: Es gibt einige Systemvariablen, die man als Flags ansehen
und mit  if ...  für Entscheidungen nutzen kann (siehe xif.rtf), z.B.
if v14 ..., if tbl ..., if main ...
Diese kann man logischerweise nicht selber setzen oder löschen.

Welche Variablen soll man nehmen?
Grundsätzlich gehen zwar die #u-Variablen mit kleinen Buchstaben,
aber besser sind die relativ neuen $-Variablen (mit großem Anfangs-
buchstaben!), denn diese können längere Namen haben, bei denen dann
weniger leicht eine Kollision mit einer schon vorhandenen Variablen
passieren kann. (Warum große Anfangsbuchstaben? Weil nur diese
Variablen während der ganzen Sitzung erhalten bleiben, die kleinen
dagegen nur während der Laufzeit des FLEXes.)
UND: Die $-Variablen können zur nächsten Sitzung aufbewahrt werden!
(siehe xfreevar.rtf: Befehl  $1>dateiname)

$-Variablen sind, genau wie die #u-Variablen, leicht zu belegen und
für Prüfungen zu nutzen.

Das BELEGEN geht so:

$Abcde 1

belegt die Variable $Abcde mit dem Wert 1.
(Es darf auch jeder andere sein - belegt ist belegt.)

Das PRÜFEN geht so:

a) Variable als Flag nutzen
    Möglich ist, bisher undokumentiert, der Befehl

if $Vwxyz <befehl>

    Der <befehl> wird nur ausgeführt, wenn $Vwxyz belegt ist (egal, mit
    was!) Also genauso wie es mit #u-Variablen geht und auch mit
    Datenfeldern!

b) Variable als Zustandsvariable nutzen
    In dem Fall ist nicht die Existenz, sondern der Inhalt zu prüfen.
    Ein Sprungverteiler kann auf beliebig viele Inhalte reagieren:

var $Vwxyz
if "1" jump label1
if "pqr" jump label2
if ...


Aber manchmal kommt's drauf an, welcher Nutzer davorsitzt!
Bei Mehrplatzsystemen sollen oftmals die einzelnen Nutzer
unterschiedliche Möglichkeiten oder Berechtigungen haben. Dazu setzt
man sinnvollerweise beim Start des Programms oder des Subsystems
(z.B. Erwerbung) geeignete Variablen, die man danach in allen
Situationen nutzen kann, wo man Unterscheidungen treffen muß.
Die einfachste Möglichkeit, so etwas einzurichten, sieht so aus:

1. Für jeden Nutzer eine FLEX-Datei anlegen, und zwar im Datenordner,
    wobei der Dateiname schlicht die Nutzerkennung ist
    (Systemvariable #op, in der INI-Datei mit  Operator=...  zu setzen)
    Dann hätte man z.B. die Datei  schm.flx  für den Operator Schmitz.

2. In die Datei  schm.flx  schreibt man die Setzungen hinein, die
    für Herrn Schmitz gelten sollen:
    $Abc 3
    $Acd xyz
    ...

3. In den _start.flx oder in einen Initialisierungs-FLEX schreibt
    man an das Ende diese Sequenz:
    var "X " #op
    exec

Alternative: Man macht nur eine Datei namens z.B.  flags.flx, in der
dann die Setzungen für alle Teilnehmer stehen, wobei man mit einem
Sprungverteiler
   var #op
   if "schm" jump schmitz
   if "meier" jump meier
   if ...
unterschiedliche Abschnitte einrichten kann.
Dann ist es auch möglich, im _start.flx bzw. Init-FLEX zu schreiben:

include flags.flx

und darauf folgend weitere Befehle.
(Ein *bedingtes* "include" geht nicht - also in Abhängigkeit vom #op
eine andere Datei zu inkludieren. Das liegt daran, daß "include"
kein richtiger FLEX-Befehl ist - siehe xinclude.rtf).

Und wie löscht man Variablen? Entweder so:

var ""
ins $Abcde
ins $Xyz

oder so:  (anders als bei den #u-Variablen, wo das = zuviel wäre)

$Abcde=
$Xyz=


Feste (unveränderliche) Setzungen
---------------------------------
Trick 17 zeigte, wie man Setzungen aus der INI-Datei entnehmen kann.
Das klappt zwar einwandfrei, wirkt aber eher betulich, wenn man die
hier dargestellten Möglichkeiten betrachtet. WENN man die Werte in der
INI-Datei des Nutzers unterbringen will, kann man aber Trick 17
einsetzen, um in _start.flx bzw. im Initialisierungs-FLEX die
Werte einzulesen und in geeignete Variable zu setzen.
JEDOCH: Wenn eine Setzung während der Sitzung UNveränderlich sein
soll, bleibt kaum eine Wahl, als den Wert in eine Datei zu schreiben
und ihn dann bei Bedarf mit Trick 17 dort herauszuholen...
Das braucht aber nicht die INI-Datei zu sein - das wäre ein weiterer
Trick - es kann eine sein, deren Name gleich dem des Operators ist.
Hier schnell nochmal eben, wie das aussehen muß, um den Wert
modusx aus abc.txt rauszuholen und einen Sprung zu machen, wenn da
der Wert 1 steht:

var Fabc.txt
var (b"~modusx=" e"^M" e" ")
if "1" jump ...





Mehr Informationen über die Mailingliste Allegro