![]() |
Key wird nicht gelöscht, warum?
Hallo, hier mein Aufruf
Delphi-Quellcode:
Also ich reagiere auf einen Knopf und werte Tastenanschläge aus, ist evtl. KeyDown event falsch dafür?
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin case key of Windows.VK_SPACE : ZeigeWas; Windows.VK_RETURN: ; // <- hier soll nichts passieren, tastendruck übersprungen werden, aber "ZeigeWas" wird ausgelöst Windows.VK_ESCAPE: Application.Terminate; end; Key := 0; // <- ich dachte das hier macht exakt das (key puffer leeren) //Application.ProcessMessages; end; Sinn und Zweck soll sein, bei gedrückter Eingabe-Taste soll nichts passieren/ausgelöst werden. Für einen kleinen Anstoss in die richtige Richtung wäre ich dankbar, Grüße |
AW: Key wird nicht gelöscht, warum?
Mal testweise in KeyUp reingehangen?
|
AW: Key wird nicht gelöscht, warum?
Du muss das schon mit richtig mit dem Debugger machen. Deine Beobachtung "Meine Prozedur zweigewas() wird ausgelöst" kommt wohl eher daher dass du dein
Delphi-Quellcode:
auch damit belegt hast, oder?
OnClick
Denn das OnKeyDown-Event wird bei einem Druck auf Return überhaupt nicht ausgelöst, das sieht man eigentlich im Debugger. |
AW: Key wird nicht gelöscht, warum?
@Der schöne Günther: Genau
@TiGü: noch nicht probiert, mach ich gleich mal OnClick und VK.Space sollen beide "ZeigeWas" aufrufen, im OnClick steht nur "ZeigeWas" aber ich will halt das "VK.Return" da raus haben, deswegen das KeyDown Event. Eine Idee wie ich das anstellen kann? Grüße |
AW: Key wird nicht gelöscht, warum?
Das hört sich für mich stark so an, als ob du verzweifelt nach einer Lösung suchst und nur deswegen das KeyDown versuchst zu nutzen.
Wäre es vielleicht nicht sogar das Beste, das nochmal neu zu machen? |
AW: Key wird nicht gelöscht, warum?
OnKeyDown
OnKeyPres OnKeyUp Nicht alle Tastenevents werden an gleicher Stelle behandelt. Manches wird beim Drücken ausgelöst (inkl. Key-Repeat-Calls) und manches erst beim Loslassen. Buttons z.B. : per Tastatur [ENTER] beim Drücken, das [Space] beim Loslassen, deren ShortCuts/HotKeys beim Drücken und per Maus auch erst beim Loslassen. Die SpeedButtons in ScrollBars und beim UpDownButtons reagieren dagegen wieder auf's Drücken, mit RepeatTimer und stoppen beim Loslassen. Wir hatten z.B. ein Fenster im Programm, das ging bei F2-KeyDown zu, aber im übergeordneten Fenster wird es beim beim F2-KeyUp geöffnet, also beim Schließen via F2 wurde es sofort wieder geöffnet. :wall: Aber wieso soll "ein" Knopf verschiedene Funktionen haben? ein Button mit Cancel=True reagiert auf ESC und ein anderer Button mit Default=True auf das Enter. Bei ESC immer. Bei ENTER nur wenn die Knöpfe keinen Fokus haben, ansonsten macht bei Enter/Space jeder Button das, wofür er da ist. |
AW: Key wird nicht gelöscht, warum?
Ja klar, Event ist nur dafür da das VK.Return zu unterbinden/abzufangen.
Wenn ich's neu mach, käm ich doch wieder bei einem Key-Event raus? Ich verstehe bestimmt wiedermal nicht wie ich's anders als mit einem Key-Event zu lösen wäre damit: - OnClick > ZeigeWas - Vk.Space > ZeigeWas - Vk.Return > überspringen als endresultat rauskommt. Grüße
Delphi-Quellcode:
also KeyDown event scheint das richtige zu sein, oder versteh ich's falsch?
per Tastatur [ENTER] beim Drücken
|
AW: Key wird nicht gelöscht, warum?
Zitat:
Delphi-Quellcode:
.
OnClick
Escape hat dir himitsu weiter oben schon erklärt wie man das eigentlich "richtig" macht. |
AW: Key wird nicht gelöscht, warum?
Enter/Space lösen OnClick aus.
Also einfach nur das ENTER blocken und den Rest durchlassen. Aber IMHO ist es eher unglücklich, wenn "Standard"-Komponenten vom standardmäßigen Verhalten des OS abweichen. |
AW: Key wird nicht gelöscht, warum?
Hatte meinen Text da oben noch etwas ergänzt.
Zitat:
und vorallem ob es vor oder nach dem KeyPress-Event behandelt wird. Theoretisch wäre KeyDown schon richtig, um das ENTER abzufangen. |
AW: Key wird nicht gelöscht, warum?
ok nochmal ausführlicher:
in meiner TForm hab ich einen Knopf der permanent den Fokus bekommt wenn nicht gerade ein "Edit" passiert. Alle funktionen enden damit den knopf den fokus zu geben (ist von hause aus DefaultButton) Ob nun ein Escape darin vorkommt oder nicht lass ich jetzt mal so im raum stehen da ja mein problem die Return-Taste ist. Hat jemand einen konstruktiven Vorschlag wie ich Return da rausbekommen kann? Oder muss ich eine Button class erstellen die sowas verhindert, sich "normal wie unter windows" zu benehmen? Grüße und verzeiht falls ich das eine oder andere falsch versteh |
AW: Key wird nicht gelöscht, warum?
Vorschlag:
Nicht der Button bekommt den Fokus, sondern die Form, also
Delphi-Quellcode:
oder besser
Form.SetFocus
Delphi-Quellcode:
.
Form.ActiveControl:=nil;
Der Knopf bekommt nicht Default=True. hat der Knopf den Fokus, dann kann Enter/Space/Maus das OnClick normal auslösen. Space wird im OnKeyPress/Down/Up der Form behandelt. (KeyPreview=False) Und das ESC kann über Cancel=True eines anderen Buttons oder auch über OnKeyPress/Down/Up der Form behandelt werden. Die Dialog-Standard-Funktionen (Cancel und Default) werden über die ganze Form/Dialog behandelt. Nur z.B. Memos behandeln ihr [ENTER] vorher und geben es nicht an die Form weiter. Wie gesagt, ENTER/ESC haben Sonderaufgaben und werden von Windows bissl anders behandelt. Ist wie beim Strg+Alt+Entf, was sich auch nicht so leicht abschalten/überschreiben lässt. |
AW: Key wird nicht gelöscht, warum?
Das klingt gut, danke fürs umdenken.
Jetzt muss ich den knopf eh umarbeiten da er momentan nur sichtbar wird wenn er den fokus bekommt. teufelskreis hehe aber ich pflanz den nun immer sichtbar rein und versuch es so wie du vorgeschlagen hast. Danke!
Delphi-Quellcode:
danke auch nochmals für erläuterung!
Wie gesagt, ENTER/ESC haben Sonderaufgaben und werden von Windows bissl anders behandelt
|
AW: Key wird nicht gelöscht, warum?
Eventuell im Form KeyPreview auf True und dann im OnKeyDown des Forms bei Return Key auf 0 setzen?
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin KeyPreview := True; // Kann man auch im Objektinspektor setzen. end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case key of // Windows.VK_SPACE : ZeigeWas; // ist nicht erforderlich, da beim Betätigen der Leertaste, // mit Focus auf dem Button, sowieso das OnClick des Buttons ausgelöst wird. Windows.VK_RETURN : key := 0; // Windows.VK_ESCAPE : Application.Terminate; Windows.VK_ESCAPE : Close; // Halte ich für sinnvoller. end; end; |
AW: Key wird nicht gelöscht, warum?
Ich habe mal denselben Fehler gemacht wie du, und habe mich abhängig von irgendwelchen Sichtbarkeiten gemacht.
Ich sag nur.... tu's nicht :thumb: |
AW: Key wird nicht gelöscht, warum?
Zitat:
War halt ein netter Fade in/out effekt der nun flöten geht, funktionalität hat vorrang. Grüße |
AW: Key wird nicht gelöscht, warum?
Liste der Anhänge anzeigen (Anzahl: 2)
Da es mich doch irgendwie nicht loslässt hab ich mal ein Beispiel "Spiel" gebastelt wo die Eingabe-Taste der Feind ist.
Kann jemand dafür eine Lösung finden das Return nicht zum Sieg des "Spiels" führt? Ich bin gespannt ob das machbar ist ansonsten..... Catch the Button :D Im Anhang ist nur der komplette Source, standard VCL programmiert. Viel Spass beim spielen, Grüße |
AW: Key wird nicht gelöscht, warum?
TApplicationEvents.OnShortcut?
|
AW: Key wird nicht gelöscht, warum?
Der Source ist ja nur 5.4kb groß, bitte runterladen und deine methode testen.
Mir sagt "TApplicationEvents.OnShortcut" leider nichts, wahrscheinlich wegen meinem alten Delphi 7. Aber ich besser mich ja schon was Delphi 7 betrifft, D2010 kommt nun rauf. Grüße |
AW: Key wird nicht gelöscht, warum?
Es gibt auch in Delphi 7 die Komponente TApplicationEvents. Die pappt man auf's Formular und nutzt das Ereignis OnShortcut.
|
AW: Key wird nicht gelöscht, warum?
Zitat:
Ganz abgesehen davon, dass ich nicht überprüfen kann, ob das in deinem speziellen Delphi 7 funktioniert. |
AW: Key wird nicht gelöscht, warum?
Ich schrieb ja das ich diese funktion noch nicht kenne, leider ist meine hilfe nicht so umfangreich und enthält keine beispiele wie man es anwendet.
Nach ein wenig herumprobieren bin ich hier gelandet:
Delphi-Quellcode:
Wenn Msg.Result <> 0 dann schluckt der die taste.
procedure TForm1.aplctnvnts1ShortCut(var Msg: TWMKey;
var Handled: Boolean); begin (* TWMKey = packed record Msg: Cardinal; CharCode: Word; Unused: Word; KeyData: Longint; Result: Longint; end; *) { MessageDlg('Msg: '+IntToStr(Msg.Msg)+#13#13+ 'CharCode: '+IntToStr(Msg.CharCode)+#13#13+ 'Unused: '+IntToStr(Msg.Unused)+#13#13+ 'KeyData: '+IntToStr(Msg.KeyData)+#13#13+ 'Result: '+IntToStr(Msg.Result) , mtInformation, [mbOk], 0); } // CharCode 13 = VK.Return if Msg.CharCode = Windows.VK_RETURN then begin //Msg.CharCode := Windows.VK_SPACE; Msg.Result := 1; ZeigeWas; end; end; Ein Msg.CharCode := Windows.VK_SPACE funktioniert nicht (ich versuchte die taste return auf taste space umzulegen) Diese Funktion ist auf jedenfall eine möglichkeit das "normale" windows verhalten zu umgehen, super tipp, danke! Jetzt meine Frage, ruf ich es so richtig auf oder mach ich da was falsch? Ich würd gerne von euch lernen! Grüße edit ps:
Delphi-Quellcode:
<- so in der Deklaration
aplctnvnts1: TApplicationEvents;
edit2: nun hab ich Result := 1 mit Handled := True ersetzt, scheint die bessere lösung aber ob's richtig ist... hmmm... |
AW: Key wird nicht gelöscht, warum?
Hallo,
nimm statt dem KeyDown das KeyPress mit Key:= #0. |
AW: Key wird nicht gelöscht, warum?
Liste der Anhänge anzeigen (Anzahl: 1)
Bei Key-Down/Up/Press greift immer der Delphi/Windows Standard ein = Knopf wird gedrückt. (Jedenfalls bei meinen Tests)
So hab ich's jetzt und es klappt prima, ob es richtig so ist weiß ich nicht aber das Resultat stimmt. Ich les noch ein wenig bei Emarcadero, aber Beispiele dafür zu finden ist schwer.
Delphi-Quellcode:
procedure TForm1.aplctnvnts1ShortCut(var Msg: TWMKey; var Handled: Boolean);
begin if ((Form1.Focused) or (Button1.Focused)) then // nur eingreifen wenn Form oder Knopf aktiv ist if Msg.CharCode = Windows.VK_RETURN then // Taste Return abfangen begin ZeigeWas; // was soll passieren wenn Return gedrückt wird Handled := True; // zurück zum Delphi/Windows Tastatur-Handler end; end; Grüße Edit: Danke an alle für Eure Vorschläge und das nun alles bestens funktioniert. Falls jemand mag/brauch/will, im Anhang überarbeitete version. Vielen Dank + Thema abgeschlossen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 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