Frage zu OnKeyPress()
-
Hallo alle zusammen,
ich sitze schon eine Stunde und komme nicht weiter.
Ich möchte, dass in meinem Formular bei drucken auf die "Return" Taste eine bestimmte Operation ausgeführt wird und beim drucken auf "ESCARE" das Programm beenden werden kann.
Nun Egal welche von beiden ich drucke wird das Programm beendet.In OnKeyPress() habe ich folgendes stehen:
[code]void __fastcall TForm8::FormKeyPress(TObject *Sender, char &Key) { if(Key == VK_RETURN) { Button1->SetFocus(); this->Button1Click(this); } if(Key == VK_ESCAPE) this->BitBtn3Click(this); }[/code]
Wo ist der Fehler?
-
Hallo
Der Grund für das beschriebene Problem ist aus deinem Quellcode nicht ersehbar.
Trotzdem noch ein paar Anmerkungen :
- Benutzt aussagekräftige Komponentnamen. Hast du wirklich in deinem Projekt acht Formulare, durchbenannt von Form1 bis Form8? *grusel*
- das "this->" brauchst du nicht
- Ruf lieber direkt Komponentenmethoden als Eventmethoden auf. Also statt Button1Click(); lieber Button1->Click();
- Wenn du doch Eventmethoden aufrufen willst solltest du für Sender nicht einfach this übergeben, sondern entweder das aufrufende Control selber oder NULL
- Du solltest logische Operationen nicht von Controls abhängig machen. Wenn ESC das Form schließen soll, warum erst einen extra Button zwischendurch aufrufen? Führ doch gleich die Methode Form::Close() ausbis bald
akari
-
Also na gut hast Du Recht logischer ist vielleicht so zu schreiben:
[code]if(Key == VK_RETURN) { Button1->SetFocus(); Button1->Click(); } if(Key == VK_ESCAPE) Form8->Close();[/code]
Aber trotzdem ist das keine Lösung für mein Problem!
Ich weiß nicht was ich noch ausprobiren soll?
-
Nun ja, der Fehler liegt wohl in der Button1Click()-Methode.
-
Hallo
Wie bereits gesagt sehe ich im Quellcodeausszug keinen Grund für das genannte Problem.
Bei meinem Test mit deinem Code mußte ich nur noch TForm::KeyPreview auf true stellen und ich konnte sowohl den Button als auch das Beenden korrekt auslösen.Aber noch zwei Anmerkungen :
- "Form8->" ist noch schlechter als "this->". Es ist nicht nur überflüssig sondern bindet die Methode unnötigerweise an eine bestimmte Instanz der Klasse
- Las beim Posten vom Code hier im Forum mittels der cpp-tags doch endlich die code-Tages wegbis bald
akari
-
In Button1Click() habe ich nur matematische Berechnungen und Tonausgabe:
[code]void __fastcall TForm8::Button1Click(TObject *Sender) { schluessel_berechnen(); klack(); //Ton ausgeben }[/code]
-
Sorry für die Code-Tages,
Die Bennenung fon Forms werde ich auch berücksichtigen.
Ich habe mein Beispiel auch schon mit neue Form ausprobiert und das funktioniert nur mit leere Form, sobald ich da ein Button reinpacke geht das nicht, weil angeblich das Fockus an den übergeht und weiter bin ich ratlös, weil nach der Form1->SetFocus() erreiche ich trotz dem nichts.
-
Hallo
Benutzt deinen Debugger um den Programmverlauf zu verfolgen. Damit findest du die Stelle wo das Form geschlossen wird.
bis bald
akari
-
aesse schrieb:
Ich habe mein Beispiel auch schon mit neue Form ausprobiert und das funktioniert nur mit leere Form, sobald ich da ein Button reinpacke geht das nicht, weil angeblich das Fockus an den übergeht und weiter bin ich ratlös, weil nach der Form1->SetFocus() erreiche ich trotz dem nichts.
Hallo,
beachte bitte unbedingt den Hinweis TForm::KeyPreview auf true stellen von Akari ... ohne das Funktioniert es auch nicht
mfg, Micha!