AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls TEdit beim überschreiten von MaxLength etwas auslösen
Thema durchsuchen
Ansicht
Themen-Optionen

TEdit beim überschreiten von MaxLength etwas auslösen

Ein Thema von Marco Steinebach · begonnen am 13. Jul 2021 · letzter Beitrag vom 13. Jul 2021
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#1

TEdit beim überschreiten von MaxLength etwas auslösen

  Alt 13. Jul 2021, 14:25
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)
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

AW: TEdit beim überschreiten von MaxLength etwas auslösen

  Alt 13. Jul 2021, 14:48
OnKeyUp/OnKeyDown/OnKeyPress?

Und wenn das Char nicht "weitergereicht" werden soll, damit die DefaultProc von Windows nicht piept, dann einfach Key auf 0 setzen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#3

AW: TEdit beim überschreiten von MaxLength etwas auslösen

  Alt 13. Jul 2021, 14:59
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#4

AW: TEdit beim überschreiten von MaxLength etwas auslösen

  Alt 13. Jul 2021, 17:14
Hallo,
und ganz herzlichen Dank für eure Antworten.
Wer's mal braucht, bei mir läuft es so:
Code:
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;
Herzlich grüßt
Wandogau
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: TEdit beim überschreiten von MaxLength etwas auslösen

  Alt 13. Jul 2021, 17:22
Ableiten ist garnicht nötig.

OK, in der grauenhaft automatisch übersetzen deutschen MSDN-Variante, kann man es nicht wirklich lesen, aber
Zitat:
The parent window of the edit control receives this notification code through a WM_COMMAND message.
Delphi-Quellcode:
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;
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.

Allerdings hilft das Result leider nicht, wie z.B.
Message.Result := 1; ,
und auch ein Delphi-Referenz durchsuchenAbort kann nicht helfen, da die VCL es vorher mit einem try-except abfängt, bevor der DefaultCode der Komponente es anschließend piepsen lässt.

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 Message.Msg := WM_NULL; geht sowieso nicht.



Fazit: Es bleibt bloß noch den Tastendruck abzubrechen, bevor es zu lang wird. (Copy&Paste oder WM_SETTEXT erstmal ignoriert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (13. Jul 2021 um 17:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz