1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
|
PACKET systembauminterpreterDEFINES startebaisy,starteschulis,starteanwendung
,startbaisy:LET esctaste="�",#crtaste="
",#obentaste="�",untentaste="
",
rechtstaste="�",hoptaste="�",ausrufezeichen="!",#leertaste=" ",#stufentrenner
=".",berechttrenner="/",codefuerziffernull=48,codefuerzifferneun=57,
titelfeldnr=2,felderanzahlbishistoriebeginn=2,historiebeginn=3,maxhknoten=4,
felderanzahlbismenuebeginn=6,historieende=6,menuebeginn=7,maxmenuepunkte=20,
felderpromenuepunkt=1,felderimanwahlmenue=18,fcursor=">",fcursorweg=" ",
laengedescursors=2,offenermenuepunkt="noch nicht realisiert",menuemaskenname=
"mb anwahlmenue",wartezeit=30,wegtext=" Ihr Weg durch das Menü:",stern="*",
strich="-",if="Systemfehler ",zeile=" Zeile: ",fortsetzung=
"Weiterarbeiten ist möglich. Fehlermeldung wird gedruckt!",POINTER =STRUCT (
INT xpointer,ypointer);KNOTEN VAR k;ROW maxmenuepunkteKNOTEN VAR ktab;ROW
maxmenuepunkteBOOL VAR menuepunktanwaehlbar;ROW maxmenuepunktePOINTER VAR
pointer;TEXT VAR benutzerberechtigung:="";INT VAR aktfeldnr:=menuebeginn;
TEXT VAR vpname,npname;BOOL VAR menuemaske:=FALSE ,cursorbewegungmithop:=
FALSE ;LET zeilenzahlbildschirm=24,spaltenzahlbildschirm=79,
rahmenzusatzzeilen=4,spaltendesmenuerands=10,maxmenuetextlaenge=60,
tastenlaenge=4,zeichenblankstern=" *";TEXT VAR ueberschrift:="";INT VAR x1:=1
,y1:=1,aktuellezeile,spaltendesmenuerahmens,zeilenzahldesfktmenues,
anzblankstern,textlaenge,cursorx,cursory;KNOTEN VAR
knotenfuerbildschirmausdruck,knotenfuerauskunftserteilung;LET
knotennamefuerbildschirmausdruck="hardcopy",knotennamefuerauskunftserteilung=
"auskunft",tastefuerbildschirmausdruck="o",tastefuerauskunftserteilung="?";
PROC vpausfuehren(PROC (INT CONST ,BOOL CONST ,TEXT CONST )call):INT VAR
prozedurindex;prozedurindex:=knotenaufrufindex(k);enablestop;call(
prozedurindex,TRUE ,vpname)END PROC vpausfuehren;PROC npausfuehren(PROC (INT
CONST ,BOOL CONST ,TEXT CONST )call):INT VAR prozedurindex;prozedurindex:=
knotenaufrufindex(k);enablestop;call(prozedurindex,FALSE ,npname)END PROC
npausfuehren;BOOL PROC vpvorhanden:NOT ((vpname)="")END PROC vpvorhanden;
BOOL PROC npvorhanden:NOT ((npname)="")END PROC npvorhanden;PROC
bereitemenuemaskenausgabevor:page;loeschetastendruckEND PROC
bereitemenuemaskenausgabevor;PROC tasteholen:TEXT VAR zwischentaste;inchar(
zwischentaste);setzetastendruck(zwischentaste)END PROC tasteholen;PROC
gedaechtnisloeschen:TEXT VAR t:=" ";WHILE t<>""REP t:=incharetyPER END PROC
gedaechtnisloeschen;PROC setzeschalterfuermenueausgabenachfunktionstaste:IF (
tastendruck=ausrufezeichen)OR (tastendruck="")THEN
setzeschalterfuermenueausgabe(TRUE )ELSE setzeschalterfuermenueausgabe(FALSE
)FI .END PROC setzeschalterfuermenueausgabenachfunktionstaste;BOOL PROC
anderermenuepunkt:IF nachobenoderuntenTHEN cursorbewegungmithop:=FALSE ;TRUE
ELIF tastendruck=hoptasteTHEN tasteholen;IF nachobenoderuntenTHEN
cursorbewegungmithop:=TRUE ;TRUE ELIF tastendruck=hoptasteTHEN
cursorbewegungmithop:=TRUE ;setzetastendruck(obentaste);TRUE ELSE FALSE FI
ELSE FALSE FI .nachobenoderunten:(tastendruck=obentaste)OR (tastendruck=
untentaste).END PROC anderermenuepunkt;BOOL PROC
knotenwechselbeiprozedurausfuehrung:NOT (k=vergleichsknoten)END PROC
knotenwechselbeiprozedurausfuehrung;PROC menuetextzusammensetzen(INT CONST
mpkt,TEXT CONST stufennum,TEXT VAR menuetext):TEXT VAR kts,ktx;BOOL VAR
berechtigt:=FALSE ;IF ktab(mpkt)=nilknotenTHEN ktx:=offenermenuepunkt;
behandlemenuepunkt(menuetext,mpkt,kts,ktx,FALSE )ELSE ktx:=text(ktab(mpkt));
berechtigungspruefung(stufennum,mpkt,berechtigt);behandlemenuepunkt(menuetext
,mpkt,kts,ktx,berechtigt)FI .END PROC menuetextzusammensetzen;PROC
behandlemenuepunkt(TEXT VAR menuetextaufber,INT CONST menuepunkt,TEXT CONST
ktaste,ktext,BOOL CONST berechtigt):IF berechtigtTHEN menuetextaufber:=""+
text(menuepunktMOD 10,1)+" "+ktextELSE menuetextaufber:=" "+ktextFI ;
setzemenuepunktzugang(menuepunkt+maxhknoten,berechtigt).END PROC
behandlemenuepunkt;PROC setzemenuepunktzugang(INT CONST feldnr,BOOL CONST
wahrwert):menuepunktanwaehlbar(feldnr):=wahrwertEND PROC
setzemenuepunktzugang;BOOL PROC zugangerlaubt(INT CONST feldnr):
menuepunktanwaehlbar(feldnr)END PROC zugangerlaubt;PROC fehlerbehandeln:
cursor(1,23);TEXT VAR fehlerzeile:=if+errormessage+zeile+text(errorline);put(
""+fehlerzeile+"�");line;put(fortsetzung+"�");clearerror;#FILE VAR f:=
sequentialfile(output,if);line(f);putline(f,date+" "+timeofday);line(f);
putline(f,text(vergleichsknoten));line(f);putline(f,fehlerzeile);print(if);
forget(if,quiet)#END PROC fehlerbehandeln;PROC zeige(TEXT VAR te,INT CONST
start1,start2,schluss):INT VAR zeile2:=start1+1;cursor(1,start1);out(te);INT
CONST ende:=length(te),anfang:=pos(te,stern);INT CONST stellen:=ende-anfang+2
;historiemalen;trennungslinie;restmalen.historiemalen:cursor(anfang,zeile2);
out(stern);out(wegtext);cursor(ende,zeile2);out(stern);INT VAR i;FOR iFROM
zeile2+1UPTO start2-2REP zeilerausPER .trennungslinie:cursor(anfang,start2-1)
;out(stern);(stellen-3)TIMESOUT strich;out(stern).restmalen:FOR iFROM start2
UPTO schluss-1REP zeilerausPER ;cursor(1,schluss);out(te).zeileraus:cursor(
anfang,i);out(stern);cursor(ende,i);out(stern).END PROC zeige;PROC
getposition(INT VAR x,y,INT CONST feldnr):POINTER CONST p:=pointer(feldnr);x
:=p.xpointer;y:=p.ypointer;END PROC getposition;PROC putposition(TAG VAR t,
INT CONST feldnr):POINTER VAR p;INT VAR x,y;getcursor(x,y);p.xpointer:=x-
length(t,feldnr)-laengedescursors;p.ypointer:=y;pointer(feldnr):=pEND PROC
putposition;PROC ermittlegrenzwertedesmenuerahmens(INT CONST sohnanz,BOOL
CONST nichtvorhandenetaste):INT CONST mindestlaengewegenfehlermeldung:=31;
ueberschrift:=text(k);spaltendesmenuerahmens:=maxtextlaenge+
spaltendesmenuerands;IF geradespaltenanzahlTHEN spaltendesmenuerahmensINCR 1;
textlaengeINCR 1FI ;bestimmezeilenzahldesfktmenues;legeeckpunktefest.
geradespaltenanzahl:(spaltendesmenuerahmensMOD 2)=0.maxtextlaenge:INT VAR
menuepkt;IF nichtvorhandenetasteTHEN textlaenge:=
mindestlaengewegenfehlermeldungELSE textlaenge:=0FI ;textlaenge:=max(
textlaenge,length(ueberschrift));FOR menuepktFROM 1UPTO sohnanzREP textlaenge
:=max(textlaenge,length(text(ktab(menuepkt))))PER ;textlaenge:=min(textlaenge
,maxmenuetextlaenge);textlaenge.bestimmezeilenzahldesfktmenues:IF
nichtvorhandenetasteTHEN zeilenzahldesfktmenues:=sohnanz+rahmenzusatzzeilen+1
ELSE zeilenzahldesfktmenues:=sohnanz+rahmenzusatzzeilenFI .legeeckpunktefest:
bestimmepositionfuerfktmenueauscursorpos(x1,y1);
veraenderex1fallshaelftedesbsnichtausreicht;
veraenderey1fallshaelftedesbsnichtausreicht;aktuellezeile:=y1;anzblankstern:=
spaltendesmenuerahmensDIV 2.veraenderex1fallshaelftedesbsnichtausreicht:IF (
x1+spaltendesmenuerahmens)>spaltenzahlbildschirmTHEN x1:=
spaltenzahlbildschirm-spaltendesmenuerahmensFI .
veraenderey1fallshaelftedesbsnichtausreicht:IF (y1+zeilenzahldesfktmenues)>
zeilenzahlbildschirmTHEN y1:=zeilenzahlbildschirm-zeilenzahldesfktmenuesFI .
END PROC ermittlegrenzwertedesmenuerahmens;PROC
bestimmepositionfuerfktmenueauscursorpos(INT VAR xwert,ywert):
bestimmecursorposition;bestimmeeckpunktlinksoben.bestimmecursorposition:
getcursor(cursorx,cursory).bestimmeeckpunktlinksoben:IF vierterquadrantTHEN
xwert:=1;ywert:=1;ELIF dritterquadrantTHEN xwert:=40;ywert:=1;ELIF
zweiterquadrantTHEN xwert:=1;ywert:=13;ELIF ersterquadrantTHEN xwert:=40;
ywert:=13;FI .ersterquadrant:(cursorx<40)CAND (cursory<13).zweiterquadrant:(
cursorx>39)CAND (cursory<13).dritterquadrant:(cursorx<40)CAND (cursory>12).
vierterquadrant:(cursorx>39)CAND (cursory>12).END PROC
bestimmepositionfuerfktmenueauscursorpos;PROC
zeigefunktionenmenueaufdembildschirm(INT CONST sohnanz,BOOL VAR
nichtvorhandenetaste):TEXT CONST meldungungueltigefkttaste:=
"Diese Funktion gibt es nicht. ";zeigemenuekopfzeile;zeigeueberschriftzeile
;zeigemenueteil;zeigemenueabschlusszeile.zeigemenuekopfzeile:
setzecursoraufausgabeanfangsposition;zeichnesternzeile.
setzecursoraufausgabeanfangsposition:cursor(x1,aktuellezeile).
zeichnesternzeile:put("*"+(anzblankstern*zeichenblankstern)).
zeigeueberschriftzeile:setzecursoraufnaechstenzeilenanfang;put("* "+
zentrierteueberschrift+" *").zentrierteueberschrift:TEXT VAR zwtext:=
zentriert(ueberschrift,textlaenge+tastenlaenge);IF length(zwtext)<(textlaenge
+tastenlaenge)THEN zwtextCAT " "FI ;zwtext.zeigemenueabschlusszeile:
setzecursoraufnaechstenzeilenanfang;IF nichtvorhandenetasteTHEN
gebehinweisaufungueltigefkttaste;setzeschalterzurueck;
setzecursoraufnaechstenzeilenanfangFI ;zeichnesternzeile.
gebehinweisaufungueltigefkttaste:put("* "+eingepasstemeldung+" *").
eingepasstemeldung:zwtext:=zentriert(meldungungueltigefkttaste,textlaenge+
tastenlaenge);IF length(zwtext)<(textlaenge+tastenlaenge)THEN zwtextCAT " "
FI ;zwtext.setzeschalterzurueck:nichtvorhandenetaste:=FALSE .
setzecursoraufnaechstenzeilenanfang:aktuellezeileINCR 1;cursor(x1,
aktuellezeile).zeigemenueteil:zeigeleerzeile;zeigemenuezeilen;zeigeleerzeile.
zeigeleerzeile:setzecursoraufnaechstenzeilenanfang;leerzeile.leerzeile:put(
"*"+((spaltendesmenuerahmens-2)*" ")+"*").zeigemenuezeilen:INT VAR menuepkt:=
0;FOR menuepktFROM 1UPTO sohnanzREP zeigemenuezeilePER .zeigemenuezeile:
setzecursoraufnaechstenzeilenanfang;put(anfangundfkttaste+aufbereitetertext+
zeichenblankstern).anfangundfkttaste:"* "+fkttaste+" ".fkttaste:TEXT VAR
aufbertaste:=taste(ktab(menuepkt));IF aufbertaste<>""THEN aufbertasteELSE " "
FI .aufbereitetertext:IF menuetextzulangTHEN subtext(text(ktab(menuepkt)),1,
textlaenge)ELSE text(ktab(menuepkt))+restblanksFI .menuetextzulang:length(
text(ktab(menuepkt)))>textlaenge.restblanks:(textlaenge-length(text(ktab(
menuepkt))))*" ".END PROC zeigefunktionenmenueaufdembildschirm;TEXT PROC
zentriert(TEXT CONST text,INT CONST breite):TEXT CONST blank:=" ";TEXT CONST
blanks:=blankausgleich;blanks+text+blanks.blankausgleich:((breite-length(text
))DIV 2)*blank.END PROC zentriert;PROC einzelknotenfuerfunktionenmenueholen(
BOOL CONST verteilteanwendung):BOOL VAR ok;IF verteilteanwendungTHEN
einzelknotenholen(tastefuerbildschirmausdruck,knotenfuerbildschirmausdruck,ok
);einzelknotenholen(tastefuerauskunftserteilung,knotenfuerauskunftserteilung,
ok)ELSE einzelknotenholen(knotennamefuerbildschirmausdruck,
knotenfuerbildschirmausdruck,ok);einzelknotenholen(
knotennamefuerauskunftserteilung,knotenfuerauskunftserteilung,ok)FI .END
PROC einzelknotenfuerfunktionenmenueholen;PROC startbaisy(TEXT CONST kn,PROC
(INT CONST ,BOOL CONST ,TEXT CONST )call):BOOL VAR menuepunktgefunden,
anwahleineshistoriepunktes:=FALSE ,gueltigetasteimmenue:=FALSE ,
anderemenueebene:=FALSE ,zurueckuebercursortaste:=FALSE ,nichtvorhandenetaste
:=FALSE ,ebenenwechsel:=FALSE ,programmeinstiegnachmenueanwahl,#
benutzerberechtigt:=FALSE ,#druckenkommtimfktmenuevor:=FALSE ,
auskunftkommtimfktmenuevor:=FALSE ;TAG VAR t,men;TEXT VAR te,stufennummer:=""
;INT VAR start1,start2,schluss,koordx;TEXT VAR anfangsknotenname;ROW
maxhknotenTEXT VAR histtexttab;ROW maxhknotenINT VAR histanwahlpos;INT VAR
sohnanzahl,mpkt,letztemenueanwahlpos:=menuebeginn,aktmaxmenuepunkte,x,y;
KNOTEN VAR sk;KNOTENMENGE VAR ksoehne;initialisierenzumanfang;
holenamedesanfangsknotens;fortlaufendeknotenbehandlung.
fortlaufendeknotenbehandlung:REP behandleknotenPER .initialisierenzumanfang:
IF kn<>""THEN initmaske(men,menuemaskenname);schluss:=ysize(men)FI ;ksoehne:=
leeremenge;bildschirmwiederholspeichereinschalten.holenamedesanfangsknotens:
anfangsknotenname:=text(k);.behandleknoten:setzevergleichsknoten(k);
programmeinstiegnachmenueanwahl:=menuemaske;schaueobmaskediemenuemaskeist;IF
vpgewaehltTHEN vpname:=vorprozedur(k);IF vpvorhandenTHEN clearerror;
disablestop;vpausfuehren(PROC (INT CONST ,BOOL CONST ,TEXT CONST )call);IF
programmendeTHEN LEAVE fortlaufendeknotenbehandlungFI ;IF iserrorTHEN
fehlerbehandeln;clearerrorFI ;enablestop;IF
knotenwechselbeiprozedurausfuehrungTHEN vaterknotenalsneuenknotennehmen;
ebenenwechsel:=TRUE ;LEAVE behandleknotenFI ;holefunktionstaste;ELSE
bereitemenuemaskenausgabevorFI ;ELSE IF npgewaehltTHEN npname:=nachprozedur(k
);IF npvorhandenTHEN clearerror;disablestop;npausfuehren(PROC (INT CONST ,
BOOL CONST ,TEXT CONST )call);IF programmendeTHEN LEAVE
fortlaufendeknotenbehandlungFI ;IF iserrorTHEN fehlerbehandeln;clearerrorFI ;
enablestop;IF knotenwechselbeiprozedurausfuehrungTHEN
vaterknotenalsneuenknotennehmen;ebenenwechsel:=TRUE ;LEAVE behandleknotenFI ;
holefunktionstaste;ELSE bereitemenuemaskenausgabevorFI ;ELSE
bereitemenuemaskenausgabevorFI FI ;holeberechtigungswert(benutzerberechtigung
);holeallesohnknoten;setzeschalterfuermenueausgabenachfunktionstaste;IF
bittedasmenuezeigenTHEN anwahluebermenueELSE direktefunktionstaste;IF
nichtvorhandenetasteTHEN setzeschalterfuermenueausgabe(TRUE );
anwahluebermenueFI ;FI ;holenaechstenknoten.schaueobmaskediemenuemaskeist:
menuemaske:=nachprozedur(k)="".direktefunktionstaste:menuepunktgefunden:=
FALSE ;IF sohnanzahl>0THEN
pruefetasteundliefereknotenodermenuepunktnichtgefundenFI ;IF NOT
menuepunktgefundenTHEN IF tastendruck=tastefuerbildschirmausdruckTHEN sk:=
knotenfuerbildschirmausdruck;merkeknotenalsgefundenenmenuepunktELIF
tastendruck=tastefuerauskunftserteilungTHEN sk:=knotenfuerauskunftserteilung;
merkeknotenalsgefundenenmenuepunktELSE nichtvorhandenetaste:=TRUE FI FI .
pruefetasteundliefereknotenodermenuepunktnichtgefunden:menuepunkt:=0;sk:=
erster(ksoehne);WHILE weitere(sk,ksoehne)AND NOT menuepunktgefundenREP IF (
NOT isopen(sk))CAND gesuchtetastegefundenTHEN
merkeknotenalsgefundenenmenuepunktFI ;naechster(sk)PER .
merkeknotenalsgefundenenmenuepunkt:menuepunktgefunden:=TRUE ;menuepunktINCR 1
;ktab(menuepunkt):=sk.gesuchtetastegefunden:taste(sk)=tastendruck.
holeallesohnknoten:mengedernachfolger(k,ksoehne);sohnanzahl:=zahlderelemente(
ksoehne).holefunktionstaste:IF NOT gesetztdurcheditorTHEN IF menuemaskeTHEN
loeschetastendruckELSE setzetastendruck(incharety(wartezeit))FI FI .
anwahluebermenue:bildschirmwiederholspeicherausschalten;IF menuemaskeTHEN
maskeaufbauen;maskekomplettausgeben;menueanwahlbestimmen;
setzeschalterfuermenueausgabe(FALSE )ELSE fktmenueaufbauenundausgeben;
fktmenueanwahlbestimmenFI .fktmenueaufbauenundausgeben:
holeallesohnknotenfuerfktmenue;ermittlegrenzwertedesmenuerahmens(sohnanzahl,
nichtvorhandenetaste);zeigefunktionenmenueaufdembildschirm(sohnanzahl,
nichtvorhandenetaste).holeallesohnknotenfuerfktmenue:menuepunkt:=0;
druckenkommtimfktmenuevor:=FALSE ;auskunftkommtimfktmenuevor:=FALSE ;sk:=
erster(ksoehne);REP knotentabfuellenUNTIL (menuepunkt>=sohnanzahl)OR (
menuepunkt>=maxmenuepunkte)PER ;IF (NOT druckenkommtimfktmenuevor)CAND
sohnanzahl<maxmenuepunkteTHEN sohnanzahlINCR 1;ktab(sohnanzahl):=
knotenfuerbildschirmausdruckFI ;IF (NOT auskunftkommtimfktmenuevor)CAND
sohnanzahl<maxmenuepunkteTHEN sohnanzahlINCR 1;ktab(sohnanzahl):=
knotenfuerauskunftserteilungFI ;aktmaxmenuepunkte:=sohnanzahl.
knotentabfuellen:menuepunktINCR 1;IF isopen(sk)THEN ktab(menuepunkt):=
nilknotenELSE ktab(menuepunkt):=sk;IF taste(sk)=tastefuerbildschirmausdruck
THEN druckenkommtimfktmenuevor:=TRUE ELIF taste(sk)=
tastefuerauskunftserteilungTHEN auskunftkommtimfktmenuevor:=TRUE FI ;FI ;
naechster(sk).fktmenueanwahlbestimmen:
eventuellefehlermeldungimfktmenueausgeben;
setzecursoraufeinleseanfangsposition;tasteholen;anderemenueebene:=FALSE ;REP
tastendruckimfktmenueUNTIL anderemenueebenePER ;
bildschirmwiederholspeichereinschalten.
eventuellefehlermeldungimfktmenueausgeben:.
setzecursoraufeinleseanfangsposition:x:=x1+2;INT VAR yanfang:=y1+3;INT VAR
yende:=yanfang+sohnanzahl-1;y:=yanfang;fktcursorzeigen.tastendruckimfktmenue:
IF anderermenuepunktTHEN fktcursorloeschen;neuenfktmenuepunktbestimmen;
fktcursorzeigen;tasteholen;ELSE pruefefkttastezudiesemmenue;IF NOT
anderemenueebeneTHEN tasteholenFI FI .fktcursorloeschen:cursor(x,y);out(" ").
fktcursorzeigen:cursor(x,y);out(">");cursor(x,y).pruefefkttastezudiesemmenue:
IF tastendruck=rechtstasteTHEN anderemenueebene:=TRUE ;
wandleypositioninmenuepunktnummerum;fktcursorloeschenELIF tastendruck=
esctasteTHEN anderemenueebene:=TRUE ;funktionenmenueloeschenELSE
vergleichetastemitgueltigenfkttasten;IF gueltigetasteimmenueTHEN
anderemenueebene:=TRUE ;fktcursorloeschen;wandlemenuepunktnummerinypositionum
;fktcursorzeigen;fktcursorloeschenFI FI .wandleypositioninmenuepunktnummerum:
getcursor(x,y);menuepunkt:=y-yanfang+1.wandlemenuepunktnummerinypositionum:y
:=yanfang+menuepunkt-1.funktionenmenueloeschen:
schalterzurueckuebercursortasteein;IF vpvorhandenTHEN IF NOT
gesetztdurcheditorTHEN reorganizescreen;cursor(cursorx,cursory);
setlasteditvalues;setzeschalterfuermenueausgabe(FALSE )FI ;return(0)ELSE
enter(1)FI .vergleichetastemitgueltigenfkttasten:gueltigetasteimmenue:=FALSE
;menuepunkt:=0;WHILE (NOT gueltigetasteimmenue)AND menuepunkt<
aktmaxmenuepunkteREP menuepunktINCR 1;IF tastendruck=taste(ktab(menuepunkt))
THEN gueltigetasteimmenue:=TRUE FI PER .neuenfktmenuepunktbestimmen:IF
cursorbewegungmithopTHEN aktuellerstenoderletztenfktmenuepunktbestimmenELSE
naechstenfktmenuepunktbestimmenFI .
aktuellerstenoderletztenfktmenuepunktbestimmen:cursorbewegungmithop:=FALSE ;
IF tastendruck=obentasteTHEN y:=yanfangELSE y:=yendeFI .
naechstenfktmenuepunktbestimmen:IF tastendruck=obentasteTHEN IF y>yanfang
THEN yDECR 1ELIF y=yanfangTHEN y:=yendeFI ELIF tastendruck=untentasteTHEN IF
y<yendeTHEN yINCR 1ELIF y=yendeTHEN y:=yanfangFI FI .maskeaufbauen:
holemaskedesknotens;fuellemaske.holemaskedesknotens:t:=men.fuellemaske:
fuelletitel;fuelletextederhistorie;fuelletextedersoehne.fuelletitel:put(t,
text(k),titelfeldnr);getcursor(koordx,start2).fuelletextederhistorie:INT VAR
hknr,tabzeiger,histmpkt;menuefeldnr:=historieende;FOR hknrFROM 1UPTO
maxhknotenREP holehistorietext(menuetext,histmpkt,hknr);tabzeiger:=
menuefeldnr-felderanzahlbishistoriebeginn;IF menuetext=""THEN
setzemenuepunktzugang(tabzeiger,FALSE );menuetext:=" "ELSE
setzemenuepunktzugang(tabzeiger,TRUE );histtexttab(hknr):=menuetext;
histanwahlpos(hknr):=histmpkt;menuetext:=tabzeiger*" "+menuetext;put(t,
menuetext,menuefeldnr);putposition(t,menuefeldnr);FI ;menuefeldnrDECR 1PER ;
getposition(koordx,start1,historieende);start1:=start1-maxhknoten-1;te:=
formline(men,start1);zeige(te,start1,start2,schluss).fuelletextedersoehne:
TEXT VAR menuetext;INT VAR menuepunkt:=0,menuefeldnr;menuefeldnr:=menuebeginn
;sk:=erster(ksoehne);WHILE (menuefeldnr<=felderimanwahlmenue)REP menuepunkt
INCR 1;IF menuepunkt>sohnanzahlTHEN keinenmenuetext;ELSE IF isopen(sk)THEN
ktab(menuepunkt):=nilknotenELSE ktab(menuepunkt):=skFI ;
menuetextzusammensetzen(menuepunkt,stufennummer,menuetext);naechster(sk);put(
t,menuetext,menuefeldnr);putposition(t,menuefeldnr)FI ;menuefeldnrINCR 1PER ;
aktmaxmenuepunkte:=menuepunkt.keinenmenuetext:menuetext:=" ";mpkt:=menuepunkt
+maxhknoten;setzemenuepunktzugang(mpkt,FALSE ).maskekomplettausgeben:
eventuellefehlermeldungausgeben;erstenmenuepunktbestimmen;
cursorpositionerrechnen;cursorzeigen;tasteholen;anderemenueebene:=FALSE ;REP
tastendruckindiesemmenueUNTIL anderemenueebenePER ;cursorloeschen;
bildschirmwiederholspeichereinschalten.eventuellefehlermeldungausgeben:.
erstenmenuepunktbestimmen:IF ebenenwechselTHEN ebenenwechsel:=FALSE ;
aktfeldnr:=letztemenueanwahlposFI ;mpkt:=aktfeldnr-
felderanzahlbishistoriebeginn;IF NOT zugangerlaubt(mpkt)THEN setzetastendruck
(untentaste);neuenmenuepunktbestimmenFI ;mpkt:=aktfeldnr-
felderanzahlbishistoriebeginn;IF (NOT zugangerlaubt(mpkt))AND menuemaskeTHEN
aktfeldnr:=historieendeFI .cursorpositionerrechnen:getposition(x,y,aktfeldnr)
.cursorzeigen:cursor(x,y);out(fcursor);xDECR 1;cursor(x,y);out(" ").
cursorloeschen:cursorvormenuepunktloeschen.cursorvormenuepunktloeschen:
getcursor(x,y);cursor(x,y);out(fcursorweg).tastendruckindiesemmenue:IF
anderermenuepunktTHEN cursorloeschen;neuenmenuepunktbestimmen;
cursorpositionerrechnen;cursorzeigen;tasteholenELSE
pruefetastendruckzudiesemmenue;IF NOT anderemenueebeneTHEN tasteholenFI FI .
pruefetastendruckzudiesemmenue:IF tastendruck=rechtstasteTHEN
anderemenueebene:=TRUE ELIF code(tastendruck)>=codefuerziffernullAND code(
tastendruck)<=codefuerzifferneunTHEN IF code(tastendruck)=codefuerziffernull
THEN mpkt:=10ELSE mpkt:=code(tastendruck)-codefuerziffernullFI ;IF sohnanzahl
<mpktTHEN gedaechtnisloeschen;out("�");cursor(x+1,y)ELIF NOT zugangerlaubt(
mpkt+maxhknoten)THEN gedaechtnisloeschen;out("�");cursor(x+1,y)ELSE
anderemenueebene:=TRUE ;cursorloeschen;aktfeldnr:=menuebeginn+(mpkt-1)*
felderpromenuepunkt;setzetastendruck(rechtstaste);cursorpositionerrechnen;
cursorzeigenFI FI .neuenmenuepunktbestimmen:IF cursorbewegungmithopTHEN
aktuellerstenoderletztenmenuepunktbestimmenELSE naechstenmenuepunktbestimmen
FI .aktuellerstenoderletztenmenuepunktbestimmen:BOOL VAR
erstenoderletztenmenuepunktgefunden:=FALSE ;WHILE NOT
erstenoderletztenmenuepunktgefundenREP naechstenmenuepunktbestimmen;IF
savefeldnr=aktfeldnrTHEN erstenoderletztenmenuepunktgefunden:=TRUE FI ;PER ;
cursorbewegungmithop:=FALSE .naechstenmenuepunktbestimmen:BOOL VAR
neuenmenuepunktgefunden:=FALSE ;INT VAR savefeldnr:=aktfeldnr;REP
sucheneuenmenuepunktUNTIL neuenmenuepunktgefundenPER .sucheneuenmenuepunkt:
IF tastendruck=obentasteTHEN aktfeldnrDECR felderpromenuepunktELIF
tastendruck=untentasteTHEN aktfeldnrINCR felderpromenuepunktFI ;IF
cursorbewegungmithopTHEN IF aktfeldnr<historiebeginnOR aktfeldnr>
felderimanwahlmenueTHEN aktfeldnr:=savefeldnr;neuenmenuepunktgefunden:=TRUE ;
LEAVE sucheneuenmenuepunktFI ELSE IF aktfeldnr<historiebeginnTHEN aktfeldnr:=
fields(t)-felderpromenuepunkt+1ELIF aktfeldnr>fields(t)THEN aktfeldnr:=
historiebeginnFI FI ;IF feldvorhandenTHEN mpkt:=aktfeldnr-
felderanzahlbishistoriebeginn;IF zugangerlaubt(mpkt)THEN
neuenmenuepunktgefunden:=TRUE FI ;FI .feldvorhanden:fieldexists(t,aktfeldnr).
bildschirmwiederholspeicherausschalten:store(FALSE ).
bildschirmwiederholspeichereinschalten:store(TRUE ).menueanwahlbestimmen:IF
menuemaskeTHEN IF aktfeldnr<menuebeginnTHEN letztemenueanwahlpos:=menuebeginn
ELSE letztemenueanwahlpos:=aktfeldnrFI ;FI ;IF tastendruck=rechtstasteTHEN
bestimmemenuepunktfuernaechstesmenueELSE schalterzurueckuebercursortasteein;
IF vpvorhandenTHEN IF NOT gesetztdurcheditorTHEN reorganizescreenFI ;return(0
)ELSE enter(1)FI ;FI .bestimmemenuepunktfuernaechstesmenue:IF aktfeldnr>=
menuebeginnTHEN aktfeldnrDECR felderanzahlbismenuebeginnELSE aktfeldnrDECR
felderanzahlbishistoriebeginn;anwahleineshistoriepunktes:=TRUE FI ;menuepunkt
:=aktfeldnr.holenaechstenknoten:setzeeditorschalterzurueck;IF
zurueckuebercursortasteTHEN schalterzurueckuebercursortasteaus;
vaterknotenalsneuenknotennehmenELIF historiepunktangewaehltTHEN
anwahleineshistoriepunktes:=FALSE ;textdeshistoriepunktesbestimmen;
historieknotenalsneuenknotennehmenELSE knotenaufstackablegen(k);IF
aktuellerhistorieknotenTHEN legehistorieknotenab(text(k),menuepunkt)FI ;
sohnknotenalsneuenknotennehmenFI .historiepunktangewaehlt:
anwahleineshistoriepunktes.textdeshistoriepunktesbestimmen:TEXT VAR histtext;
hknr:=maxhknoten+1-menuepunkt;histtext:=histtexttab(hknr);aktfeldnr:=
historieende+histanwahlpos(hknr).historieknotenalsneuenknotennehmen:REP enter
(1);vaterknotenalsneuenknotennehmenUNTIL text(k)=histtextPER .
reduzierestufennummer:INT VAR lstufnr:=length(stufennummer);IF lstufnr<=3
THEN stufennummer:=""ELSE IF subtext(stufennummer,lstufnr-1,lstufnr-1)=
stufentrennerTHEN stufennummer:=subtext(stufennummer,1,lstufnr-2)ELSE
stufennummer:=subtext(stufennummer,1,lstufnr-3)FI ;FI .
aktuellerhistorieknoten:menuemaskeOR (text(k)=anfangsknotenname).
vaterknotenalsneuenknotennehmen:k:=vergleichsknoten;IF nachprozedur(k)=""
THEN reduzierestufennummerFI .sohnknotenalsneuenknotennehmen:KNOTEN VAR
tabknoten:=ktab(menuepunkt);IF reinlokaleoperationTHEN k:=tabknoten;IF
menuemaskeTHEN erweiterestufennummerFI ;aktfeldnr:=menuebeginnELSE
fuehreknotenwechselmittaskwechseldurch;ebenenwechsel:=TRUE FI ;vpwunsch.
reinlokaleoperation:TEXT CONST knotentask:=task(tabknoten);knotentask="".
fuehreknotenwechselmittaskwechseldurch:INT VAR statustaskwechsel:=0;
umgebungswechsel(tabknoten,knotentask,statustaskwechsel);k:=
altermenueknotenaufstack;IF statustaskwechsel=1THEN cursor(1,23);put(
"Verzweigung ist nicht möglich");pauseELIF statustaskwechsel=2THEN cursor(1,
23);put("es wird bereits innerhalb dieser Anwendungen gearbeitet");pauseFI .
altermenueknotenaufstack:enter(1);vergleichsknoten.erweiterestufennummer:IF
stufennummer=""THEN stufennummer:=berechttrenner+text(menuepunkt)ELSE
stufennummer:=stufennummer+stufentrenner+text(menuepunkt)FI .
schalterzurueckuebercursortasteein:zurueckuebercursortaste:=TRUE .
schalterzurueckuebercursortasteaus:zurueckuebercursortaste:=FALSE .END PROC
startbaisy;PROC berechtigungspruefung(TEXT CONST altnr,INT CONST neunr,BOOL
VAR berechtigt):IF NOT menuemaskeTHEN berechtigt:=TRUE ;LEAVE
berechtigungspruefungFI ;TEXT VAR berechtstring:=benutzerberechtigung;IF
keineberechtigungzugeteiltTHEN berechtigt:=FALSE ;LEAVE berechtigungspruefung
FI ;berechtigt:=FALSE ;zupruefendestufennummeraufbauen;berechtigungholen;
WHILE NOT berechtigtAND nocheineberechtigungdaREP IF
berechtistpraefixvonpruefnrOR pruefnristpraefixvonberechtTHEN berechtigt:=
TRUE FI ;berechtigungholenPER .keineberechtigungzugeteilt:berechtstring="".
nocheineberechtigungda:berecht<>"".zupruefendestufennummeraufbauen:TEXT VAR
pruefnr;IF altnr=""THEN pruefnr:=berechttrenner+text(neunr)ELSE pruefnr:=
altnr+stufentrenner+text(neunr)FI ;pruefnrCAT stufentrenner.berechtigungholen
:TEXT VAR berecht;IF berechtstringabgearbeitetTHEN berecht:=""ELSE
imberechtstringweitereberechtsuchen;IF nurnocheineberechtigungTHEN berecht:=
berechtstring;berechtstring:=""ELSE berecht:=subtext(berechtstring,1,
postrennz-1);berechtstring:=subtext(berechtstring,postrennz)FI ;berechtCAT
stufentrenner;FI .imberechtstringweitereberechtsuchen:INT VAR postrennz:=pos(
berechtstring,berechttrenner,2).nurnocheineberechtigung:postrennz=0.
berechtstringabgearbeitet:berechtstring="".berechtistpraefixvonpruefnr:pos(
pruefnr,berecht)<>0.pruefnristpraefixvonberecht:pos(berecht,pruefnr)<>0.END
PROC berechtigungspruefung;PROC dummycall(INT CONST i,BOOL CONST b,TEXT
CONST knotenproc):do(knotenproc)END PROC dummycall;PROC startebaisy(TEXT
CONST kn):initsybifunktionen;BOOL VAR knotenda;anfangsknotenholen(kn,k,
knotenda);holenamedesanfangsknotens;vpwunsch;IF NOT knotendaTHEN put(
"kein knoten da");pause(50);setzeprogrammende(TRUE )ELIF isopen(k)THEN put(
"knoten da, aber offen");pause(50);setzeprogrammende(TRUE )FI ;
setzeanfangsknotennamefuerbenutzerbestand(kn);
einzelknotenfuerfunktionenmenueholen(verteilt);monitorbehandlungundstart.
holenamedesanfangsknotens:TEXT VAR anfangsknotenname;anfangsknotenname:=text(
k);page.verteilt:anfangsknotenname="".monitorbehandlungundstart:putline(
"Das System "+kn+" wird gestartet.");initmeldungsfunktionen;startbaisy(kn,
PROC dummycall)END PROC startebaisy;PROC starteanwendung:BOOL VAR knotenda;
anfangsknotenholen("",k,knotenda);vpwunsch;
einzelknotenfuerfunktionenmenueholen(TRUE );setzeverteilteanwendung;
startbaisy("",PROC dummycall)END PROC starteanwendung;PROC startebaisy:
startebaisy("baisy")END PROC startebaisy;PROC starteschulis:startebaisy(
"schulis")END PROC starteschulis;END PACKET systembauminterpreter;
|