Problem mit Endlosschleifen
-
Hallo,
ich habe gerade ein kleines Problem mit Borland C++-Builder 6.
folgender Code:int c=0; while(1) { c=getch(); if((c==80)|(c==72)|(c==77)|(c==75)) break; Sleep(10); } if(c==80) Label1->Caption="Runter"; if(c==72) Label1->Caption="Hoch"; if(c==77) Label1->Caption="Rechts"; if(c==75) Label1->Caption="Links";
lässt das Programm "einfrieren"... Eigentliches Ziel des Programms soll es sein, auf Label1 darzustellen, welche Pfeiltaste gedrückt wurde.
Was mache ich falsch?
utzer
-
Hallo
Wie du schon selber schreibst, ist das eine Endlosschleife. Dein Programm kann gar nichts anderes machen außer deine Überprüfung.
In der VCL des Builders solltest du dein eigentliches Vorhaben am einfachsten mit dem OnKey...-Event lösen können.
bis bald
akari
-
Hab gerade noch festgestllt, dass das Problem nicht die Schleife ist, sondern die verwendung von getch()..... Was mach ich falsch?
Edit: wie mach ich das mit dem OnKey-Event?
-
Hallo
Siehe BCB-Hilfe oder Suchfunktion hier im Forum.
bis bald
akari
-
Da wir nicht wissen, was Du vorhast... akari hat schon das einzig sinnvolle gepostet.
Aber setz mal KeyPreview des Forms auf true und verwende das Ereignis OnKeyUp() des Forms um alle Eingaben abzufangen. Diese werden aber weiterhin an Controls weitergeleitet, falls welche vorhanden sind und den Fokus haben.
-
Hallo,
ok, mit KeyUp... kann ich nun die Zeichen einlesen.
Ich habe nun oben in meinem Programm das stehen:volatile int c
außerdem habe ich folgenden Code:
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { c=Key; }
Wenn ich auf einen Button klicke, wird dieser Code aufgerufen:
void __fastcall TForm1::Button1Click(TObject *Sender) { Label1->Caption=c; }
Auf Label1 steht nun der ASCII-Wert des Zeichens. Das funktioniert aber nur, wenn die Taste gedrückt wurde, bevor auf den Button geklickt wurde. Nun ist es aber so, dass die Taste erst gedrückt wird, nach dem der Button angeklickt wurde...
Dann wurde aber noch nicht der "KeyUp-Event" ausgeführt und ich hab ich c noch kein Zeichen stehen....
Wie kann ich also in der Button-Routine warten, bis KeyUp ausgeführt wurde?
hab es schon so versucht(Beim start des Programmes wird c=0 gesetzt):while(c==0) { }
aber dann stürtzt das Proramm ab (es friert ein...)
utzer
-
Hallo
Warum sollte der Button auf den Key-Event warten? Las doch den Button und die globale (!) int-Variable weg und führ den gewünschten Code direkt im Key-Event aus.
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { Label1->Caption=Key; }
bis bald
akari
-
ok, danke, so gehts nun........
-
außerdem hattest du in deiner Überprüfung kein "oder" (||).
greetz KN4CK3R
-
Ich denke, es ist besser, für while-Schleifen keine Konstante (hier 1) zu verwenden, sondern eine Variable, die innerhalb der Schleife von true (1) auf false (0) gesetzt werden kann. Hat man dann immer noch eine Endlosschleife, empfiehlt sich ein Schleifenzähler für einen gewaltsamen Abbruch. Mit Testaudrucken oder Debug kann man das warum erfahren.