[Gelöst] Konsolenanwendung: ReadLn mit komischen verhalten

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 157
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

[Gelöst] Konsolenanwendung: ReadLn mit komischen verhalten

Beitrag von Ich934 »

Ich entwickle noch imer meine Windows-Konsolenanwendung und habe hier ein komisches Verhalten beim Befehl ReadLn. Hier ein Auszug aus dem Source:

Code: Alles auswählen

  procedure AbfrageSaison();
  var
    Eingabe: ansistring;
  begin
    // init
    Eingabe := '';
    // Ausgabe
    WriteLn;
    // Eingabe lesen bis Saison gültig
    repeat
      Write('     ' + 'Bitte Saison eingeben: ');
      ReadLn(Eingabe);
      WriteLn('        Eingabe: ' + Eingabe);
    until (IsValidSaison(Eingabe)) or (Eingabe.ToLower = 'ende');
    // Abbruch
    if Eingabe.ToLower = 'ende' then
    begin
      Saison := 0;
    end
    else
    begin
      Saison := Eingabe.ToInteger;
    end;
  end;
IsValidSaison prüft, das die Eingabe valide ist und auch in einen Integer gewandelt werden kann.

Folgendes fällt mir jetzt auf:
  • ich muss doppelt auf Enter drücken um hier das abzusenden. Warum? Erkennt das FPC nicht das ich unter Windows bin?
  • bei der eingabe der ersten taste wird die Schleife durchlaufen, der Wert aber gespeichert. Sprich es wird erneut das "Write" ausgeführt. Warum?
Das würde dann so ausschauen:

Code: Alles auswählen

     Bitte Saison eingeben:         Eingabe:
     Bitte Saison eingeben:         Eingabe: 30
     Bitte Saison eingeben:         Eingabe:
     Bitte Saison eingeben:         Eingabe: 25
     Bitte Saison eingeben:
Die Eingabe war:

Code: Alles auswählen

30<Enter><Enter>
25<Enter><Enter>
Irgendwie habe ich das anders erwartet... Vor allem das zweite Enter sollte ja nicht sein...

Edit: das zweite Enter bei der Eingabe ergänzt da das vergessen wurde...
Zuletzt geändert von Ich934 am Mi 25. Nov 2020, 10:33, insgesamt 1-mal geändert.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 724
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Konsolenanwendung: ReadLn mit komischen verhalten

Beitrag von fliegermichl »

Also ich hab dein Beispiel mal komplettiert.
Läuft genauso wie ich es erwartet hatte.

Socke
Lazarusforum e. V.
Beiträge: 2830
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Konsolenanwendung: ReadLn mit komischen verhalten

Beitrag von Socke »

Kannst du aus dein Problem in ein komplettes Testprogramm zusammenfassen?
In einem Test hat musste ich nur ein <Enter> drücken. Da aber elementare Bestandteile unklar sind, kann ich die Ursache nicht weiter Eingrenzen. Der Code oben zur Funktion AbfrageSaison sieht so aber erst einbmal in Ordnung aus.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Ich934
Lazarusforum e. V.
Beiträge: 157
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Konsolenanwendung: ReadLn mit komischen verhalten

Beitrag von Ich934 »

Hm, ich sollte das mir mit dem Testprogramm merken und öfters anwenden.. :?

Das Problem war ein

Code: Alles auswählen

Term.Input.DirectRead := True;
Das kommt vom TermUtils. Beim entsprechenden Bereich auf False gesetzt und es verhält sich genau so wie es sollte und von mir erwartet...
Tipp für PostgreSQL: www.pg-forum.de

Warf
Beiträge: 1524
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Konsolenanwendung: ReadLn mit komischen verhalten

Beitrag von Warf »

Ich934 hat geschrieben:
Mi 25. Nov 2020, 10:33
Das kommt vom TermUtils. Beim entsprechenden Bereich auf False gesetzt und es verhält sich genau so wie es sollte und von mir erwartet...
Nur so als anmerkung, wen du LazTermUtils benutzt solltest du während der Lebenszeit des TTerminal objekts wenn möglich gänzlich auf Readln und Writeln verzichten. Der Grund dafür ist das die TerminalStreams das verhalten des Terminals massiv beeinflussen können und um ein konsistentes verhalten zu garaniteren selbst code Implementieren um damit umgehen zu können.
Du solltest stattdessen also Term.Output.Writeln und Term.Input.Readln verwenden.

Ich934
Lazarusforum e. V.
Beiträge: 157
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: [Gelöst] Konsolenanwendung: ReadLn mit komischen verhalten

Beitrag von Ich934 »

Danke für den Hinweis. Das werde ich nächste Woche umsetzen. Ich bin jetzt schon im Wochenende ;-)
Tipp für PostgreSQL: www.pg-forum.de

Antworten