![]() |
Enter wie bei OnKeyDown im Edit abfangen...
Ich will, dass ein bestimmter code ausgeführt wird, wenn der User in meinem Edit-Control die Eingabetaste drückt, so wie beim VCL OnKeyDown Event.
Die Message dazu wäre ja WM_KEYDOWN, aber wie muss ich die einsetzen, um auch wirklich nur die eingaben in dem bestimmten control abzufangen? |
Re: Enter wie bei OnKeyDown im Edit abfangen...
Im OnKeyPress schauen, ob Key=#13 und los geht's.
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
WinAPI!!!
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
Die WinApi braucht man für so was nun wirklich nicht. Wie Toxman schreibt : Im OnKeyPress abfangen !
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
Ähem... könnten sich die VCL Junkies mal bitte da heraushalten?
Das Edit-Control, dass mit der WinAPI erstellt wurde, ist in keiner Klasse wie TEdit zusammengefasst, demzufolge kann ich auch nicht auf Notification-Properties zurückgreifen. |
Re: Enter wie bei OnKeyDown im Edit abfangen...
Du musst das Edit Subclassen:
Delphi-Quellcode:
function EditWndProc(hEdit, uMsg, wParam, lParam: DWORD): DWORD; stdcall;
begin Result := 0; case uMsg of WM_CHAR: case Byte(wParam) of Byte('0')..Byte('9'), Byte(','), VK_DELETE, VK_BACK: CallWindowProc(OldWndProc, hEdit, uMsg, wParam, lParam); end; else Result := CallWindowProc(OldWndProc, hEdit, uMsg, wParam, lParam); end; end;
Delphi-Quellcode:
Obiges Fensterprozedur läst nur Ziffern in einem Edit zu.
OldWndProc := Pointer(SetWindowLong(GetDlgItem(hWnd, 103), GWL_WNDPROC, Integer(@EditWndProc)));
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
thx
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
Ich hab jetzt einen extra Typen für das EditControl entworfen, bei dem die WndProc als private deklariert wurde.
Der constructor soll nun die alte Proc auf die neue umstellen, was dann in etwa so aussehen sollte:
Delphi-Quellcode:
Der Compiler meckert jetzt herum, weil er eine Variable beim dritten Parameter erwartet. Aber warum erkennt er die klasseninterne Funktion nicht an?
FOldWndProc:= Pointer(SetWindowLong(FHandle, GWL_WNDPROC, Integer(@Self.WndProc)));
|
Re: Enter wie bei OnKeyDown im Edit abfangen...
Das lässt sich einfach erklären du kannst nur globale Funktionen (mit eindeutigen Adressen) verwenden. Schau dir mal die funktion allocatehWnd von Delphi an.
Diese erzeugt für eine Objekt-Funktion eine eindeutige Speicheradresse. Somit ist es möglich dass 2 Objekte (mit Fenster) initialisiert werden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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