![]() |
lästiges beepen abstellen ??
über die Eigenschaft keypreview fange ich mit meinem Form eingaben ab .. ist die gedrückt taste enter .. soll ne procedure ausgeführt werden .. so weit kein Problem .. aber beim ausführen dann tut s immer kurz beepen .. wie bei ner fehleingabe .. wie krieg ich das weg ??
Danke schon im voraus!! |
Hi,
Das geht so: procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = Char(VK_RETURN) then begin Key := #0; // Bewirkt, dass die Taste nicht weitergeleitet wird // und somit wird das Beep unterdrückt. end; end; |
Hallo Erni, :)
Code:
Gruß
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); VAR Mgs: TMsg; BEGIN IF (Shift = [ssShift]) THEN CASE Key OF VK_RETURN : BEGIN // Shift + ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 1, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten END; VK_TAB : BEGIN // ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 1, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten END; END // für CASE Key OF ELSE CASE Key OF VK_RETURN : BEGIN // ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 0, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten END; VK_TAB : BEGIN // ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 0, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten END; END // für CASE Key OF END; Paul Jr. |
danke tom .. aber es hat leider nich funktioniert ..
ahm Paul .. deins hat .. allerdings ist mir nicht ganz klar was folgende befehle im einzelnen bedeuten:
Code:
Also die procedure Perform erzeugt ne WindowsMessage .. aber woher weiß ich an wen .. also was bedeuten die Parameter??
Perform(WM_NextDlgCtl, 0, 0);
Code:
Was bedeuten die einzelnen Parameter ?? Msg mal ausgenommen ..
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
Danke !! |
Zitat:
Form schreiben. |
Moin Ernie,
ich hoffe Paul hat nichts dagegen, dass ich ihm da vorgreife. ;-) Also das Perform bezieht sich auf Form1, da es in einem Methodenaufruf von TForm1 augerufen wird, ohne angabe eines anderen Controls. Man könnte hier also auch schreiben Form1.Perform... Ersatzweise ginge auch SendMessage(self.Handle...), wobei sich das Self wiederum aus dem TForm1 ableitet. WM_NEXTDLGCTL entspricht dem Druck auf TAB. Das nächste/vorige Control in der Tabulatorreihenfolge erhält den Tastaturfokus. Die folgende erste null (null entspricht false) sagt aus, dass das nächste Control genommen werden soll, würde dort ein Wert ungleich 0 stehen (entspricht in C true, und die API ist ja in C geschrieben) würde das vorige Control den Fokus erhalten (entspricht also Shift-Tab). Die zweite null sagt aus, dass wParam (also die erste null) angibt, ob das nächste oder das vorige Control in der Tabulatorreihenfolge gemeint ist. Würde hier ein Wert ungleich null stehen, würde das Betriebssystem wParam als Handle auf das Control verstehen, das als nächstes den Fokus erhält. (präziser es ist hier das niederwertige Datenwort, also die unteren 16 Bit gemeint, die über die Funktion von wParam entscheiden). Damit hätten wir den Perform. Kleiner Tip am Rande: Sollte Perform mal nicht das gewünschte Ergebnis bringen, einfach mal mit SendMessage probieren. Manchmal hilft das. Perform scheint ab und zu nicht wie erwartet zu funktionieren. So und jetzt das PeekMessage: Damit werden Messages aus der MessageQueue des Threads ausgelesen. In diesem Falle wird es nur dazu benutzt unerwünschte Werte aus der Queue zu entfernen. Der erste Parameter ist hier eigentlich nur ein Dummy, aber die Funktion braucht hier nun einmal eine Variable (eigentlich werden hier die Daten der ausgelesenen Message gespeichert). Die null an zweiter Stelle besagt, dass die Messagequeue aller Fensters des aktuellen Threads beachtet werden sollen. Mit den beiden nun folgenden WM_CHAR wird angegeben, dass nur die Messages von WM_CHAR bis WM_CHAR ausgelesen werden sollen, da es hier darum geht genau dieses zu entfernen. Meist wird man hier wohl WM_KEYFIRST, WM_KEYLAST bzw. WM_MOUSEFIRST, WM_MOUSELAST vorfinden, um alle Tastatur- bzw. Mausmessages abzufangen. PM_REMOVE besagt schliesslich, dass die Message nicht nur ausgelesen, sondern sogar aus der Queue entfernt werden soll. Dadurch wird der Beep unterdrückt. PeekMessage ist noch umfangreicher, aber das liest Du wohl am besten im PSDK oder auf MSDN nach. Das würde hier zu weit führen. Ich hoffe Du kommst mit meinen Ausführungen klar. |
doch war nicht schlecht .. also eigentlich gut .. weil hab s doch verstanden.. DANKE!!
|
Hallo Christian :D
gut erklärt Gruß Paul Jr. |
Ich möchte mich ja nicht einmischen, aber den Code von PaulJr kann man noch ein wenig vereinfachen (gleiches zusammenfassen).
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var Mgs: TMsg; begin case Key of VK_RETURN, VK_TAB: begin // ENTER oder TAB-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, ord(Shift = [ssShift]), 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; end // für CASE Key OF end; |
Da gibt's aber noch ein Problem:
Jetzt kann man in einem Memo mit der Enter-Taste keinen Zeilenumbruch machen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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 by Thomas Breitkreuz