 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nullchecker
Anmeldungsdatum: 03.08.2013 Beiträge: 34
|
Verfasst am: 03.08.2013, 19:55 Titel: Anfängerproblem mit Menüerstellung |
|
|
Hallo, bin FB Anfänger, habe früher mal auf dem C64 in Basic programmiert.
Da es ja in FB kein GOTO oder GOSUB gibt stehe ich vor einem kleinen Problem.
Ich möchte von einem Hauptmenü aus in ein anderes springen, und von dort aus entweder zurück ins Hauptmenü oder in ein anderes.
Mein Testprogramm (Hauptmenü, 2 Untermenüs) läuft leider nicht.
Für euere Hilfe wäre ich sehr Dankbar.
Hier das Programm:
DECLARE SUB Hauptmenue (x AS INTEGER)
DECLARE SUB m1 (x AS INTEGER)
DECLARE SUB m2 (x AS INTEGER)
Do
Sub Hauptmenue (x As INTEGER)
Input"Welches Menue wollen Sie", x
If x= 1 then Sub m1
If x= 2 then Sub m2
If x> 2 then Print"Falsche Eingabe"
Sleep
SUB m1 (x AS INTEGER)
Print"Menue 1 gewählt"
x= 0
Print"Hauptmenü = Taste 1"
Print
Print"Menü 2 = Taste 2"
Input x
If x= 1 then Hauptmenue
If x= 2 then m2
If x> 2 then Print"Falsche Eingabe"
Sleep
SUB m2 (x AS INTEGER)
Do
Print"Menue 2 gewählt"
x= 0
Print"Hauptmenü = Taste 0"
Print
Print"Menü 1 = Taste 1"
Input x
If x= 0 then Hauptmenue
If x= 1 then m1
If x> 1 then Print"Falsche Eingabe"
Sleep
Loop
End |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 03.08.2013, 20:30 Titel: |
|
|
SUB ist nicht zu verwechseln mit einer GOTO-Marke! Es ist vielmehr ein Programmblock für ein Unterprogramm, in das du hineinspringen und dann nach Beendigung wieder zurückspringen kannst.
Code: | DIM as Integer eingabe
DECLARE SUB m1
DECLARE SUB m2
DO ' Hauptmenü
Input "Welches Menue wollen Sie? (0 zum Beenden) "; eingabe
If eingabe= 1 then m1 ' springe ins Untermenue 1
If eingabe= 2 then m2 ' springe ins Untermenue 2
If eingabe > 2 then Print "Falsche Eingabe"
LOOP UNTIL eingabe = 0
Sleep
SUB m1 ' das ist jetzt Untermenue 1
Print "Menue 1 gewählt"
Print "Zurueck zum Hauptmenue durch Tastendruck"
SLEEP
' Ende der SUB - springe zurück
END SUB
SUB m2 ' dasselbe mit Menue 2
' ...
END SUB |
Um von Menue 1 zu Menue 2 zu springen oder umgekehrt, ist diese Verfahren nicht geeignet. Du würdest damit die Sprungtiefe immer weiter verschachteln (lies dazu mal die Referenzartikel zu SUB und zu Prozeduren sorgfältig durch). Stattdessen könnte man so etwas machen:
Code: | DIM AS INTEGER eingabe = 0
DO
SELECT CASE eingabe
CASE 0 ' Hauptmenue
Input "Welches Menue wollen Sie", eingabe
If eingabe> 2 then
Print "Falsche Eingabe"
eingabe = 0 ' im Hauptmenue bleiben
End If
CASE 1 ' Untermenue 1
' ...
CASE 2 ' Untermenue 2
' ...
END SELECT
LOOP ' Achtung Endlosschleife: Programm wird nie beendet!!
SLEEP |
Ich habe gerade keinen Compiler bei Hand; die Quellcodes wurden nach besten Wissen und Gewissen erstellt, jedoch ohne Garantie auf Korrektheit. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Nullchecker
Anmeldungsdatum: 03.08.2013 Beiträge: 34
|
Verfasst am: 03.08.2013, 22:27 Titel: |
|
|
Erst mal Danke für deine schnelle Antwort.
Ist eine neue Anregung, werde sie morgen mal ausprobieren.
Das eine SUB nur eine Unterroutine ist, ist mir klar.
Deshalb ist mein Problem ja, wie ich ohne GOTO oder GOSUB
gezielt an eine bestimmte Stelle springen kann.
Was die Referenzartikel betrifft, ich raffe sie nicht was mein Problem
betrifft, deshalb wende ich mich ja an euch, um an so einem Beispiel
den Durchblick zu bekommen. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 03.08.2013, 23:48 Titel: |
|
|
GOTO gibt es zwar nach wie vor, es ist jedoch so gut wie immer möglich, auf GOTO zu verzichten, ohne dabei große Verrenkungen machen zu müssen (es gibt tatsächlich nur sehr wenige Fälle, in denen der Einsatz Sinn macht; in allen anderen sollte man darauf verzichten).
Eine Möglichkeit zum Sprung zu bestimmten Stellen ist die erwähnte Anweisung SELECT CASE; sie ist im Prinzip so etwas ähnliches wie ON wert GOTO marke1, marke2, ... Für ein Menü ist sie nahezu ideal. Werden die Menüpunkte und Unterverschachtelungen zu komplex, muss man auch da wieder aufpassen, dass es nicht unübersichtlich wird - möglich wäre noch eine Kombination von SELECT CASE mit SUBs bzw. FUNCTIONs.
Code: | ' **********************************
' HIER FINDET DIE MENUEAUSWAHL STATT
' **********************************
SELECT CASE gewaehlerMenupunkt
CASE 0 ' Hauptmenue
gewaehlterMenupunkt = hauptmenue
CASE 1 ' Menueauswahl 1
gewaehlterMenupunkt = menue1
CASE 2 ' Menueauswahl 2
gewaehlterMenupunkt = menue2
' Aktionen des 1. Menues
CASE 101 ' Auswahl 1 des 1. Menues
namenEingeben ' nur so als Beispiel ...
CASE 102 ' Auswahl 2 des 1. Menues
highscoreAnsehen
' Aktionen des 2. Menues
CASE 201
' ...
END SELECT
' ********************************
' ES FOLGEN DIE EINZELNEN AKTIONEN
' ********************************
FUNCTION hauptmenu AS INTEGER
' Menue darstellen, Auswahl treffen lassen und gewaehlten Menuepunkt zurueckgeben
RETURN gewählterMenuepunkt (sinnvollerweise 1 oder 2)
END FUNCTION
FUNCTION menue1 AS INTEGER
' dasselbe fuer das 1. Untermenue
RETURN gewählterMenuepunkt (einer der Werte 101, 102, ... oder 0)
END FUNCTION
FUNCTION menu2 AS INTEGER
' dasselbe fuer das 2. Untermenue
RETURN gewählterMenuepunkt (einer der Werte 201, 202, ... oder 0)
END FUNCTION
SUB namenEingeben
' hier kann der Benutzer seinen Namen eingeben
END SUB
SUB highscoreAnsehen
' usw ...
END SUB
|
Es werden zwar sowohl bei SELECT CASE als auch bei SUB / FUNCTION ebenfalls intern Sprünge durchgeführt, allerdings sehr koordiniert. Ein "wildes durch die Gegend springen" wird damit vermieden; ein solches hätte auch sehr schnell zur Folge, dass der Überblick verloren geht. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Nullchecker
Anmeldungsdatum: 03.08.2013 Beiträge: 34
|
Verfasst am: 04.08.2013, 12:03 Titel: |
|
|
Vielen Dank für deine Mühe, dass mit dem SELECT CASE war der richtige Tip.
Der Befehl war mir unbekannt.
Für die, die es interessiert hier die Lösung:
DIM AS INTEGER Auswahl
DIM AS INTEGER x
Do
CLS
Input "In welches Menue ? ", Auswahl
SELECT CASE Auswahl
Case 1
CLS
Print"Menue 1 "
Case 2
CLS
Print"Menue 2 "
Case 3
CLS
Print"Menue 3 "
END SELECT
SLEEP 2000
Loop
Durch den Do .... LOOP erreiche ich, immer wieder ins Hauptmenü (in diesem Beispiel die Input-Zeile), nachdem ein Case abgearbeitet ist zu gelangen.
Prima GOTO bzw. GOSUB Ersatz.
Ich werde es für eine eigene Adressenverwaltung nutzen.
Somit kann ich dann z.B. in Menü 1 Adressen eingeben, in Menü 2 ändern usw.
Nochmals VIELEN DANK für den Tip, ohne dich wäre ich nicht weitergekommen und hätte wohl resigniert, jetzt ist die Motivation
100 %. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.08.2013, 12:42 Titel: |
|
|
Aus meiner QB-Sammlung etwas
http://beilagen.dreael.ch/QB/MENUE.BAS
Sollte 1:1 auch in FB verwendet werden können. Generell: Menüroutine wie dort gezeigt einmalig und alle Parameter variabel als SUB, danach im Hauptpogramm GOTO-frei arbeiten. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|