Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wie programmiert man einen hotkey?
henny - Di 16.06.09 17:14
Titel: Wie programmiert man einen hotkey?
Wie programmiere ich einen hotkey so das wenn man eine bestimmte Tastenkombination auf der Tastatur eingibt, das irgendwas durchgefürt wird.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Dude566 - Di 16.06.09 17:22
Global oder nur wenn dein Programm aktiviert ist?
Xentar - Di 16.06.09 17:25
Wenn es global sein soll: Schonmal Hotkey in die Suche eingetippt?
henny - Mi 17.06.09 16:00
Nur wnn mein Programm aktiviert ist!
Dude566 - Mi 17.06.09 17:27
Das kannst du ganz simpel mit OnKeyPress machen, außerdem geht auch noch GetASyncKeyState.
Popov - Mi 17.06.09 17:52
Hast du ein Menü? Wenn ja, dann kannst du es zu jedem Menüpunkt direkt eingeben.
henny - Sa 20.06.09 13:26
und wie programmiere ich dann das in OnKeyPress wenn man eine Tastenkombination drückt
z.B. eine showmessage erscheint?
Popov - Sa 20.06.09 13:41
Nichts dagegen, daß du fragst, aber die Art wie du das machst ist irgendwie zum ignorieren. Du kommst irgendwie so rüber als ob die anderen es für dich programmieren sollten. Du fragst - wie programmiere ich das? Hier fehlt das Gefühl, daß du es selbst versucht hast und es nicht klappt und du deshalb fragst.
Wenn du die OnKeyPress Prozedur durch klicken im Objektinspektor erstellst, dann erstellt Delphi automatisch diese Prozedur:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin
end; |
Geht es noch einfacher? Was für Parameter hast du da? Wie wäre es mit Key? Was könnten wir damit anfangen? Es ist ein Char-Typ. Was glaubst du was uns Delphi über den Parameter übergibt? Nochmal zur Erinnerung, das Ereignis ist OnKeyPress. Genau, die Taste die gedrückt wurde.
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = 'a' then ShowMessage('Noch einfacher geht es nicht.'); end; |
Dude566 - Sa 20.06.09 13:42
Also so habe ich es mal in meinem Pong gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Timer1Timer(Sender: TObject); begin if GetAsyncKeyState(VK_UP) <> 0 then ShowMessage('Hoch');
if GetAsyncKeyState(VK_Down) <> 0 then ShowMessage('Runter'); end; |
Den Timer dann dementsprechend einstellen wie intensiv er nachmisst, wenn du z.B. ein Intervall von 2 hast dann schaut er in dem moment wo du drückst so oft nach, dass die ShowMessage mehrfach ausgegeben wird.
henny - Sa 20.06.09 14:28
Danke "dovov" das hat geklappt und wie mache ich das wenn ich nicht nur a drücke sonern strg+a?
Delete - Sa 20.06.09 14:38
Dann schau mal unter OnKeyDown.
ffgorcky - Mo 06.07.09 20:51
Also, wenn Du solche Tastenkombinationen (mit Alt oder Strg) als HotKeys haben möchtest, dann ließe sich das wirklich am einfachsten - und zumindest für mich auch am übersichtlichsten - mit (evtl. versteckten) MainMenü-Einträgen machen.
Man braucht ja gar nicht sehen, dass das Programm solch ein MainMenu besitzt (indem Du einfach alle Eintäge auf Visible:=false setzt), aber so klappt das!
elundril - Mo 06.07.09 21:09
ffgorcky hat folgendes geschrieben : |
Man braucht ja gar nicht sehen, dass das Programm solch ein MainMenu besitzt (indem Du einfach alle Eintäge auf Visible:=false setzt), aber so klappt das! |
is aber schlechter programmierstil ;) und es verbraucht mehr speicherplatz im ram, so wie jede eigentlich sichtbare komponente.
lg elundril
ffgorcky - Di 07.07.09 14:28
elundril hat folgendes geschrieben : |
is aber schlechter programmierstil ;) und es verbraucht mehr speicherplatz im ram, so wie jede eigentlich sichtbare komponente. |
Na gut, dann müsstest Du nach meinen jetzigen Informationen das ganze dann einfach so machen, dass Du Dir bei
FormKeyDown merkst, welche Taste gerade gedrückt wurde (also so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if not gedrueckteTaste=nil then gedrueckteTaste:=Key; end; |
)
und natürlich bei
FormKeyUp dann das ganze wieder so machst:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=gedrueckteTaste then gedrueckteTaste:=nil; end; |
Und wenn Du bei OnKeyDown noch eine zweite Taste sendest, dann könnte es ja die richtige sein:
Delphi-Quelltext
1: 2:
| if gedrueckteTaste=VK_CTRL and Key='a' then ShowMessage('Richtige Tastenkombination!'); |
Ich hoffe nur, dass ich mich da jetzt nicht irgendwo vertan habe...
elundril - Di 07.07.09 17:25
hat du leider:
man könnte mit TShiftState arbeiten. ich denkte da sollte ssCrtl dabei sein.
also:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = Ord('a') and (ssCtrl in Shift) then machDasWasGemachtWerdenSoll; end; |
lg elundril
Critter - Di 07.07.09 17:43
Hallo,
ich denke die Interessanteste Möglichkeit so etwas unter Delphi zu machen liegt in einer ActionList. Einfach eine AL auf das Formular und doppelt Klicken dann eine neue Aktion hinzufügen, unter Hotkey im Objektinspektor deine Tastenkombination eintragen und doppelt auf die Action in der Liste Klicken um aus zu Programmieren, was bei ihrem auslösen geschehen soll.
Das schöne ist, dass du bei bedarf auch gleich die Actions an Menüpunkte und Buttons hängen kannst, wo diese dann mit Caption, Icon (sofern du eine Imagelist hinterlegt hast) und auch der Anzeige des HotKeys erscheinen. Als Sahnehäubchen kannst du dann alle Menüs und Buttons die mit einer Action verknüpft sind auf einen Schlag Disablen oder Unsichtbar machen - einfacher geht das nun wirklich nicht mehr.
Ich sicher du findest zu dem Thema auch was in
DER LIB.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!