summaryrefslogtreecommitdiff
path: root/app/gs.menugenerator/1.0/doc/menu-generator handbuch.5
blob: c002f1a654ede6aa658d3c26b30cf14fc2435cf1 (plain)
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
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
#block##pageblock# 
#pagenr("%",1)##setcount(1)##count per page# 
#headeven# 
gs-Menu-Generator 
#center#____________________________________________________________ 
 
#end# 
#headodd# 
#right#gs-Menu-Generator 
#center#____________________________________________________________ 
 
#end# 
#bottomeven# 
#center#____________________________________________________________ 
5 - % #right#ERGOS 
#end# 
#bottomodd# 
#center#____________________________________________________________ 
ERGOS #right# 5 - % 
#end# 
#ib#5  Dialoge innerhalb des Menus#ie# 
 
 
In Kapitel 4 haben Sie erfahren, wie Sie eine eigene Menukarte entwickeln können;
sicher haben Sie das schon ausprobiert und sich Ihr selbstgestaltetes Menu auf dem
Bildschirm angesehen. Bislang erscheint aber noch der Hinweis 'unbekanntes Kom­
mando', wenn Sie eine Menufunktion aktivieren - denn die Prozeduren, die Sie bei
der Aktivierung der Menufunktion aufrufen, sind ja noch nicht fertiggestellt! 
Bei vielen Menufunktionen ist es notwendig, mit dem Benutzer noch einen Dialog zu
führen: z.B. muß ein Dateiname erfragt, eine Information ausgegeben und bestätigt,
eine Auswahl oder eine Entscheidung getroffen werden. In diesem Kapitel sollen
Ihnen nun die Möglichkeiten vorgestellt werden, die Ihnen zur Verfügung stehen, um
einen solchen Dialog mit dem Benutzer zu führen. Dieser Dialog wird innerhalb des
Menus geführt. Alle Prozeduren, die sich auf diesen Menu-Dialog beziehen, enthalten
deshalb den Wortbestandteil 'menu'. 
 
Hier noch einige Tips! Damit Sie Ihre Menu-Dialoge testen können, empfiehlt
sich folgendes Vorgehen: Sie erstellen zuerst Ihre Menukarte und tragen schon die
Namen für die jeweils aufzurufenden Prozeduren ein - wie wir es in Kapitel 4 ge­
macht haben. Mit 'testinstallation' installieren Sie dann in Ihrer Task die neue Menu­
karte. 
Nun schreiben Sie Ihre Prozeduren, die Sie unter das Menu legen wollen. Ist eine
Prozedur "testreif", so müssen Sie sie zunächst insertieren, denn das Menusystem gs-
DIALOG kann nur auf insertierte Prozeduren zugreifen. Anschließend rufen Sie das
Menu (z.B. 'SCRIPT') aus der Menukarte mit dem Befehl 'handle menu ("SCRIPT")'
(Hier ist der jeweilige Menuname einzusetzen!) auf. Wenn Sie den entsprechenden
Menupunkt aktivieren, müßte Ihr Programm ablaufen. 
Es ist günstig, eine eigene Task zum Testen der Prozeduren anzulegen, damit diese
hin und wieder gelöscht werden kann. 
 
 
#ib#5.1  Eingabe eines Textes/Namens#ie# ('#ib#menuanswer#ie#') 
 
Wenn der Benutzer in unserem Beispiel die Menufunktion 'Neu erstellen' aktiviert
hat, muß der Name der Datei erfragt werden, die neu erstellt werden soll. Dafür steht
die Prozedur 'menuanswer' zur Verfügung. Die in die Menukarte eingetragene Proze­
dur 'neue datei editieren' (Siehe Kapitel 4.1) könnte dann folgendermaßen aussehen: 
 
 
PROC neue datei editieren: 
  TEXT VAR dateiname := menuanswer ("Bitte den gewünschten Dateinamen:", 
                                    "", 5); 
  IF dateiname <> "" AND NOT exists (dateiname) 
     THEN command dialogue (FALSE); #ib#cursor on#ie#; 
          edit (dateiname); 
          #ib#cursor off#ie#; command dialogue (TRUE); 
          regenerate menuscreen      (* sehen Sie dazu Kapitel 5.10 *) 
  FI 
END PROC neue datei editieren; 
 
 
Schauen wir uns zuerst die Prozedur 'menuanswer' an. Die Prozedur hat drei Para­
meter. Mit dem ersten Parameter legen Sie den Text fest, der innerhalb der Box
ausgegeben wird, die auf dem Bildschirm erscheint. Der Text dient ausschließlich der
Information des Anwenders. 
Mit dem zweiten Parameter können Sie dem Benutzer einen Vorschlag für die Einga­
be machen, der zum Editieren ausgegeben wird. Da eine solche Vorgabe aber in die­
ser Situation sinnlos wäre, verzichten wir darauf (""). 
 
Die auf dem Bildschirm erscheinende Box hat folgendes Aussehen: 
 
       +-------------------------------------+ 
       I  Bitte den gewünschten Dateinamen:  I 
       I                                     I 
       I                                     I 
       I  Eingabe:                           I 
       +-------------------------------------+ 
 
 
Die Boxbreite und -höhe wird vom System automatisch anhand des von Ihnen als
ersten Parameter übergebenen Textes festgelegt. Sie haben noch verschiedene Mög­
lichkeiten, diesen Text zu gestalten (mehrere Zeilen, Inversdarstellung etc.) - auf
diese Möglichkeiten gehen wir in Kapitel 5.13 detailliert ein. 
In unserem Beispiel erscheint die Box in der Mitte des Menubildschirms. Diese
Festlegung treffen wir durch die Angabe der Position '5' als dritten Parameter. Sie
können hier zwischen 5 verschiedenen Positionen wählen: 1 - oben links, 2 - oben
rechts, 3 - unten links, 4 - unten rechts, 5 - zentral im Menubildschirm - mehr dazu
in Kapitel 5.12. 
 
Mit dem Erscheinen der obigen Box auf dem Bildschirm ändert sich automatisch
auch die Fußzeile im Menu, über die der Benutzer Informationen zur Bedienung
erhält. Hier erscheint der Hinweis: 'Fertig: <RETURN>  Abbruch: <ESC><h>'.
Um diese Hinweise brauchen Sie sich aber nicht zu kümmern , da sie alle automa­
tisch gesetzt werden. 
Die Prozedur 'menuanswer' hat noch folgende Besonderheit: Es ist nicht möglich,
den Namen 'break' einzugeben! Diese Eingabe wird automatisch abgefangen. Es hat
sich gezeigt, daß Anwender manchmal versuchen, über <ESC><q> die Eingabe
zu verlassen. In diesem Falle entstünde hier eine Datei mit Namen 'break' - was aber
nicht sinnvoll wäre. 
Nach der Eingabe liefert die Prozedur 'menuanswer' als Wert den vom Benutzer
eingegebenen Text - dabei sind führende und folgende Leerzeichen schon abgeschnit­
ten ('compress'). Wurde die Prozedur mit <ESC><h> verlassen, so wird niltext
geliefert. 
 
Wird in obiger Prozedur die Eingabe mit <ESC><h> abgebrochen oder existiert
bereits eine Datei mit dem eingegebenen Namen, so verschwindet die Box, und der
Menubildschirm wird automatisch in den alten Zustand gebracht. 
Wenn schon eine Datei mit dem Namen existiert, dann wäre es sinnvoll, den Benutzer
darauf aufmerksam zu machen. Wie ein solcher Hinweis in das Menu eingeblendet
werden kann, erklären wir im Kapitel 5.2. 
 
gs-DIALOG ist so geschrieben, daß der Cursor möglichst wenig störend wirkt. Aus
diesem Grunde wird der Cursor immer an einer Stelle "geparkt". Sofern Ihr System es
zuläßt und eine entsprechende Anpassung vorliegt, wird der Cursor ganz ausgeschal­
tet. Denken Sie bitte daran, auch wenn er auf Ihrem Bildschirm ständig sichtbar ist! 
Wenn also jetzt eine Eingabe erfolgen soll, ist es notwendig, den Cursor anzuschalten.
Wenn Sie wieder in das Menu zurückkehren, sollte der Cursor wieder ausgeschal­
tet werden, damit er dort nicht stört. 
Wenn Sie die Prozedur 'edit' mit einem neuen Namen als Parameter aufrufen, erfragt
das System, ob die Datei neu eingerichtet werden soll. Diese Anfrage muß hier unter­
drückt werden, damit nicht irgendwelche Texte in den Menubildschirm geschrieben
werden. Das Unterdrücken der Abfrage erreichen Sie durch Ausschalten des Kom­
mandodialoges. Nach Einrichten der Datei muß der Kommandodialog aber wieder
eingeschaltet werden, da gs-DIALOG das Eingeschaltetsein für eine fehlerfreie Funk­
tion voraussetzt! 
 
Mit dem Befehl '#ib#regenerate menuscreen#ie#' (sehen Sie dazu auch Kapitel 5.10) wird der
aktuelle Menubildschirm erneut vollständig auf den Bildschirm geschrieben (repro­
duziert). Das ist notwendig, weil die Prozedur 'edit' den Bildschirm benutzt hat.
Durch diesen Befehl wird der Menubildschirm exakt in der Form hergestellt, wie er
zuletzt ausgesehen hat. Auch wenn Sie geschachtelte Menubildschirme haben, wer­
den diese durch den einen Befehl reproduziert. So können Sie in Ihren Verarbei­
tungsfunktionen mit dem Bildschirm "machen was Sie wollen" - Sie kehren mit dem
letztgenannten Befehl immer wieder so in das Menu zurück, wie Sie es verlassen
haben. 
 
 
#ib#5.2  Ausgabe einer Information#ie# ('#ib#menuinfo#ie#') 
 
In der Prozedur 'neue datei editieren' (Kapitel 5.1) wäre es sinnvoll, den Benutzer zu
informieren, wenn bereits eine Datei mit dem eingegebenen Namen existiert. Hierfür
steht die Prozedur 'menuinfo' zur Verfügung. 
 
Beispiel: 
 
menuinfo (" Eine Datei mit dem Namen "13"     existiert schon!"); 
 
Dadurch wird folgende Box ins Menu geschrieben: 
 
          +----------------------------+ 
          I                            I 
          I  Eine Datei mit dem Namen  I 
          I      existiert schon       I 
          I                            I 
          +----------------------------+ 
 
Die Box erscheint in der Mitte des Menus (Position 5); in der Fußzeile wird der Hin­
weis ausgegeben 'Zum Weitermachen bitte irgendeine Taste tippen!'. Dann wartet das
System so lange, bis eine Taste gedrückt wird. Anschließend wird der aktuelle Menu­
schirm wiederhergestellt. 
Die Prozedur 'menuinfo' gibt es noch in zwei weiteren Versionen, nämlich mit zwei
bzw. drei Parametern. Im ersten Fall kann über den zweiten Parameter noch die
Position (1, 2, 3, 4, 5) innerhalb des Menubildschirmes  festgelegt werden (sehen Sie
dazu Kapitel 5.12). Mit dem dritten Parameter kann ggf. noch die Wartezeit festgelegt
werden, die das System maximal verstreichen läßt, bevor es von sich aus das Pro­
gramm fortsetzt. 
 
'menuinfo (" Eine Datei mit dem Namen "13" existiert schon!", 3, 40)' 
 
gibt die oben gezeigte Box aus, aber links unten in der Ecke des Menubildschirms
(Position 3). Das System wartet (maximal) 4 Sekunden (40 Zehntel) und setzt dann -
auch ohne Tastendruck - das Programm fort. Diese Prozedur mit gesondert angege­
bener Wartezeit verwendet man dann, wenn man nicht unbedingt die Kenntnisnahme
der Information durch den Benutzer bestätigt haben möchte. 
 
 
#ib#5.3  Auswahl eines Namen durch Ankreuzen#ie# ('#ib#menuone#ie#') 
 
Während bei der Neuerstellung einer Datei ein Name neu erfragt werden muß, kann
man beim Menupunkt 'Ansehen/Ändern' auf schon vorhandene Dateien zugreifen.
Sie können dem Benutzer z.B. alle Dateien in der Task zur Auswahl anbieten. Sobald
der Benutzer einen Namen angekreuzt hat, soll die entsprechende Datei geöffnet wer­
den. Dafür steht der Befehl 'menuone' zur Verfügung: 
 
 
PROC alte datei editieren: 
  TEXT CONST kopf      :: "Textdatei ansehen/ändern", 
             hinweis   :: "Bitte gewünschte Datei ankreuzen"; 
  TEXT VAR   dateiname := menuone (ALL myself, kopf, hinweis, FALSE); 
  IF dateiname <> "" 
     THEN #ib#cursor on#ie#; 
          edit (dateiname); 
          #ib#cursor off#ie#; 
  FI; 
  regenerate menuscreen 
END PROC alte datei editieren; 
 
 
Die Prozedur 'menuone' hat 4 Parameter: Als erster Parameter ist ein Thesaurus zu
übergeben, in dem die zur Auswahl stehenden Namen enthalten sind. Zum Thesau­
rushandling werden noch einige zusätzliche Funktionen zur Verfügung gestellt (z.B.
daß nur Dateien eines bestimmten Typs zur Auswahl angeboten werden können) -
diese Funktionen werden in Kapitel 5.14 erläutert. In unserem Beispiel werden alle
Dateien zur Auswahl angeboten, die in der Task zur Verfügung stehen. 
Die beiden Texte, die als 2. und 3. Parameter übergeben werden, erscheinen zur
Kennzeichnung im Kopf der Auswahlliste. Der als zweiter Parameter übergebene Text
erscheint zentriert und invers dargestellt auf dem Bildschirm, der als dritter Parame­
ter übergebene Text nur zentriert. Es ist sinnvoll, mit dem ersten Text (2.Parame­
ter) die zur Zeit aktivierte Menufunktion anzuzeigen, denn der Menubildschirm wird
ja durch die Auswahlliste überschrieben. So kann sich der Benutzer besser im Menu­
system orientieren. 
Mit dem 4. Parameter wird festgelegt, ob der Bildschirm nach der Auswahl "ge­
reinigt", d.h. der alte Menubildschirm wiederhergestellt werden soll. Da in unserem
Falle normalerweise im Anschluß an die Auswahl eine Datei auf dem Bildschirm
editiert wird, verzichten wir auf die "automatische Regenerierung" des Menubild­
schirms. Dieses besorgen wir nach dem Editieren durch das Kommando 'regenerate
menuscreen' "von Hand". 
Auf das Fenster, das für die Auswahl auf dem Bildschirm angezeigt wird, können Sie
keinen Einfluß nehmen - es wird vom System selbständig festgelegt. Dadurch können
Sie die Auswahl, wie auch die anderen Dialogkomponenten ebenso in geschachteleten
Menus aufrufen, ohne daß es zu Problemen kommt. 
 
 
#ib#5.4  Auswahl mehrerer Namen durch Ankreuzen#ie# ('#ib#menusome#ie#') 
 
Es ist nicht immer sinnvoll, daß der Benutzer nur einen Namen auswählen, d.h.
ankreuzen kann. Bei der Zeilenformatierung könnte man z.B. zulassen, daß gleich
mehrere Dateinamen angekreuzt werden können. Im Anschluß an die Auswahl sollen
dann alle angekreuzten Dateien mit 'lineform' bearbeitet werden. Für diesen Zweck
steht die Prozedur 'menusome' zur Verfügung. Sie hat die gleichen Parameter wie die
in 5.3 erläuterte Prozedur 'menuone' - nur daß hier die Auswahl mehrerer Namen
möglich ist. Verläßt der Benutzer die Auswahl durch <ESC><q>, so wird ein
Thesaurus mit allen angekreuzten Namen geliefert; bei Verlassen mit <ESC><h>
ein leerer Thesaurus. Beispiel: 
 
 
PROC zeilen formatieren: 
  TEXT CONST kopf          :: "Textdateien zeilenweise formatieren", 
             hinweis       :: "Bitte gewünschte Dateien ankreuzen"; 
  THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis,
  FALSE); 
  cursor on; 
  formatiere dateien; 
  cursor off; 
  regenerate menuscreen. 
 
  formatiere dateien: 
    INT VAR zaehler; 
    FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP 
      IF name (dateinamen, zaehler) <> "" 
         THEN lineform (name (dateinamen, zaehler)) 
      FI 
    PER 
END PROC zeilen formatieren; 
 
 
 
#ib#5.5  Eingabe eines Textes/Namens - alternativ: Auswahl 
     durch Ankreuzen#ie# ('#ib#menuanswerone#ie#','#ib#menuanswersome#ie#') 
 
Sehr häufig kommt es vor, daß der Benutzer auf die zuletzt bearbeitete Datei zurück­
greifen will. In Kapitel 5.3 haben wir dem Benutzer bei der Menufunktion 'Anse­
hen/Ändern' gleich alle Dateien zur Auswahl angeboten. Hier wäre es vielleicht gün­
stiger gewesen, ihm die zuletzt bearbeitete Datei anzubieten und erst auf Wunsch die
Liste aller Dateien zum Ankreuzen. Das läßt sich auf verschiedene Weise realisieren -
wir werden Ihnen in diesem und in den folgenden Kapiteln verschiedene Möglich­
keiten aufzeigen: 
 
Sie können z.B. mit der Prozedur 'menuanswerone' arbeiten. Wie Sie schon aus dem
Namen entnehmen können, handelt es sich dabei um eine Prozedur, die eigentlich
aus zwei Prozeduren, nämlich 'menuanswer' und 'menuone' zusammengesetzt ist. 
Stellen Sie sich vor, sie führen den Namen der zuletzt bearbeiteten Datei in Ihrem
Programm unter der Variablen 'letzte datei'. Dann könnte die Prozedur 'alte datei
editieren' aus Kapitel 5.3 auch folgendermaßen geschrieben werden: 
 
 
TEXT VAR letzte datei; 
... 
 
 
PROC alte datei editieren: 
  TEXT CONST hinweis letzte :: "Zuletzt bearbeitete Datei:", 
             kopf           :: "Textdatei ansehen/ändern", 
             hinweis        :: "Bitte gewünschte Datei ankreuzen"; 
  TEXT VAR   dateiname      :=  menuanswerone (hinweis letzte, 
                                               letzte datei, 
                                               ALL myself, kopf, 
                                               hinweis, FALSE); 
  IF dateiname <> "" 
     THEN cursor on; 
          edit (dateiname); 
          letzte datei := dateiname; 
          cursor off; 
  FI; 
  regenerate menuscreen 
END PROC alte datei editieren; 
 
 
Insgesamt hat die Prozedur 6 Parameter: Die ersten beiden Parameter beziehen sich
auf die Eingabe ('menuanswer'). Wie dort kann auch hier der Text festgelegt werden,
der in der Box auf dem Bildschirm erscheint. 
Der zweite Parameter ist der Text, der dem Benutzer zum Editieren angeboten wird -
hier der zuletzt benutzte Dateiname. Möchte der Benutzer auf die Datei mit dem an­
gebotenen Namen zugreifen, braucht er nur mit <RETURN> zu bestätigen. 
Möchte er die Auswahl zum Ankreuzen angeboten bekommen, so braucht er nur die
Tastenfolge <ESC><z> (für 'Zeigen') zu tippen. Auf diese Auswahl beziehen sich
die letzten 4 Parameter, die die gleiche Bedeutung haben wie bei der Prozedur
'menuone'. Auf die Möglichkeit, durch <ESC><z> eine Auswahl angeboten zu
bekommen, wird in der Fußzeile des Menus hingewiesen. 
 
Aber Achtung! Sie sollten sich einer "Gefahr" bei diesem Vorgehen bewußt sein. Der
Benutzer hat natürlich so die Möglichkeit, auch einen anderen Namen als den vorge­
schlagenen anzugeben - einen Namen, der noch nicht in der Dateiliste enthalten ist.
In einem solchen Falle würde Ihnen bei obiger Prozedur der Menubildschirm "ka­
puttgeschrieben", denn das System fragt (bei eingeschaltetem Kommandodialog) an,
ob eine Datei mit dem Namen eingerichtet werden soll. Für diesen Fall sollten Sie also
unbedingt eine Vorsorge treffen (z.B. indem Sie den Benutzer darauf hinweisen, daß
der eingegebene Name nicht akzeptiert wird)! 
 
Sie vermuten sicher schon ganz richtig, daß es entsprechend auch die Prozedur
'menuanswersome' gibt, die zunächst einen Dateinamen erfragt und auf Wunsch
eine Auswahl anbietet, in der mehrere Dateinamen angekreuzt werden können. Die
Prozedur hat ebenfalls 6 Parameter, die identisch zur Prozedur 'menuanswerone'
sind. Allerdings liefert die Prozedur 'menuanswersome' in jedem Fall einen Thesau­
rus; wurde die Auswahl mit <ESC><h> abgebrochen, so liefert sie einen leeren
Thesaurus. 
 
 
#ib# 5.6  Die Ja/Nein - Entscheidung#ie# ('#ib#menuyes#ie#','#ib#menuno#ie#') 
 
In Kapitel 5.5 trat das Problem auf, daß der Benutzer einen "unzulässigen" Namen
eingeben konnte. Dieses Problem können wir umgehen: Wir fragen den Benutzer ein­
fach, ob er mit der zuletzt bearbeiteten Datei arbeiten will und lassen Ihm nur die
Chance, mit 'Ja' oder 'Nein' zu antworten. Im ersten Fall bieten wir ihm eben diese
Datei an - ansonsten die Auswahl zum Ankreuzen. 
 
Hierfür stehen die Prozeduren 'menuyes' und 'menuno' zur Verfügung, die von Ihrer
Funktion her den Ihnen bekannten Prozeduren 'yes' und 'no' gleichen. Die beiden
Menu-Prozeduren haben jeweils zwei Parameter: 
 
 
TEXT VAR letzte datei; 
... 
 
PROC alte datei editieren: 
  TEXT CONST kopf    :: "Textdatei ansehen/ändern", 
             hinweis :: "Bitte gewünschte Datei ankreuzen"; 
  TEXT VAR dateiname; 
  IF menuyes (" Wollen Sie mit der Datei "13"" + 
              " '" +letzte datei+ "'"13" arbeiten", 5) 
     THEN editiere letzte datei 
     ELSE dateiname  :=  menuone (ALL myself, kopf, hinweis, FALSE); 
          editiere ausgewaehlte datei 
  FI; 
  regenerate menuscreen. 
 
  editiere letzte datei: 
    cursor on; edit (letzte datei); cursor off. 
 
  editiere ausgewaehlte datei: 
    IF dateiname <> "" 
       THEN cursor on; edit (dateiname); cursor off; 
            letzte datei := dateiname 
    FI 
END PROC alte datei editieren; 
 
 
Über den zweiten Parameter legen Sie die Position auf dem Bildschirm innerhalb des
Menus fest (1, 2, 3, 4, 5; sehen Sie auch Kapitel 5.12). Der erste Parameter ist ein
Text, welcher der gs-DIALOG-Syntax gehorchen muß (die Codes "13" bewirken
einen Zeilenvorschub; sehen Sie auch Kapitel 5.13). Er wird in einer Box auf den
Bildschirm geschrieben und durch 'Ja  Nein' ergänzt: 
 
 
          +-----------------------------+ 
          I                             I 
          I   Wollen Sie mit der Datei  I 
          I   'Dateiname'               I 
          I   arbeiten?                 I 
          I                             I 
          I          Ja    Nein         I 
          I                             I 
          +-----------------------------+ 
 
Für 'Dateiname' ist auf Ihrem Bildschirm dann natürlich der aktuelle Inhalt von
'letzte datei' eingetragen. 
Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwortet wurde und FALSE,
wenn mit 'Nein' geantwortet wurde. Die Prozedur 'menuno' wirkt wie 'NOT menuyes'.
Nach Eingabe von 'Ja', 'Nein' (durch Tippen der Anfangsbuchstaben oder Positionie­
rung auf die Antwort und anschließendem <RETURN>) wird der Menubildschirm
automatisch regeneriert. Auch die entsprechenden Hinweise in der Fußzeile werden
natürlich automatisch gesetzt. 
 
 
#ib#5.7  Die Alternativentscheidung#ie# ('#ib#menualternative#ie#') 
 
Im letzten Kapitel haben wir Ihnen die Prozeduren 'menuyes' und 'menuno' in Ihrer
Wirkungsweise erläutert. Eigentlich sind die beiden Prozeduren nur ein (häufig
benötigter) Spezialfall der Prozedur 'menualternative'. Die Funktionsweise der Proze­
dur 'menualternative' dürfte Ihnen schon aus dem 'Archivmenu' bekannt sein: Wenn
Sie eine neue Zieltask einstellen, werden Ihnen nämlich vier Alternativen zur Auswahl
angeboten (Archiv, Vatertask, PUBLIC, Sonstige Task). 
Auf unsere Textverarbeitung bezogen könnten wir z.B. vor der Zeilenformatierung
(lineform) über die Alternativentscheidung den gewünschten Schrifttyp abfragen. Wir
wollen dem Benutzer in diesem Beispiel fünf Schrifttypen (schmal, elite, pica, letter,
groß) zur Auswahl anbieten: 
 
 
 
TEXT VAR schrifttyp; 
... 
 
PROC schrifttyp waehlen: 
  TEXT CONST info :: "        Auswahl der Schrifttypen: "13""13"" 
                   + "    s ... schmal (17 Zeichen pro Zoll) "13"" 
                   + "    e ... elite  (12 Zeichen pro Zoll) "13"" 
                   + "    p ... pica   (10 Zeichen pro Zoll) "13"" 
                   + "    l ... letter (Proportionalschrift) "13"" 
                   + "    g ... groß   ( 5 Zeichen pro Zoll)   ", 
 
           liste  :: "schmal"13"elite"13"pica"13"letter"13"groß", 
           tasten :: "seplgSEPLG"; 
 
  INT VAR auswahl := menualternative (info, liste, tasten, 5, TRUE); 
  SELECT auswahl OF 
     CASE 1, 101, 106: schrifttyp := "17" 
     CASE 2, 102, 107: schrifttyp := "12" 
     CASE 3, 103, 108: schrifttyp := "10" 
     CASE 4, 104, 109: schrifttyp := "prop" 
     CASE 5, 105, 110: schrifttyp := "5" 
     OTHERWISE (* behalte alten Schrifttyp bei *) 
  END SELECT 
END PROC schrifttyp waehlen; 
 
 
Hätten wir diese Prozedur in unsere Prozedur 'zeilen formatieren' eingebunden, so
zeigte sich bei Aktivierung folgende Einblendung in den Menubildschirm: 
 
 
 
    +---------------------------------------+ 
    I                                       I 
    I       Auswahl der Schrifttypen:       I 
    I                                       I 
    I   s ... schmal (17 Zeichen pro Zoll)  I 
    I   e ... elite  (12 Zeichen pro Zoll)  I 
    I   p ... pica   (10 Zeichen pro Zoll)  I 
    I   l ... letter (Proportionalschrift)  I 
    I   g ... groß   ( 5 Zeichen pro Zoll)  I 
    I                                       I 
    I schmal   elite   pica   letter   groß I 
    I                                       I 
    +---------------------------------------+ 
 
Die Prozedur 'menualternative' besitzt insgesamt 5 Parameter. Wie Ihnen schon von
von anderen Prozeduren bekannt ist, wird mit dem vorletzten (4.) Parameter die
Position innerhalb des Menubildschirms bestimmt - hier also die Plazierung in die
Mitte des Menubildschirms. 
Mit dem 5. Parameter können Sie noch festlegen, ob der Benutzer die Möglichkeit
haben soll, die Alternativauswahl mit <ESC><h> abzubrechen (bei TRUE, wie im
Beispiel) oder eben nicht. 
 
Mit dem 1. Parameter wird der Informationstext festgelegt, der auf dem Bildschirm
innerhalb der Box erscheinen soll. Für die Funktion der Alternativauswahl ist die­
ser Inhalt völlig belanglos - er dient ausschließlich der Information des Benutzers.
Der Text kann - wie hier - z.B. durch eine Einteilung in Zeilen gestaltet werden
(durch den Code "13"). 
Der Text in den Zeilen sollte nicht zu breit sein, da er noch in eine Box innerhalb des
Menubildschirms hineinpassen muß! Damit es auch bei geschachtelten Menus zu
keinen Problemen kommt, sollte eine Zeile nicht breiter als 64 Zeichen sein. Aber
keine Angst: Sie können gs-DIALOG durch zu lange Texte nicht durcheinanderbrin­
gen - wenn Ihr Text zu breit ist, wird er rigoros abgeschnitten und einfach nicht
angezeigt. 
 
