Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Hallo Leute,

im vorletzten Programm konnte ich es umgehen, den ReadKey-Befehl zu benutzen. Das Programm, an dem ich arbeite, läuft ja (wird ohne Fehler compiliert), aber immer wenn der Befehl kommt, bleibt es einfach stecken.

Bsp.:

Code: Alles auswählen

uses
Classes, SysUtils, FileUtil, Forms, Graphics, Controls, Dialogs, ExtCtrls, StdCtrls, Crt;
 
var
i : char;
 
procedure ...
begin
i := ReadKey;
end;
Wenn ich beim Ausführen auf Pause drücke und mir anschaue, in welcher Zeile das Programm gerade ist, wird auch immer "i := ReadKey;" markiert. (Mein Betriebssystem: Windows XP)

Über hilfreiche Antworten wäre ich sehr dankbar!
Zuletzt geändert von Lori am So 10. Feb 2013, 20:11, insgesamt 1-mal geändert.
Grund: Highlighter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6944
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von af0815 »

Kann es sein, das er auf eine Taste wartet.

EIn Beispiel hier http://www.freepascal.org/docs-html/rtl/crt/readkey.html.

Wenn du vorher mit keyPressed abfragst ob überhaupt eine Taste verwendet worden ist, wäre das erreicht was du vermutlich willst.

Crosspost zu http://www.gutefrage.net/frage/free-pas ... ey-problem

PS: Auch Google kann man verwenden für das ReadKey Problem, es gibt dazu schon antworten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Erstmal Danke für die schnelle Antwort! :)

Mit Google habe ich gestern satte 3 Stunden nach ähnlichen Problemen gesucht, doch nirgendwo war es so wie bei mir...
Das mit KeyPressed habe ich auch schon versucht, doch es passiert nichts.
Kann es vielleicht sein, dass er meine Tastatur nicht erkennt? Die ist nämlich über Funk angeschlossen.

Ich weiß echt nicht weiter :cry:

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von Socke »

erik22asus hat geschrieben:Das mit KeyPressed habe ich auch schon versucht, doch es passiert nichts.
Mit Quelltext kann man dir vermtulich besser weiterhelfen.
erik22asus hat geschrieben:Kann es vielleicht sein, dass er meine Tastatur nicht erkennt? Die ist nämlich über Funk angeschlossen.
Wenn dein Betriebssystem die Tastatur erkennt, wirst du damit mit normalen Free-Pascal-Programmen keine Probleme haben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Hier ein Ausschnitt aus dem Quellcode, wo das Programm nicht weiter kommt:

Code: Alles auswählen

 
begin
repeat
until KeyPressed;          //    --> ab hier geht es nicht mehr weiter
image1.visible:= false;
end;
Zuletzt geändert von Lori am So 10. Feb 2013, 20:12, insgesamt 1-mal geändert.
Grund: Highlighter

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von Socke »

erik22asus hat geschrieben:Hier ein Ausschnitt aus dem Quellcode, wo das Programm nicht weiter kommt:
Schon einmal gut; jetzt müssen die Leser nur noch raten, in welchem Kontext das steht (Was ist das für ein Programm? Was ist image1? Wann wird das aufgerufen? etc.)

Die Unit crt in grafischen Anwendungen zu verwenden ist nicht wirklich sinnvoll. Die Unit unterstützt nur den Textmodus.

Verwende stattdessen das Ereignis OnKeyPress des Formulars und setze dessen Eigenschaft KeyPreview auf True. OnKeyPress reagiert auf Tastendrücke und die Eigenschaft KeyPreview stellt sicher, dass das Formular dies mitbekommt, sollte ein anderes Steuerelement den Focus besitzen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Vielen Dank Socke! :)

Mit diesem Ereignis funktioniert es!
Doch wenn ich die Pfeiltasten benutze, bekomme ich ja eine 0 (Pfeiltasten=Sondertasten)
und müsste noch einmal den ReadKey; Befehl benutzen um den Scancode abzufragen, richtig?
Mit dem Scancode kann man ja erst sehen, um welche Sondertaste es sich handelt, oder?

