Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konsolenanwendung: if [Enter] then Procedure XY - wie umsetz (https://www.delphipraxis.net/121976-konsolenanwendung-if-%5Benter%5D-then-procedure-xy-wie-umsetz.html)

coly546 7. Okt 2008 20:09


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.

sx2008 7. Okt 2008 20:21

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:
var
  s : string;
begin
  while not eof do
  begin
    readln(s); // Lesen von Standardinput
    write('Ausgabe:');
    writeln(s); // Schreiben nach Standardoutput
  end;
end;
Würde man das Programm so aufrufen:
Code:
KonsoleTest.exe <C:\autoexec.bat >C:\info.txt
wird die Datei Autoexec.bat eingelesen und leicht verändert nach info.txt geschrieben.
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)

coly546 7. Okt 2008 20:26

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.

sx2008 7. Okt 2008 20:34

Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
 
Nach du kannst z.B. ein Menue als Text anbieten:
Delphi-Quellcode:
writeln('1 = berechne Zinsen');
writeln('2 = berechne Verlust');  // DAX lässt grüssen
writeln('E = Ende');
Und dann fragst du den Stanardinput ab:
Delphi-Quellcode:
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');
So *kann* man das machen. Man bekommt aber ein Programm mit Look & Feel der 1970er Jahre.

coly546 7. Okt 2008 20:39

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:
if s=VK_RETURN then
schreiben kann. Oder wie kann ich das mit der ENTER-Taste machen.

//EDIT:
Delphi-Quellcode:
read(s);
if s=VK_RETURN then
P_Menue;

geht leider nicht :cry:

sx2008 7. Okt 2008 20:54

Re: Konsolenanwendung: if [Enter] then Procedure XY - wie um
 
Delphi-Quellcode:
if s=VK_RETURN then
Das geht nur innerhalb von VCL Anwendungen.
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');

coly546 7. Okt 2008 21:01

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?

Sir Rufo 7. Okt 2008 21:30

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

coly546 7. Okt 2008 21:44

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.

Sir Rufo 7. Okt 2008 22:03

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:
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----------------------------------
cu

Oliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz