![]() |
Konsolenanwendung: if [Enter] then Procedure XY - wie umsetz
Hi,
ich habe ein kleine Problem. Und zwar möchte in einer Prozedur eine andere Aufrufen, wenn Enter gedrückt wird. Wie kann ich das umsetzten? Ich habe es schon mit Delphi-Quellcode: markieren IF Key=VK_RETURN THEN doch leider kommt dann immer eine Fehlermeldung. "Undeklarierter Bezeichner" Muss ich die jetzt beide als boolean deklarieren? Das Readline habe ich bereits. Das Programm soll nach dem readln die Prozedur XYZ ausführen. |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Du brauchst mal etwas grundlegenden Infos, wie eine Konsolenanwendung überhaupt funktioniert.
Eine Konsolenanwendung hat einen Standardinput, einen Standardoutput und Übergabeparameter. Eine Konsolenanwendung reagiert nicht auf Tastendrücke oder Mausklicks, sondern liest den StandardInput bis nichts mehr kommt und schreibt in den Standartoutput, so lange es möchte. Beispiel für ein Konsolenprog. dass den Input auf den Output kopiert:
Delphi-Quellcode:
Würde man das Programm so aufrufen:
var
s : string; begin while not eof do begin readln(s); // Lesen von Standardinput write('Ausgabe:'); writeln(s); // Schreiben nach Standardoutput end; end;
Code:
wird die Datei Autoexec.bat eingelesen und leicht verändert nach info.txt geschrieben.
KonsoleTest.exe <C:\autoexec.bat >C:\info.txt
Du siehst, ein Konsolenprogramm kann keine Tasten abfragen, sondern nur StandardInput lesen und StandardOutput schreiben. (ein bisschem mehr kann es schon; ich vereinfache hier ein bisschen) |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Hallo,
danke erstmal das du dir die Mühe machst mir zu helfen. Gibt es keinen einfacheren Weg eine Prozedur mit der Enter-Taste zu starten? Ich habe ein Menü gebaut bei dem man auswählen kann, ob Daten eingelesen oder ausgegeben werden sollen. Als erstes muss der User auf einlesen drücken. Nachdem der User die Daten eingeben hat, soll automatisch wieder die Prozedur des Menüs erscheinen. |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Nach du kannst z.B. ein Menue als Text anbieten:
Delphi-Quellcode:
Und dann fragst du den Stanardinput ab:
writeln('1 = berechne Zinsen');
writeln('2 = berechne Verlust'); // DAX lässt grüssen writeln('E = Ende');
Delphi-Quellcode:
So *kann* man das machen. Man bekommt aber ein Programm mit Look & Feel der 1970er Jahre.
readln(s); // s:string
if s = '1' the BerechneZins else if s = '2' then BerecneVerlust else if (s ='e') or (s='E') then exit else writeln('falsche Eingabe'); |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Hi,
wie man son Menü macht weiß ich ja...das mache ich sonst mit case of. Die Frage ist, ob ich jetzt
Delphi-Quellcode:
schreiben kann. Oder wie kann ich das mit der ENTER-Taste machen.
if s=VK_RETURN then
//EDIT:
Delphi-Quellcode:
read(s);
if s=VK_RETURN then P_Menue; geht leider nicht :cry: |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Delphi-Quellcode:
Das geht nur innerhalb von VCL Anwendungen.
if s=VK_RETURN then
Hier mal die erweiterte Abfrage
Delphi-Quellcode:
// hier wartet das Programm auf Eingabe vom StdInput
// man muss Return oder Strg+Z oder Strg+C drücken sondern geht's nicht weiter readln(s); // s:string if s = '' then MachWas // Benutzer hat nur Return gedrückt else if s = '1' the BerechneZins // Benutzer hat 1 und dann Return gedrückt else if s = '2' then BerecneVerlust else if (s ='e') or (s='E') then exit else writeln('falsche Eingabe'); |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Hi,
danke das funktioniert erstmal, aber wenn ich damit eine Prozedur aufrufen möchte, sagt er mir "Undeklarierter Bezeichner". Das versteh ich nicht, wieso soll ich eine Prozedur deklarieren? Und das neue zweite Problem ist: Ich lasse davor schon eine Variable einlesen, danach muss man Enter drücken. So aber dann muss man nochmal Enter drücken, damit er zB write('falsche Eingabe'); ausführt. Der soll aber SOFORT die Prozedur XYZ starten. // Kann man denn nicht mit case of eine Prozedur aufrufen? |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Hi,
gib doch mal den Quelltext, wie wo du die prozeduren aufrufst, dann ist das für uns einfacher, als das abstrakte beschreiben, wie man es so ungefähr gemacht hat ... cu Oliver |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
OK,
also nachdem der User die 8. Stunde vom Freitag eingeben hat, soll der User nur einmal Enter drücken und sofort zum Menü kommen. |
Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
Hi,
ich habe mir mal erlaubt, in dem Quelltext einige Zeilen rauszunehmen, die für diese Probelmbetrachtung nicht wichtig sind. Des Rätsels Lösung heißt eigentlich, das die Prozedur P_Menue immer wieder aufgerufen wird, sobald diese beendet wurde. Den Abbruch des Programms erwirkst du ja mit halt und dann ist alles vorbei. Test it
Delphi-Quellcode:
cu
program Stundenplan;
{$APPTYPE CONSOLE} uses SysUtils; var Tag: ARRAY[1..5,1..8] OF String; index:integer; A,B,E,V_Menue,j,n,V_Lizenz:Char; Anzleer,Anz:Byte; Text:String; s:String; //001------------------------Prozedur----------------Anfang-------------------------------- Procedure P_Stunden_einlesen; var index:integer; begin writeln(' '); // hier sind ein paar Zeilen ausgelassen worden weil nicht wichtig ;-) writeln(' '); writeln(' Bitte gebe hoechtens 10 Zeichen ein! '); writeln(' Nach jeder Eingabe ENTER druecken! '); writeln(' '); // hier sind ein paar Zeilen ausgelassen worden weil nicht wichtig ;-) writeln(' '); for index:= 1 to 8 do begin writeln(' --- Faecher fuer Montag --- '); writeln(' ',index,' Stunde eingeben: '); readln( Tag[ 1, index ] ); end; // hier sind ein paar Zeilen ausgelassen worden weil nicht wichtig ;-) for index:= 1 to 8 do begin writeln(' --- Faecher fuer Freitag --- '); writeln(' ',index,' Stunde eingeben: '); readln( Tag[ 5, index ] ); end; end; //------------------------Spalte------------------------------------------------ procedure P_Spalte(Text:String); var i : Byte; begin for i := 0 to ( 9-( length( Tag[ 1, 1 ] ) ) ) do write( ' ' ); end; //------------------------------------------------------------------------------ //001------------------------Prozedur----------------Ende---------------------------------- //002------------------------Prozedur----------------Anfang-------------------------------- Procedure P_Stunden_ausgeben; var i: Integer; begin //1. Zeile write(' ');write(#218);for i:=1 to 50 do write(#196);writeln(#191); //2. Zeile write(' ');write(#179);write(' STUNDENPLAN:');for i:=1 to 37 do write(' '); writeln(#179); //3. Zeile write(' ');write(#179);for i:=1 to 14 do write(' ');write(#218); for i:=1 to 10 do write(#196);write(#194);for i:=1 to 10 do write(#196); write(#194);for i:=1 to 10 do write(#196);write(#194); for i:=1 to 10 do write(#196);write(#194);for i:=1 to 10 do write(#196); writeln(#191); //4. Zeile write(' ');write(#179);for i:=1 to 14 do write(' ');write(#179); write('Montag');write(' ');write(#179);write('Dienstag'); write(' ');write(#179);write('Mittwoch');write(' ');write(#179); write('Donnerstag');write('');write(#179);write('Freitag'); write(' ');writeln(#179); //5. Zeile write(' ');write(#179);for i:=1 to 14 do write(' ');write(#195); for i := 1 to 54 do write(#220);writeln(#180); //6. Zeile write(' ');write(#179);for i:=1 to 14 do write(' ');write(#195); for i:=1 to 10 do write(#196);write(#197);for i:=1 to 10 do write(#196); write(#197);for i:=1 to 10 do write(#196);write(#197); for i:=1 to 10 do write(#196);write(#197);for i:=1 to 10 do write(#196); writeln(#180); //7. Zeile write(' ');write(#179);write(' 1. Stunde:');write(' ');write(#179); write(Tag[1,1]);P_Spalte('');write(#179); readln; end; //002------------------------Prozedur----------------Ende---------------------------------- //004------------------------Prozedur----------------Anfang-------------------------------- Procedure P_Menue; begin writeln(' '); writeln('XXXX Stundenplan - Menue XXXX'); writeln('XXXX ______________________ XXXX'); writeln('XXXX XXXX'); writeln('XXXX XXXX'); writeln('XXXX E = Stunden eingeben XXXX'); writeln('XXXX A = Stunden anzeigen XXXX'); writeln('XXXX XXXX'); writeln('XXXX B = Programm beenden XXXX'); writeln('XXXX ... was willst du tun? Kennziffer und ENTER druecken ... XXXX'); readln (V_Menue); Case V_Menue of 'E': P_Stunden_einlesen; 'A': P_Stunden_ausgeben; 'B': halt; end; end; //004------------------------Prozedur----------------Ende---------------------------------- //003------------------------Prozedur----------------Anfang-------------------------------- Procedure P_Lizenz; begin writeln(' '); writeln('XXXX [j] oder [n] plus ENTER eingeben ... XXXX'); readln (V_Lizenz); Case V_Lizenz of 'j' : begin end; 'n' : halt; end; end; //003------------------------Prozedur----------------Ende---------------------------------- //005------------------------Hauptprogramm-----------Anfang-------------------------------- begin P_Lizenz; repeat P_Menue; until 1 = 0; // häh??? na klar, weil der Abbruch des Programms hart in P_Menue erfolgt ;-) readln; // das braucht hier kein Mensch end. //005------------------------Hauptprogramm-----------Ende---------------------------------- Oliver |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz