Komfortable Menüsteuerung
Mit diesem Basic-Unterprogramm läßt sich durch einfache Parameterübergabe eine Menü-Zeile frei definieren, mit der Sie auf Tastendruck bis zu 19 weitere Routinen anwählen können.
Das zirka 800 Byte lange Unterprogramm (ohne REM) erspart bei der Erstellung eines menügesteuerten Programms die immer wiederkehrenden Abfragen nach gedrückten oder nichtgedrückten Tasten.
Man ruft im laufenden Programm nur das Unterprogramm (Listing) auf und die gewünschte Menüzeile erscheint zentriert in der vorletzten Zeile des Bildschirms.
Mit den Cursor-Tasten (links/rechts) verschiebt man ein revers erleuchtetes Feld, das auf das Menü-Wort positioniert werden kann. Mit RETURN übernimmt man das Menü-Wort und verläßt das Unterprogramm. Um mehrere Menüs zu erstellen, sind die Angaben aller Menüs am Anfang des Hauptprogramms den Variablen d$(1), d$(2) undsoweiterzuzuordnen.
Im laufenden Programm wird nun das Unterprogramm folgendermaßen aufgerufen:
AN=3:az=4:GOSUB 1000
AN=Anfang des Menü-Wortes (hier drittes Menü-Wort)
AZ=Anzahl der Menü-Worte (hier vier Worte)
Es werden also die Strings d$(3) bis d$(4) ausgegeben. Das Unterprogramm übergibt den Parameter kk in Abhängigkeit des gewählten Menü-Wortes und der Position der Menü-Zeile. Hat man also zum Beispiel das dritte Menü-Wort von links ausgewählt, so wird kk=3 übergeben.
Nach dem GOSUB ist eine Weiterbehandlung mit
ON kk GOSUB 11,22,33,44,…
am sinnvollsten.
Man erkennt sofort, welche Vorteile das Programm hat. Änderungen können sehr einfach durchgeführt werden und im laufenden Programm sind nur zwei Zeilen nötig, um eine Verzweigung zu bewirken.
Anmerkung: Die Menü-Zeile sollte nicht mehr als 38 Zeichen haben, sonst werden die Menü-Worte jeweils um ein Zeichen gekürzt dargestellt. Bei mehr als 38 Zeichen plus Anzahl der Menü-Worte erscheint eine Fehlermeldung.
(M. Schacht/ah)
2 rem ****** menue-demo ****** 4 poke53280,0:poke53281,0:printchr$(147) 5 rem * * * menue-worte einlesen * * * 6 am=12:dimd$(am+1):dimaa(am+1):rem am=max. anzahl der worte 7 i=1 8 readd$(i):d$(i)=chr$(32)+d$(i)+chr$(32):ifd$(i)<>" _ "theni=i+1:goto8 9 datastart,help,goto,renum,list 10 dataold,find,ctrl,clr,new,run,ende,_ 13 rem * * * * * * * * * * * * * * * * 14 poke214,15:print:printtab(10)"<= crsr => und return" 15 rem beispiel 16 an=1:az=5:gosub1000:rem 1.menue 17 onkkgosub27,27,27,27,27 18 : 19 an=6:az=7:gosub1000:rem 2.menue 20 onkkgosub27,27,27,27,27,27,30 22 goto16 25 : 26 rem anzeige 27 poke214,15:print:printtab(18)" " 28 poke214,15:print:printtab(10)"gewaehlt:";d$(an+kk-1);"(";kk;")":return 29 : 30 printchr$(147):end 32 : 1000 rem ****************************** 1010 rem **** menue unterprogramm **** 1020 rem ****************************** 1030 rem **** (c) mario schacht **** 1040 rem **** (030)4968872 **** 1050 rem ****************************** 1060 rem **** aufruf (beispiel) **** 1070 rem **** an=1:az=4:gosub1000 **** 1080 rem **** on kk gosub11,22,... **** 1090 rem ****- - - - - - - - - - - **** 1100 rem **** an: anfang mit an-ten**** 1110 rem **** string **** 1120 rem **** az: anzahl der menue-**** 1130 rem **** punkte **** 1140 rem **** kk: 1 bis az wird **** 1150 rem **** uebergeben **** 1160 rem ****************************** 1170 rem **** verwendete variablen **** 1180 rem **** d$(am);aa(am);a$ **** 1190 rem **** am;az;an;al;di;ay;kk **** 1200 rem **** **** 1210 rem ****************************** 1220 al=0 1230 fori=anto(an+az-1):al=al+len(d$(i)):next:rem al=gesamtlaenge 1240 ifal>38+azthenpoke214,22:print:print" menue-worte kuerzen !":return 1250 ifal<39then1290 1260 rem worte kuerzen 1270 di=al-39:fori=anto(an+di):d$(i)=left$(d$(i),len(d$(i))-1):next:al=38 1280 rem menue darstellen 1290 poke214,22:print:printtab((40-al)/2) 1300 fori=anto(an+az-1) 1310 printchr$(18)chr$(30);d$(i);:next 1330 rem anzeige 1340 aa(an)=(40-al)/2:rem erste stelle 1350 fori=anto(an+az-2) 1360 aa(i+1)=aa(i)+len(d$(i)):next 1380 rem startposition 1390 kk=int(az/2):fl=0:fr=158:gosub1550 1400 rem abfrage 1410 geta$:ifa$=""then1410 1420 ifa$<>chr$(29)anda$<>chr$(157)anda$<>chr$(13)then1410 1430 ifa$=chr$(29)thenkk=kk+1:fl=-1:fr=30:gosub1550:ifkk=azthenkk=0 1440 ifa$=chr$(157)thenkk=kk-1:fl=1:fr=30:gosub1550:ifkk<0thenkk=az-1 1450 fl=0:fr=158:gosub1550 1460 ifa$<>chr$(13)then1410 1470 poke214,22:print:print" ":rem menue loeschen 1500 kk=kk+1:return:rem ruecksprung mit parameter kk 1540 rem anzeige gelb 1550 poke214,22:print:printtab(aa(kk+an+fl))chr$(18)chr$(fr);d$(kk+an+fl):return