Dabei tritt aber wieder das Problem mit dem ReadKey; Befehl auf...
Bei "uses" habe ich jetzt das CRT entfernt und als Fehlermeldung sagt das Programm: Identifier not found "ReadKey" -> Warum???

Hier der Quellcode:
--------------------------

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, Forms, Graphics, Controls, Dialogs, ExtCtrls,
  StdCtrls;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  if key=#0 then
    begin
      key:=ReadKey;
      if key=#77 then
        moped_image.top:= moped_image.top-10;
    end;
end;
-------------------------
Hoffe auf eure Hilfe! :)
Zuletzt geändert von Lori am So 10. Feb 2013, 20:12, insgesamt 1-mal geändert.
Grund: Bitte nutze den Highlighter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6944
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von af0815 »

Weil das ReadKey jetzt nicht mehr bekannt ist (War in der unit CRT). Benötigst du ja auch nicht, nachdem in der Variablen Key der aktuelle Tastendruck ja bereits gespeichert ist.

Hier gibt es Unterschiede ob man Procedural für die Konsole programmiert oder Ereignisgesteuert für eine GUI Applikation.

FormKeyPress wir nur aufgerufen wenn eine Taste gedrückt wurde, damit muß man nicht extra nachfragen ob eine gedrückt wurde = GUI Programmierung, Ereignis (Event) löst eine Reaktion im Programm aus.

PS: Es gibt auch einen Highlighter hier, gleich oberhalb des Editierfenster ist der, mit dem kann man das ganze Programmfragment auch vernünftig formatieren (Und man vermeidet unnötige arbeit für die Mods).
Zuletzt geändert von af0815 am So 10. Feb 2013, 17:52, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Und wie bekomme ich jetzt den Scancode für die Pfeiltasten? (2. Abfrage nach der 0)
Oder versteh ich da was falsch?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6944
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von af0815 »

Es gibt keinen Scancode, bei dieser Routine gibt es nur einen Char.

Und den kann man ganz einfach herausbekommen: Breakpoint setzen und dann die Variable Key ansehen.

Oder

Code: Alles auswählen

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  memo1.lines.add('Char = '+inttostr(ord(key)));
end;
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Bei den Pfeiltasten wird aber nichts angezeigt!?
Kann man die dann nicht weiter verwenden?

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von Michl »

Sollte wie zuvor genannt funktionieren!

Abfragen der Tasten z.B.

Code: Alles auswählen

 
case ord(key) of
      40: ...  //Pfeil runter
      38: ...  //Pfeil hoch
end;
 
Edit: Sorry, habs gerade mal probiert, funktioniert nur in den Events OnKeyDown oder OnKeyUp, dann mit den oben gennaten Key-Werten

z.B.

Code: Alles auswählen

 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   Form1.Caption:=inttostr(Key);
end;
 
mfg Michl
Zuletzt geändert von Michl am So 10. Feb 2013, 18:51, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

erik22asus
Beiträge: 8
Registriert: So 10. Feb 2013, 13:12

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von erik22asus »

Bei mir funktioniert es nicht...
Ich glaube mein Computer will mich ärgern.

Hier die Quellcodes, die ich probiert habe:

1.-----------

Code: Alles auswählen

var
   key_zahl : integer;
   key : char;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
 begin
  key_zahl:= ord(Key);
  case Key_zahl of
   38 : ...;
   40 : ...;
  end;
end;
2.----------

Code: Alles auswählen

var
    key : char;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  case Key of
   #38 : ...;
   #40 : ...;
  end;
end;

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von Michl »

Hatte meine Antwort gerade revidiert :wink: (siehe oben), funktioniert nur in OnkeyDown oder OnkeyUP.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6944
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programm bleibt bei READKEY-Befehl stecken! Hilfe!

Beitrag von af0815 »

ist die Eigenschaft KeyPreview auf True ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten