![]() |
Beepen bei OnKeyDown global unterdrücken
Hallo liebe DP-Gemeinde,
ich habe hier in der Code-Library folgenden Code zum unterdrücken des typischen Windows-Beep beim OnKeyDown Event gefunden:
Delphi-Quellcode:
Meine Frage wäre nun, wie ich das vielleicht global setzen kann? Ich habe derzeit eine Anwendung mit hunderten von TEdits, und würde gerne den o.g. Code für alle TEdit setzen.
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var mgsTemp: TMsg; begin if Key = VK_RETURN then begin PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE); end; end; Ist das möglich? Wenn ja: wie genau? Vielen Dank schonmal für Eure Hilfe. |
Re: Beepen bei OnKeyDown global unterdrücken
Du könntest beim Programmstart durch Components der Forms iterieren und jedem Edit den Eventhandler zuweisen, wenn es nicht direkter funktioniert.
|
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
|
Re: Beepen bei OnKeyDown global unterdrücken
Moin
das könnte so in der Art aussehen:
Delphi-Quellcode:
procedure EditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var mgsTemp: TMsg; begin if Key = VK_RETURN then begin PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE); end; end; // ... var i: Integer; begin for i := 0 to ComponentCount - 1 do begin if Components[i] is TEdit then (Components[i] as TEdit).OnKeyDown := EditKeyDown; end; |
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
Danke, das sieht gut aus, nur ich denke mal das wird nicht ganz funktionieren, da ich für einige meiner TEdits im OnKeyDown-Event eigene Anweisungen stehen habe und die würden doch dann nicht ausgeführt werden, oder? |
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
|
Re: Beepen bei OnKeyDown global unterdrücken
Steig auf .Net um und nimm Delegates.
Scherz :wink: Entweder baust du eine Klasse, die den alten Eventhandler aufnimmt und diesen zusammen mit dem neuen aufruft, oder(ohne Klasse) du leitest die WindowProc der Edits um. Code kann ich heute aus Zeitgründen leider nicht mehr bieten :wink: . |
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
|
Re: Beepen bei OnKeyDown global unterdrücken
Du musst entweder in den paar edits, die schon ein onkeydown haben, einen eventhandler definieren, der die anderen aufruft, oder ... dazu kommen wir später :mrgreen:
Wenn du wirklich die WndProc überschreiben willst, dann schau such mal nach ![]() |
Re: Beepen bei OnKeyDown global unterdrücken
1.)
Zitat:
![]() 2.) Weise jedem Editfeld die selbe OnKeyDown zu. Das geht mit der Shifttaste und der Maus oder über Matze's Code-Beispiel. Wenn du unterschiedliche Sachen im OnKeyDown-Ereignis abfangen musst, kanst du über die Tags und einer Case-Abfrage darauf reagieren. // die edits sind zu dieser stunde normal ;) |
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
|
Re: Beepen bei OnKeyDown global unterdrücken
Moin,
mit einem TApplicationEvents-Objekt und dessen OnMessage-Property sollte das möglich sein. Hinter einer solchen Property steht nämlich so etwas wie ein lokaler Hook, dh.: Du kannst in dem entsprechenden OnMessage-Eventhandler dann so ziemlich alle Messages abfangen, die vom System an die Controls deiner Application abgeschickt wurden. Also auch alle WM_Char-Messages an alle TEdits deiner Anwendung:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); var ATWinControl : TWinControl; begin if Msg.message = WM_Char then if Msg.wParam = vk_Return then begin ATWinControl := FindControl(Msg.hwnd); if (ATWinControl <> Nil) and (ATWinControl is TEdit) then Handled := true; end; end; |
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
Delphi-Quellcode:
abfragen ob es ein Edit ist, und dann das Event zuweisen...
Components[n] is TEdit
|
Re: Beepen bei OnKeyDown global unterdrücken
Hai ihr,
warum denn nicht den einfachsten Weg nehmen und sich ein eigene Komponente von TEdit ableiten und in dieser dann die gewünschte Funktionalität einbauen? EDIT: Das ganze könnte dann zum Beispiel so aussehen:
Delphi-Quellcode:
Einfach die Unit in ein Package laden, compilieren, installieren und verwenden.
unit ShEdit;
interface uses Classes, StdCtrls, Controls, Messages, Windows; type TShEdit = class(TEdit) protected FEnterAsTab: Boolean; procedure KeyDown(var Key: Word; Shift: TShiftState); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property EnterAsTab: Boolean Read FEnterAsTab Write FEnterAsTab default True; end; procedure Register; implementation constructor TShEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FEnterAsTab := True; end; destructor TShEdit.Destroy; begin inherited Destroy; end; procedure TShEdit.KeyDown(var Key: Word; Shift: TShiftState); var mgsTemp : TMsg; begin if (Key = VK_RETURN) then begin if (FEnterAsTab) then begin Parent.Perform(WM_NEXTDLGCTL, 0, 0); end; PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE); end; inherited KeyDown(Key, Shift); end; procedure Register; begin RegisterComponents('Sharky', [TShEdit]); end; end. |
Re: Beepen bei OnKeyDown global unterdrücken
Er hat doch schon hunderte von Edits in seinem projekt. Dann müsste er all diese Edits durch sein neues Edit austauschen...
|
Re: Beepen bei OnKeyDown global unterdrücken
Das könnte er z.B. durch Search/Replace in den entsprechenden .dfm-Dateien machen. (Vorher Sicherungskopien machen...)
Gruß, teebee |
Re: Beepen bei OnKeyDown global unterdrücken
du kannst ja eine Klasse schreiben, die die Methode enthält, die du mit ComponentCount zuweist, und einen Verweis auf die alte Methode. Dann machst du ein dynamisches Array dieser Klasse und durchläufst alle edits des forms mit componentcount, und immer, wenn du einen Edit findest, erzeugst du ein neues Element des Arrays und setzt die alte Methode. Die führst du in der neuen Prozedur aus.
|
Re: Beepen bei OnKeyDown global unterdrücken
Mit dieser Idee kommst du exakt 10 Posts zu spät :wink: . Aber du willst wirklich für eine variable Länge dynamische Arrays einsetzen?
|
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
|
Re: Beepen bei OnKeyDown global unterdrücken
Zitat:
|
Re: Beepen bei OnKeyDown global unterdrücken
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Installiere dir die selbst erstellte Komponente mit den gewünschten Eigenschaften. Installiere dir die ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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