Mit dem 2. Parameter übergeben Sie die Auswahlliste, die in der letzten Zeile der Box
dargestellt wird. Hier dürfen insgesamt bis zu 10 Alternativen angegeben werden -
bedenken Sie dabei aber unbedingt, daß diese Liste ebenfalls nicht zu lang werden
darf (ebenfalls höchstens 64 Zeichen). 
Zwischen jeder von Ihnen notierten Alternative muß zur Kennung der Code "13"
eingetragen werden - wie oben im Beispiel gezeigt. Da nachher in der Box zwischen
den einzelnen Alternativen je drei Leerzeichen eingefügt werden, können Sie sich
immer an der von Ihnen übergebenen Zeichenkette orientieren. Hat Ihre Auswahlliste
nicht mehr als 64 Zeichen, dann ist sie in jedem Falle auf dem Bildschirm darstell­
bar. 
Über diese Auswahlliste erfolgt normalerweise die Auswahl. Mit den Cursortasten links
und rechts kann der Benutzer auf die gewünschte Alternative positionieren (auf dem
Bildschirm invers dargestellt) und dann die <RETURN>-Taste tippen. 
Die Prozedur 'menualternative liefert dann einen Zahlenwert, nämlich die Position
der gewählten Alternative in der als 2. Parameter übergebenen Liste (wird in unse­
rem Beispiel die Alternative 'letter' gewählt, so liefert die Prozedur den Wert 4).
Haben Sie den Abbruch durch <ESC><h> zugelassen (5. Parameter), so wird im
Falle eines solchen Abbruchs der Wert '0' geliefert. 
 
Mit dem 3. Parameter können Sie noch festlegen, über welche Tasten eine Auswahl
erfolgen soll. Wenn Sie hier niltext ("") angeben, ist eine Auswahl über die Tasten
nicht möglich. Im Beispiel haben wir hier die Anfangsbuchstaben der im Text ge­
nannten Schrifttypen gewählt und als Eingabe sowohl Klein- als auch Großbuchsta­
ben gestattet. Erfolgt nun die Auswahl über das Tippen einer zugelassenen Taste,
dann wird Ihre Position in der im 3. Parameter übergebenen Zeichenkette ermittelt
und der Wert '100' dazuaddiert. Tippt in unserem Falle der Benutzer die Taste
<L>, wird der Wert '109' geliefert. 
 
Es erfolgt übrigens kein Hinweis in der Fußzeile, ob eine Auswahl über das Tippen
einer Taste möglich ist! Wenn Sie von der Möglichkeit Gebrauch machen, sollten Sie
dieses durch die Gestaltung Ihres Informationstextes andeuten - wie wir es im Bei­
spiel auch getan haben. 
 
 
#ib#5.8  Die Menunotiz#ie# ('#ib#write menunotice#ie#', '#ib#erasemenunotice#ie#') 
 
Innerhalb des Menus können Sie für den Benutzer auch eine Notiz ablegen. Wir
machen z.B. bei der Archivverwaltung Gebrauch davon. Dort wird nämlich ständig
angezeigt, mit welcher Task kommuniziert wird und - sofern es sich um einen Ar­
chivmanager handelt - wie die (angemeldete) Diskette heißt. Wenn Sie z.B. dem
Benutzer das aktuelle Datum im Menu anzeigen wollen, insertieren Sie die folgende
Prozedur: 
 
 
PROC datum anzeigen: 
  write menunotice ("Datum: " + date, 4) 
END PROC datum anzeigen; 
 
 
Die Prozedur 'write menunotice' besitzt zwei Parameter. Mit dem ersten Parameter
wird der Text übergeben, der in der Box ausgegeben werden soll. Er unterliegt eben­
falls der gs-DIALOG-Syntax für Texte. Durch den zweiten Parameter wird wieder die
Position innerhalb des Menus festgelegt (hier rechts unten: Position 4). 
 
Wenn Sie jetzt in Ihrer Menukarte die Prozedur 'oberbegriff  ("Bearbeiten")' in fol­
gender Weise abändern: 
 
 
   oberbegriff ("Bearbeiten", "datum anzeigen", "erase menunotice") 
 
 
dann wird jedesmal, wenn das Pull-Down-Menu unter dem Oberbegriff 'Bearbeiten'
aufgefaltet wird, unten rechts (Position 4) das aktuelle Datum in einer Box ange­
zeigt. Diese Notiz verschwindet, wenn in ein anderes Pull-Down-Menu gewechselt
wird. 
 
