![]() |
TEdit beim überschreiten von MaxLength etwas auslösen
Hallo zusammen,
Setzt man maxLength für ein TEdit kann man, bekanntermaßen ;-), nur maxLength Zeichen eingeben. Versucht man eines mehr einzugeben, ertönt, sofern aktiviert, der passende Windows Beep. Soweit, so schön. Was kann ich tun, damit nicht der Windows Beep ausgelöst wird, sondern eine andere Methode? Das onChanged-Event wird, überschreitet man maxLength, gar nicht erst ausgelöst, sonst hätte ich es dort machen können. Für Hilfe wäre ich sehr dankbar. Herzliche Grüße Wandogau (Moo) |
AW: TEdit beim überschreiten von MaxLength etwas auslösen
OnKeyUp/OnKeyDown/OnKeyPress?
Und wenn das Char nicht "weitergereicht" werden soll, damit die DefaultProc von Windows nicht piept, dann einfach Key auf 0 setzen. |
AW: TEdit beim überschreiten von MaxLength etwas auslösen
Das verhindert zwar nicht den Beep, aber man bekommt es wenigstens mit:
Delphi-Quellcode:
type
TEdit = class(Vcl.StdCtrls.TEdit) private procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; end; ... procedure TEdit.CNCommand(var Message: TWMCommand); begin if (Message.NotifyCode = EN_MAXTEXT) then ShowMessage('Nee, nee, nee!') else inherited; end; |
AW: TEdit beim überschreiten von MaxLength etwas auslösen
Hallo,
und ganz herzlichen Dank für eure Antworten. Wer's mal braucht, bei mir läuft es so:
Code:
Herzlich grüßt
constructor TMSEdit.create (aOwner: TComponent);
begin inherited create (aOwner); fToMuchCharacters := false; // private variable end; procedure TMSEdit.keyDown (var key: word; shift: TShiftState); begin // erhält das Edit den Focus, und ist etwas selektiert, muss das, vorher, gelöscht werden... if self.selLength > 0 then begin inherited keyDown (key, shift); exit; end; if (self.maxLength > 0) and (shift = []) and (not (key in [vk_back, vk_delete, vk_return, vk_left, vk_right, vk_home, vk_end, vk_tab])) and (length (self.text) = self.maxLength) and assigned (onReachMaxLength) then begin onReachMaxLength (self, 's_Stop'); fToMuchCharacters := true; end; inherited keyDown (key, shift); end; procedure TMSEdit.keyPress (var key: char); // die wird gebraucht, damit es nicht piept. ;-) begin if fToMuchCharacters then begin fToMuchCharacters := false; key := #0; end; inherited keyPress (key); end; Wandogau |
AW: TEdit beim überschreiten von MaxLength etwas auslösen
Ableiten ist garnicht nötig.
OK, in der grauenhaft automatisch übersetzen deutschen MSDN-Variante, kann man es nicht wirklich lesen, aber Zitat:
Delphi-Quellcode:
Da der BEEP erst nach der Notification kommt, hätte man vielleicht denken können, dass es doch eine Möglichkeit zum Unterdrücken gäbe.
type
TForm2 = class(TForm) protected procedure WndProc(var Message: TMessage); override; // oder eben auch via WM_COMMAND bzw. CN_COMMAND //procedure WMCommand(var Message: TWMCommand); message WM_COMMAND; end; procedure TForm2.WndProc(var Message: TMessage); begin if (Message.Msg = WM_COMMAND) and (TWMCommand(Message).NotifyCode = EN_MAXTEXT) then Beep; // TEdit(LParam) inherited; end; Allerdings hilft das Result leider nicht, wie z.B.
Delphi-Quellcode:
,
Message.Result := 1;
und auch ein ![]() Bei NonVCL könnte man vielleicht das DefWindowProc bzw. DispatchMessage einfach weglassen (ungetestet), aber sowas ist in der VCL leider nicht möglich, also hier gäbe es nur Msg.Result, um mit Windows zu reden, und ein
Delphi-Quellcode:
geht sowieso nicht.
Message.Msg := WM_NULL;
Fazit: Es bleibt bloß noch den Tastendruck abzubrechen, bevor es zu lang wird. (Copy&Paste oder WM_SETTEXT erstmal ignoriert) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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-2025 by Thomas Breitkreuz