Menü "Scrollen" HILFE

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
kurev
Beiträge: 7
Registriert: Fr 7. Nov 2014, 23:37

Menü "Scrollen" HILFE

Beitrag von kurev »

Hallo ich bin noch relativ neu mit Lazarus und schreibe im Moment ein "Quizprogramm"
Ich möchte im Menü ein * neben den Menüpunkten haben den man mit den Pfeiltasten steuern kann und wenn man Enter drückt, dass man auf den jeweiligen Menüpunkt kommt.
Habe jedoch im Moment Probleme mit meiner Menü-Prozedur. Als Fehlermeldung kommt, dass nach dem until am Ende ein : sein muss. (?!)
Verzweifle im Moment sehr daran, bin für jegliche Hilfe offen und würde mich auch freuen wenn ihr mir helfen könntet, wie ich mit Enter dann den jeweiligen Menüpunkt aufrufen kann.
Hier ist die Prozedur, danke schonmal im Vorraus.

Code: Alles auswählen

procedure menu;
begin
window(1,7,80,25);textbackground(blue);textcolor(white);clrscr;
repeat
  clrscr;
  writeln;writeln;writeln;writeln;writeln;writeln;
  writeln('                              NEUES SPIEL      .1');
  writeln;
  writeln('                              HIGHSCORELISTE   .2');
  writeln;
  writeln('                              HILFE            .3');
  writeln;
  writeln('                              ENDE             .0');
  pos:=7;
  gotoxy(57,pos);write('*');
  REPEAT
    CLRSCR;
    zeichen:=READKEY;  IF (zeichen=#0) THEN zeichen:=READKEY;
    until zeichen in [#72,#80,#27,#13];
 
    CASE zeichen OF #72: begin DEC(pos);DEC(pos);gotoxy(57,pos);write('*');end;
                    #80: begin INC(pos);inc(pos);gotoxy(57,pos);write('*');end;
 until zeichen = #27;
end;
Zuletzt geändert von Lori am Do 13. Nov 2014, 18:44, insgesamt 2-mal geändert.
Grund: Highlighter

kurev
Beiträge: 7
Registriert: Fr 7. Nov 2014, 23:37

Re: Menü "Scrollen"

Beitrag von kurev »

Unbenannt.png
Unbenannt.png (6.22 KiB) 1425 mal betrachtet
Hier die Fehlermeldung

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Menü "Scrollen" HILFE

Beitrag von wp_xyz »

Die Fehlermeldungen sind nicht immer direkt das was man erwartet, aber hier fehlt das schließende "end" der "case"-Anweisung.

Tipp: Wenn man konsequent einrückt, sieht man sowas ziemlich leicht. Ich weiß nicht, wie dein Quelltext eingerückt ist, weil du ihn hier direkt reinkopiert hat. Besser wäre es, wenn hier im Forum Quelltext immer mit [ code=laz ] und [ /code ] umschlossen wird, so dass er richtig formatiert wird (die Leerzeichen nach [ und vor ] dabei weglassen, sie sind hier eingefügt, dass die Forumsoftware dies nicht fehl-interpretiert).

Code: Alles auswählen

 
procedure menu;
begin
  window(1,7,80,25);textbackground(blue);textcolor(white);clrscr;
  repeat
    clrscr;
    writeln;writeln;writeln;writeln;writeln;writeln;
    writeln(' NEUES SPIEL .1');
    writeln;
    writeln(' HIGHSCORELISTE .2');
    writeln;
    writeln(' HILFE .3');
    writeln;
    writeln(' ENDE .0');
    pos:=7;
    gotoxy(57,pos);write('*');
    REPEAT
      CLRSCR;
      zeichen:=READKEY; IF (zeichen=#0) THEN zeichen:=READKEY;
    until zeichen in [#72,#80,#27,#13];
 
    CASE zeichen OF
      #72: begin DEC(pos);DEC(pos);gotoxy(57,pos);write('*');end;
      #80: begin INC(pos);inc(pos);gotoxy(57,pos);write('*');end;
    end;  // <---- das hat gefehlt.
  until zeichen = #27;
end; 
 

kurev
Beiträge: 7
Registriert: Fr 7. Nov 2014, 23:37

Re: Menü "Scrollen" HILFE

Beitrag von kurev »

danke schonmal :)!
Problem ist jetzt aber immernoch, dass ich mit den Pfeiltasten das Menü immernoch nicht steuern kann und nicht weiß wie ich mit "Enter" dann einen Menüpunkt auswähle, wenn das 1. Problem gelöst wäre.
Gibt es da noch irgendwelche Ratschläge für mich ?

Code: Alles auswählen

procedure menu;
begin
  window(1,7,80,25);textbackground(blue);textcolor(white);clrscr;
  repeat
    clrscr;
    writeln;writeln;writeln;writeln;writeln;writeln;
    writeln(' NEUES SPIEL .1');
    writeln;
    writeln(' HIGHSCORELISTE .2');
    writeln;
    writeln(' HILFE .3');
    writeln;
    writeln(' ENDE .0');
    pos:=7;
    gotoxy(57,pos);write('*');
    REPEAT
      zeichen:=READKEY; IF (zeichen=#0) THEN zeichen:=READKEY;
    until zeichen in [#72,#80,#27,#13];
 
    CASE zeichen OF
      #72: begin DEC(pos);DEC(pos);gotoxy(57,pos);write('*');end;
      #80: begin INC(pos);inc(pos);gotoxy(57,pos);write('*');end;
    end;
  until zeichen = #27;
end;

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Menü "Scrollen" HILFE

Beitrag von wp_xyz »

Setze einfach einen Breakpoint auf die 1.Anweisung und dann gehst du mit F8 Schritt für Schritt durch diese Routine. Der Vorteil dieser alten Konsolenprogramme ist, dass man im Ausgabefenster (das du dir natürlich an eine Stelle schieben musst, dass es nicht von der IDE überdeckt ist) schön verfolgen kann, was passiert. Ich will's dir nicht verraten - aber du findest den Fehler (besser: die Fehler) bestimmt!

kurev
Beiträge: 7
Registriert: Fr 7. Nov 2014, 23:37

Re: Menü "Scrollen" HILFE

Beitrag von kurev »

habe gefunden das ich #72 und #80 vertauscht habe.. mehr aber nicht.
Kannst du mir die Fehler nicht einfach zeigen ? Ich verzweifle echt im Moment :|

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Menü "Scrollen" HILFE

Beitrag von wp_xyz »

Dein Code hat eine große Schleife außen und eine innen. Die innere ist solange aktive, bis eine Pfeiltaste gedrückt ist. Je nachdem, welche Pfeiltaste gedrückt ist, erhöhst oder erniedrigst du "pos" und malst in die entsprechende Zeile das Sternchen. Ist gut. Jetzt beginnt die äußere Schleife erneut. Du löschst den BIldschirm, schreibst das Menü und setzst "pos" wieder auf 7 und malst wieder das Sternchen - damit ist aber der Wert von "pos" aus dem letzten Schleifendurchlauf verloren. Ich hoffe, du weißt jetzt, so "pos := 7" hingehört.

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Menü "Scrollen" HILFE

Beitrag von Mathias »

Code: Alles auswählen

  #72: begin DEC(pos);DEC(pos);gotoxy(57,pos);write('*');end;
2 x Dec würde ich nicht aufrufen, einmal reicht, dafür aber pos bei GotoXY mit 2 multiplizieren.

Code: Alles auswählen

  #72: begin DEC(pos);gotoxy(57,pos*2);write('*');end;
Dann hast du es einfacher pos auszuwerten.
bei eins währe es neus Spiele, bei zwei Hiscore usw.
Die Bereichsprüfun fehlt auch noch. wen pos < 1 dann pos = 4, if pos > 4 dann pos = 1.
Die alten '*' musst du auch noch löschen, sonst weist du nicht mehr wo du stehst.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Menü "Scrollen" HILFE

Beitrag von Mathias »

Code: Alles auswählen

  #72: begin DEC(pos);DEC(pos);gotoxy(57,pos);write('*');end;
2 x Dec würde ich nicht aufrufen, einmal reicht, dafür aber pos bei GotoXY mit 2 multiplizieren.

Code: Alles auswählen

  #72: begin 
         DEC(pos);
         gotoxy(57,pos*2);
         write('*');
       end;
Dann hast du es einfacher pos auszuwerten.
bei eins währe es neus Spiele, bei zwei Hiscore usw.
Die Bereichsprüfun fehlt auch noch. wen pos < 1 dann pos = 4, if pos > 4 dann pos = 1.
Die alten '*' musst du auch noch löschen, sonst weist du nicht mehr wo du stehst.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Menü "Scrollen" HILFE

Beitrag von wp_xyz »

Mathias hat geschrieben: pos bei GotoXY mit 2 multiplizieren
Das zweifache "dec(pos)" gefällt mir auch nicht, aber mit 2 multiplizieren ist falsch: Zu Beginn ist pos = 7. Er will um zwei Zeilen nach unten zu pos = 9. Wenn du aber pos mit 2 multiplizierst ist pos = 14!

Um das zweifache "dec" zu vermeiden kann man auch "dec(pos, 2)" aufrufen.

kurev, du hast hoffentlich den Fehler schon gefunden, dann kann ich's jetzt ja verraten: "pos := 7" gehört vor die erste repeat Schleife, dann geht alles.
Ein Tipp noch: Code wird in der Regel lesbarer, wenn man nicht mehrere Anweisungen in eine Zeile packt.

Antworten