Auf den ersten Eindruck scheinen die Prozeduren 'write menunotice' und 'menuinfo'
gleich zu sein - das ist aber nicht der Fall: Bei 'menuinfo' wird der Text in einer Box
ausgegeben und so lange gewartet, bis der Benutzer eine Taste getippt hat (oder die
angegebene Zeit verstrichen ist). Bei 'write menunotice' wird ebenfalls ein Text in
einer Box auf den Menubildschirm geschrieben. Diese Box bleibt aber über längere
Zeit bestehen (auf Erscheinen und Verschwinden kann der Benutzer selbst keinen
Einfluß nehmen!) - und zwar solange, bis die Notiz gelöscht wird (mit 'erase menu­
notice'; in unserem Beispiel, wenn das Pull-Down-Menu gewechselt wird) oder durch
ein neues 'write menunotice' überschrieben wird. In einem Menu kann nämlich zu
einem Zeitpunkt nur eine Menunotiz abgelegt werden. 
Wenn der Bildschirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die
Menunotiz ebenfalls ständig mitaufgefrischt, und auch, wenn Sie den Befehl 'regene­
rate menuscreen' oder 'refresh submenu' geben. 
 
 
#ib#5.9  Fußzeilen im Menu#ie# ('#ib#menufootnote#ie#', '#ib#oldmenufootnote#ie#') 
 
In den Fußzeilen innerhalb des Menus werden dem Benutzer Bedienhinweise ange­
zeigt. Die Fußzeile wird aber auch dazu benutzt, den Benutzer über Prozesse zu
informieren, die im Hintergrund ablaufen - erst recht dann, wenn Sie einige Zeit in
Anspruch nehmen. Sie zeigen dem Benutzer an, daß er nicht "unruhig" zu werden
braucht, sondern das System "mit sich" beschäftigt ist. 
Im allgemeinen braucht sich der Programmierer um diese Fußnoten nicht zu küm­
mern, denn sie werden von den einzelnen Komponenten des Systems automatisch
gesetzt. Wir können aber z.B. dem Benutzer einen Hinweis geben, wenn unter dem
Menupunkt 'Verzeichnis' eine Liste erstellt wird. Die Prozedur könnte dann folgen­
dermaßen notiert werden: 
 
 
PROC verzeichnis ausgeben: 
  menufootnote ("Bitte warten... Ich erstelle eine Dateiliste"); 
  FILE VAR f :: sequential file (output, "Dateiliste"); 
  list (f); modify (f); 
  old menufootnote; 
  entferne eigenen namen; 
  zeige liste an; 
  forget ("Dateiliste", quiet). 
 
  entferne eigenen namen: 
    TEXT VAR zeile :: ""; INT VAR i; 
    FOR i FROM lines (f) DOWNTO 1 REP 
      to line (f, i); 
      read record (f, zeile); 
    UNTIL pos (zeile, "Dateiliste") > 0 PER; 
    delete record (f). 
 
  zeige liste an: 
    to line (f, 1); 
    menuwindowshow (f)         (* Sehen Sie Kapitel 5.11.1*) 
END PROC verzeichnis ausgeben; 
 
 
Beachten Sie, daß der Text nicht länger als 64 Zeichen ist, damit er auch bei ge­
schachtelten Menus vollständig ausgegeben werden kann. Sollte der Text dennoch zu
lang sein, wird er vom System auf die entsprechende Länge gestutzt. 
Haben Sie mit 'menufootnote' eine eigene Fußzeile gesetzt, so können Sie die da­
durch gelöschte Zeile durch den Befehl 'old menufootnote' wieder hinschreiben.
Ansonsten wird Ihre Fußzeile von der nächsten automatisch (d.h. vom System) ge­
setzten Fußnote überschrieben. In dem obigen Beispiel hätten Sie also gut auf den
Befehl 'old menufootnote' verzichten können. 
 
Durch 'old menufootnote' wird die letzte Fußnote, die automatisch vom System ge­
setzt wurde, reproduziert. Der in der obigen Prozedur verwendete Befehl 'menuwin­
dowshow' ist bisher noch nicht erläutert. Sehen Sie dazu bitte das Kapitel 5.11.1. 
 
 
#ib#5.10  Wiederherstellung des Menubildschirms#ie# ('#ib#regenerate
      menuscreen#ie#','#ib#refresh submenu#ie#') 
 
Der Befehl 'regenerate menuscreen' ist Ihnen schon aus diversen Beispielprogram­
men dieses Handbuches bekannt. Ist der Menubildschirm "kaputtgeschrieben" oder
der Bildschirm für andere Zwecke benutzt worden, so läßt sich durch diesen Befehl
der Menubildschirm in seinem letzten Zustand reproduzieren (auch bei geschachtel­
ten Menus!). Durch den Befehl wird der Bildschirm gelöscht und komplett neu
aufgebaut. 
 
Ein vollständiger Bildschirmaufbau ist aber gar nicht immer nötig. Wenn Sie sicher
sind, daß durch Ihre Operationen nur der Bereich zwischen den beiden durchgezo­
genen Linien, die die Kopf- und Fußzeile abtrennen, betroffen ist, brauchen Sie nur
den Befehl 'refresh submenu' zu geben. Hierdurch wird das aktuelle Pull-Down-
Menu neu aufgebaut und - sofern gesetzt - die Menunotiz. Wenn möglich, ist er dem
Befehl 'regenerate menuscreen vorzuziehen, da hierfür weniger Zeit benötigt wird
und weniger "Unruhe" auf dem Bildschirm entsteht. 
Sorgen Sie aber unbedingt dafür, daß der von Ihnen benutzte Bildschirmbereich
zuvor "gereinigt" wird, denn das besorgt 'refresh subnmenu' nicht! 
 
 
#ib#5.11  Arbeiten im Menufenster#ie# 
 
Neben den vorab aufgezeigten Möglichkeiten können Sie innerhalb des Menus auch
noch ein Fenster öffnen. Innerhalb dieses Fensters stehen Ihnen alle Möglichkei­
ten zur Verfügung, die Sie auch sonst zum Beschreiben des gesamten Bildschirms
haben - und noch einiges mehr. 
Wir machen z.B. intensiv beim Archivhandling Gebrauch davon. So werden Ihnen
Verzeichnisse angezeigt, Sie können verfolgen, wie die einzelnen Dateien vom Archiv
geholt werden oder dorthin geschrieben werden und einiges mehr. In diesem Kapitel
wollen wir Ihnen die Möglichkeiten aufzeigen, die Sie innerhalb des Menufensters
haben. 
 
Auf die Größe des Menufensters haben Sie keinen Einfluß, sie wird vom System ge­
setzt ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes
Menu: 71 Zeichen breit und 16 Zeichen hoch). Hierdurch ist sichergestellt, daß alle
Operationen auch in geschachtelten Menus ohne Probleme ausführbar sind. Alle
Prozeduren, die sich auf Aktionen im Menufenster beziehen, enthalten die Silbe
'menuwindow'. 
Sie können mit den hier beschriebenen Prozeduren ähnlich arbeiten, wie mit den
entsprechenden Prozeduren ohne den Wortbestandteil 'menuwindow' auf dem
ganzen Bildschirm. Allerdings gibt es einige Unterschiede, auf die Sie achten sollten! 
 
 
5.11.1  Datei anzeigen/editieren 
        ('#ib#menuwindowshow#ie#', '#ib#menuwindowedit#ie#') 
 
Von der Prozedur 'menuwindowshow (FILE VAR f)' haben wir im letzten Kapitel
schon Gebrauch gemacht, um das Verzeichnis der Dateien in der Task innerhalb des
Menus anzuzeigen. Die Prozedur gibt es in zwei Versionen mit je einem Parameter. 
Einmal kann, wie im vorigen Kapitel, ein FILE angegeben werden, andererseits kann
auch der Name der anzuzeigenden Datei als Text übergeben werden ('menuwindow­
show (TEXT CONST dateiliste)'). Durch den Befehl wird innerhalb des Menus ein
umrandetes Fenster geöffnet, in der das angegebene File/die Datei angezeigt wird. Bei
'menuwindowshow' kann die Datei nur eingesehen, nicht aber schreibend verändert
werden. 
Die Prozedur 'menuwindowedit' gibt es ebenfalls in den zwei Ausprägungen. Sie
verhält sich zur vorgenannten identisch - nur kann hier auch die Datei schreibend
verändert werden. 
 
 
5.11.2  Menufenster öffnen/anzeigen ('#ib#show menuwindow#ie#') 
 
Wenn Sie eigene Operationen in einem Fenster im Menu ausführen lassen wollen,
muß dieses Fenster zunächst auf dem Bildschirm angezeigt werden. Durch den
Befehl 'show menuwindow' wird ein entsprechender Rahmen innerhalb des Menus
ausgegeben und der Bereich innerhalb dieses Rahmens (das Fenster) gelöscht. 
Auf die Größe des Fensters innerhalb des aktuellen Menus können Sie - wie bereits
eingangs gesagt - keinen Einfluß nehmen. 
Zu einem Zeitpunkt kann immer nur ein Menufenster geöffnet sein, da das Fenster
schon den größtmöglichen sinnvollen Bereich des aktuellen Menus belegt. Ein er­
neutes 'show menuwindow' hätte die gleiche Wirkung wie das nachfolgend beschrie­
bene 'menuwindowpage' - nur wird hier zusätzlich noch der Rahmen des Fensters
mitausgegeben. 
 
 
5.11.3  Menufenster löschen (putzen) ('#ib#menuwindowpage#ie#') 
 
Durch den Befehl 'menuwindowpage' wird das Fenster innerhalb des aktuellen
Menus gelöscht; der Rahmen des Fensters bleibt bestehen, da er nicht mit zum ei­
gentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm nicht(!)
rekonstruiert! 
 
 
5.11.4  Positionierungen im Menufenster 
        ('#ib#menuwindowline#ie#', '#ib#menuwindowcursor#ie#') 
 
Mit 'menuwindowline' wird, wie auch sonst auf dem Bildschirm, an den Anfang der
nächsten Zeile positioniert. Diesen Befehl gibt es, ebenso wie den Befehl 'line' (der
auf dem Gesamtbildschirm operiert) ohne und mit einem Parameter. Durch 'menu­
windowline (3)' wird an den Anfang der "drittnächsten" Zeile innerhalb des Menu­
fensters positioniert. 
 
Aber Achtung! Der Befehl 'menuwindowline' weist einen deutlichen Unterschied zum
Ihnen bekannten Befehl 'line' auf. Wird nämlich die untere Fenstergrenze überschrit­
ten, so rollt (scrollt) der Bildschirm nicht um die entsprechenden Zeilen nach oben,
wie Sie es von 'line' gewohnt sind - statt dessen wird der Fensterinhalt gelöscht und
wieder oben im Fenster zu schreiben begonnen. Es erscheint, als ob auf ein neues
Fenster positioniert würde. 
Innerhalb des Fensters können Sie auch den Cursor positionieren, wie Sie es vom
Bildschirm gewohnt sind - allerdings nur innerhalb der aktuell gültigen Grenzen. In
einem Menu ist das Fenster 77 Zeichen breit und 20 Zeichen hoch; in einem ge­
schachtelten Menu 71 Zeichen breit und 16 Zeichen hoch. 
Wird außerhalb des aktuellen Menufensters positioniert, wird das Fenster gelöscht
und die Fensterposition (1, 1) angenommen. 
 
 
5.11.5  Informationen über die aktuelle Menu-Fenster position ('#ib#get
menuwindowcursor#ie#', '#ib#remaining menuwindowlines#ie#') 
 
Mit der Prozedur 'get menuwindowcursor (INT VAR spalte, zeile)' kann die aktuelle
Position des Cursors innerhalb des Menufensters erfragt werden. Die Prozedur hat
zwei Parameter, die als 'INT VAR' deklariert sein müssen. Der erste Parameter enthält
anschließend die aktuelle Spalte, der zweite die aktuelle Zeile. 
 
Mit der werteliefernden Prozedur 'remaining menuwindowlines' kann die Anzahl der
noch verbleibenden Zeilen innerhalb des aktuellen Menufensters erfragt werden. Die
Prozedur wurde deshalb zur Verfügung gestellt, weil der Fensterinhalt - im Gegensatz
zum normalen Bildschirm - nicht gescrollt werden kann. So können Sie sich vorab
informieren, ob der Text, der von Ihnen ausgegeben werden soll, noch Platz findet, so
daß während der Ausgabe nicht plötzlich der Fensterinhalt gelöscht wird. 
 
 
5.11.6  Ausgabe/Eingabe innerhalb des Menufensters 
        ('#ib#menuwindowout#ie#', '#ib#menuwindowget#ie#', 
         '#ib#menuwindoweditget#ie#', '#ib#menuwindowyes#ie#', 
         '#ib#menuwindowno#ie#') 
 
Innerhalb des Menufensters können mit der Prozedur 'menuwindowout' Texte ausge­
geben werden - die Prozedur hat einen TEXT-Parameter. Sollen INTEGER- oder REAL-
Werte ausgegeben werden, so müssen diese Werte zuerst in Texte konvertiert werden. 
Bitte beachten Sie unbedingt, daß innerhalb des Fensters nicht gescrollt wird und
auch kein Zeilenumbruch stattfindet! Ist ein Text länger als die verbleibende Restzei­
le, so wird der Text bis zum Fensterende ausgegeben und die Ausgabe am Anfang der
nächsten Zeile fortgesetzt. So ist sichergestellt, daß in keinem Falle die Fenstergren­
zen überschritten werden. 
Sobald die letzte Position des aktuellen Menufensters beschrieben ist (unten rechts in
der Fensterecke), wird der Fensterinhalt komplett gelöscht und die Ausgabe in der
ersten Zeile des "neuen" Fensters fortgesetzt. Auf Zeilenumbruch und Scrolling wurde
verzichtet, da der Realisierungsaufwand dafür zu hoch gewesen wäre. 
 
Mit der Prozedur 'menuwindowget (TEXT VAR text)' können Sie auch Texte innerhalb
des Menufensters einlesen - INTEGER-/ REAL-Werte müssen ggf. von Hand konvertiert
werde. Die Eingabe wird durch <RETURN> abgeschlossen. Es muß mindestens ein
Zeichen (ungleich Leerzeichen) eingegeben werden. Von der Eingabe werden die
führenden Leerzeichen abgeschnitten. 
Ist der einzugebende Text länger als die noch verbleibende Restzeile, so wird der Text
in der Restzeile gescrollt. Sind in der aktuellen Zeile weniger als 7 Zeichen für die
Eingabe vorhanden, so wird automatisch für die Eingabe an den Anfang der nächsten
Zeile positioniert. 
 
Ab gs-DIALOG-Version 1.1 steht auch die Prozedur 'menuwindoweditget (TEXT VAR
text)' zur Verfügung, durch die ein Text zum Editieren vorgegeben werden kann. Es
ist allerdings darauf zu achten, daß der Text in jedem Falle initialisiert wird! 
 
Die beiden Prozeduren 'menuwindowyes' und 'menuwindowno' ähneln den Ihnen
bekannten Prozeduren 'yes' und 'no'. Sie operieren nur auf dem Menufenster. Be­
denken Sie aber bitte, daß, wenn bei der Ausgabe des Textes die Fenstergrenze über­
schritten wird, der Resttext in der nächsten Zeile ausgegeben wird. Wird dabei sogar
die untere Fenstergrenze überschritten, so wird der komplette Fensterinhalt gelöscht
und die Ausgabe in der linken oberen Ecke des "neuen Fensters" fortgesetzt! 
 
 
5.11.7  Weiter Prozeduren  ('#ib#menuwindowcenter#ie#', 
                            '#ib#menuwindowstop#ie#') 
 
Es werden noch zwei weitere Prozeduren für das Menufenster zur Verfügung gestellt,
die bei der Programmentwicklung ganz nützlich sein können. 
Mit 'menuwindowcenter (TEXT CONST text)' werden vor und hinter dem übergebe­
nen Text so viele Leerzeichen angefügt, daß der Text zentriert in der Menufenster-Zei­
le ausgegeben wird. Bevor Sie den Text mit 'menuwindowout' ausgeben, müssen Sie
an den Anfang einer Zeile positionieren, denn die Anzahl der vorangestellten Blanks
wird unter Annahme dieser Zeilenposition ermittelt! Innerhalb der Zeile werden ggf.
vorhandene Texte überschrieben. 
 
Durch die Prozedur 'menuwindowstop' wird an den Anfang der übernächsten Zeile
positionert und der Text 'Zum Weitermachen bitte irgendeine Taste tippen!' ausgege­
ben. Danach wird so lange gewartet, bis eine Taste getippt wird. Mit 'menuwindow­
stop (INT CONST zeilenzahl) kann auch noch die Anzahl der Zeilen bestimmt wer­
den, die vorwärtspositioniert werden soll (Standard: 2 Zeilen). 
 
 
#ib#5.12  Festlegung der Boxpositionen innerhalb des Menus#ie# 
 
In vielen Fällen kann der Programmierer noch entscheiden, an welcher Position
innerhalb des Menus die Box erscheinen soll (z. B. bei 'menuanswer', 'menuinfo',
'menuyes', 'menuno', 'menunotice' etc.). Die Positionen sind von 1 bis 5 durchnu­
meriert und haben folgende Bedeutung: 
 
+----------------------------------------+ 
I                                        I 
+----------------------------------------+ 
I                                        I 
I   +-----+                   +-----+    I 
I   I  1  I                   I  2  I    I 
I   +-----+                   +-----+    I 
I                                        I 
I                +-----+                 I 
I                I  5  I                 I 
I                +-----+                 I 
I                                        I 
I   +-----+                   +-----+    I 
I   I  3  I                   I  4  I    I 
I   +-----+                   +-----+    I 
I                                        I 
+----------------------------------------+ 
I                                        I 
+----------------------------------------+ 
#page# 
#ib#5.13 gs-DIALOG-Syntax (Regeln zur Erstellung von Texten)#ie# 
 
Werden Texte als Parameter übergeben, die in einer Box ausgegeben werden sollen,
so kann dieser Text durch Einfügen von Steuerzeichen noch gestaltet werden, z.B.
kann der Programmierer so den Zeilenaufbau bestimmen. 
Das System analysiert den eingegebenen Text. Jedesmal, wenn innerhalb des Textes
der Code "13" erscheint, wird innerhalb der Box auf den nächsten Zeilenanfang
positioniert. So ist eine Einteilung eines Textes in Zeilen leicht möglich. Soll eine
Leerzeile eingefügt werden, so geben Sie einfach zweimal den Code "13" ("13""13"). 
Bei der Textanalyse wird die jeweilige Zeilenlänge vermerkt. Die Box wird vom System
gerade so breit gewählt, daß die längste vorkommende "Zeile" im Text gerade noch in
die Box paßt. 
Aber Vorsicht! Die jeweilige Box kann innerhalb des Menus nur eine Maximalgröße
annehmen (64 Zeichen breit und 14 Zeilen hoch). Wird von einer "Zeile" diese
Maximalgröße überschritten, so wird die Zeile abgeschnitten und nur bis zur Maxi­
malbreite der Box ausgegeben. 
 
Ein Text für eine solche Box könnte z.B. so aussehen: 
 
 
menuinfo ("  Informationstexte  "13"      sind meist"13"       zu
lang!") 
 
 
das ergibt folgende Ausgabe in der Box: 
 
 
           +-----------------------+ 
           I                       I 
           I   Informationstexte   I 
           I       sind meist      I 
           I        zu lang        I 
           I                       I 
           +-----------------------+ 
 
Es ist auch möglich, in solchen Texten Textpassagen invers darzustellen. Dazu wer­
den in den Text die Codes zum Ein- ("15") und Ausschalten ("14") der Markierung
eingefügt. Solche markierten Textpassagen dürfen aber nicht über interne Zeilen­
grenzen (Code "13") hinausgehen. Sie müßten dann am Zeilenende aus- und am
nächsten Zeilenanfang wiedereingeschaltet werden. 
Soll in der obigen Box das Wort 'Informationstexte' invers dargestellt werden, so wäre
z.B. folgendes Kommando zu geben: 
 
 
menuinfo (" "15"Informationstexte"14" "13"" + 
          "      sind meist"13"       zu lang!") 
 
 
#ib#5.14  Thesaurushandling#ie# 
 
Neben den allgemein zur Verfügung gestellten Thesaurusoperationen stellt
gs-DIALOG einige weitere bereit. Mit der Prozedur 'THESAURUS PROC #ib#infix namen#ie#
(THESAURUS CONST thes, TEXT CONST infix)' werden aus allen Dateinamen des
angegebenen Thesaurus die herausgefiltert, die den Wortbestandteil 'infix' enthalten -
und zwar gleichgültig, an welcher Position! Die herausgefilterten Dateinamen werden
in einem Thesaurus geliefert. Im Programmsystem 'gs-Herbert und Robbi' mach­
en wir z.B. Gebrauch davon, wenn wir nur die Landschaften der eigenen Task zur
Auswahl anbieten wollen: 
 
 
THESAURUS VAR thes :: infix namen (ALL myself, "Flaeche:") 
 
 
Daneben gibt es eine ähnliche Prozedur, mit der man die Dateien eines bestimmten
Dateityps herausfiltern kann. Mit 
 
 
THESAURUS VAR thes :: infix namen (ALL myself, 1003) 
 
 
werden alle Dateien mit dem Typ '1003' (normale Textfiles) herausgefiltert. Neben
den beiden gibt es auch noch eine Prozedur, die beide Fälle miteinander koppelt: 
 
 
THESAURUS VAR thes :: infix namen (ALL myself, "gs-MENUKARTE:", 1954) 
 
 
Mit der folgenden Prozedur: 
 
 
THESAURUS VAR thes :: #ib#ohne praefix#ie# (ALL myself, "Flaeche:") 
 
 
wird aus den Dateinamen im angegebenen Thesaurus jeweils der führende Wortbe­
standteil entfernt. Wir machen z.B. in gs-Herbert und Robbi davon Gebrauch, um
die Landschaften/Arbeitsfelder anbieten zu können, ohne jeweils den Wortbestandteil
'Flaeche:' miterscheinen zu lassen. 
 
Ganz nützlich ist auch noch die folgende Informationsprozedur '#ib#not empty#ie#
(THESAURUS CONST thes)', mit der man z.B. feststellen kann, ob eine Auswahl ohne
Ankreuzen oder mit <ESC><h> abgebrochen wurde: 
 
 
 
PROC zeilen formatieren: 
  TEXT CONST kopf          :: "Textdateien zeilenweise formatieren", 
             hinweis       :: "Bitte gewünschte Dateien ankreuzen"; 
  THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis,
  FALSE); 
 
  IF not empty (dateinamen) 
     THEN cursor on; 
          formatiere dateien; 
          cursor off; 
  FI; 
  regenerate menuscreen. 
 
  formatiere dateien: 
    INT VAR zaehler; 
    FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP 
      IF name (dateinamen, zaehler) <> "" 
         THEN lineform (name (dateinamen, zaehler)) 
      FI 
    PER 
END PROC zeilen formatieren; 
 
 
 
#ib#5.15  Aktivieren und Deaktivieren von Menupunkten#ie# 
 
Daß Verarbeitungsfunktionen aktiviert und deaktiviert werden können, haben Sie
schon in unserem Archiv-Pull-Down-Menu gesehen. Deaktivierte Menupunkte sind
durch ein vorgestelltes '-'-Zeichen gekennzeichnet; diese Menufunktionen werden
übersprungen, wenn Sie versuchen, darauf zu positionieren. 
 
Zur Aktivierung und Deaktivierung von Menupunkten stehen die Prozeduren '#ib#activate#ie#
(TEXT CONST menupunktname)' und '#ib#deactivate#ie# (TEXT CONST menupunktname)'
zur Verfügung. Zu beachten ist, daß diese Prozeduren nicht ständig aufrufbar sind -
der jeweils angegebene 'menupunktname' muß sich nämlich auf das aktuelle Pull-
Down-Menu beziehen! Als Menupunktname muß jeweils der Name angegeben wer­
den, der bei der entsprechenden Menufunktion als 2. Parameter übergeben wurde.
Ist der angegebene 'menupunktname' im aktuellen Pull-Down-Menu nicht enthalten,
so wird die Anweisung ignoriert! 
 
Auch bei den Prozeduren' activate (INT CONST punktnummer)' und 'deactivate (INT
CONST punktnummer)' gilt diese Einschränkung. Die beiden Prozeduren arbeiten
schneller als die eben aufgezeigten, denn es muß im aktuellen Pull-Down-menu
nicht mehr nach der jeweiligen Position gesucht werden. Die Positionen werden von
oben nach unten durchgezählt. Beachten Sie aber unbedingt, daß die Trennlinien
mitgezählt werden müssen! 
Die Prozeduren "zeigen nur dann Wirkung", wenn sie von einer Verarbeitungsfunk­
tion des aktuell entfalteten Pull-Down-Menus aus aufgerufen werden (das geschieht
im Archivmenu z.B. aus den beiden Menufunktionen 'Reservieren' und 'Initialisieren'
heraus) oder wenn Sie beim Einstieg in ein Pull-Down-Menu bzw. beim Ausstieg
daraus aufgerufen werden; d.h. aus einer Prozedur heraus, die bei 'oberbegriff' als
2./3. Parameter in das Menukarten-Generierungsprogramm eingetragen ist. Beim
Archiv-Pull-Down-Menu besorgt das die Prozedur 'menu archiv grundeinstellung'
(sehen Sie dazu auch Kapitel 6.1).