Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Anfängerproblem mit Menüerstellung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 03.08.2013, 19:55    Titel: Anfängerproblem mit Menüerstellung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 03.08.2013, 20:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 03.08.2013, 22:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 03.08.2013, 23:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Nullchecker



Anmeldungsdatum: 03.08.2013
Beiträge: 34

BeitragVerfasst am: 04.08.2013, 12:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 04.08.2013, 12:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz