![]() |
Message-Parameter für CMTextChanged
moin,
ich möchte einen Nachfahren von TCustomEdit erstellen und auf die Änderung des Textes zu deren Behandlung reagieren. TCustomedit beinhaltet die Procedure
Delphi-Quellcode:
Kann mir jemand sagen, wie hier der Parameter Message aufgebaut ist?
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
mich interessiert, ob in der Message der Text des Edit steht und ob ich den hier prüfen, bearbeiten und zurückgeben kann. Im Endeffekt sollen nur Zahlen akzeptiert werden. Ich möchte es in einer eigenen Implementierung haben. Also Hinweise auf TSpinEdit oder andere Fremdkomponenten zur Nutzung sind nicht mein Ziel! Schon mal Dank und Gruß oki |
Re: Message-Parameter für CMTextChanged
Hallo oki,
außer der message id wird in der VCL nichts übergeben, wenn die Nachricht CM_TEXTCHANGED verschickt wird.
Delphi-Quellcode:
Freundliche Grüße
procedure TControl.SetTextBuf(Buffer: PChar);
begin Perform(WM_SETTEXT, 0, Longint(Buffer)); Perform(CM_TEXTCHANGED, 0, 0); end; |
Re: Message-Parameter für CMTextChanged
Hi marabu,
ich hab mir schon bald gedacht, dass das nur die Standardbenachrichtigung ist. Jetzt hab ich nur bemerkt, dass die bei mir gar nicht reagiert wenn was ins Edit geschrieben wird. Ich möchte ungern das OnChange-ereignis überschreiben. Hier mein code der nie aufgerufen wird:
Delphi-Quellcode:
Gruß oki
TSizeEdit = class(TCustomEdit)
private procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; Function CheckText(AText : String) : String; protected public constructor Create(AOwner : TComponent); override; end; procedure TSizeEdit.CMTextChanged(var Message: TMessage); var CurPos : Integer; begin // hier bearbeiten CurPos := self.SelStart; Text := CheckText(Text); if CurPos > Length(Text) then self.SelStart := Length(Text) else self.SelStart := CurPos; inherited; end; |
Re: Message-Parameter für CMTextChanged
Das Onchange-Ereignis im TEdit wird nicht über CM_Textchanged sondern über CN_Command und (message as TWMCommand).notify=EN_Change ausgelöst.
Edit: Nur wenn du im vom Code aus die Methode settext (und damit settextbuf), also über das property "Text", aufrufst, dann wird zusätzlich auch noch CM_Textchanged ausgelöst. |
Re: Message-Parameter für CMTextChanged
Jo,
darauf muß man erst mal kommen. Dann mal schönen Dank an dich sirius. Ich schreib's um und melde mich zurück. Dank und Gruß oki |
Re: Message-Parameter für CMTextChanged
Joop,
habs getestet und klappt so super. Der neue Code sieht jetzt so aus:
Delphi-Quellcode:
Damit ist die Frage beantwortet.
TSizeEdit = class(TCustomEdit)
private procedure CNCommand(var Message: TWMCommand); message CN_COMMAND; Function CheckText(AText : String) : String; protected public constructor Create(AOwner : TComponent); override; end; {----------------------------------------------------------------------------- Procedure: CheckText Author: oki Date: 21-Sep-2007 Arguments: AText: String Result: String Describtion: nur Zahlen zulassen -----------------------------------------------------------------------------} function TSizeEdit.CheckText(AText: String): String; var counter : Integer; begin for Counter := Length(AText) downto 1 do begin if not (AText[Counter] in ['0'..'9']) then system.Delete(AText, Counter, 1); end; Result := AText; // das ist nicht so elegant, sollte man über einen var-Parameter oder lokale Variable lösen end; {----------------------------------------------------------------------------- Procedure: CNCommand Author: oki Date: 21-Sep-2007 Arguments: var Message: TWMCommand Result: None Describtion: change abfangen und Text prüfen -----------------------------------------------------------------------------} procedure TSizeEdit.CNCommand(var Message: TWMCommand); var CurPos : Integer; begin // hier bearbeiten CurPos := self.SelStart; Text := CheckText(Text); if CurPos > Length(Text) then self.SelStart := Length(Text) else self.SelStart := CurPos; inherited; end; constructor TSizeEdit.Create(AOwner: TComponent); begin inherited; self.DoubleBuffered := True; Width := 35; Height := 15; self.Font.Size := 7; end; Dank und Gruß an marabu und sirius oki |
Re: Message-Parameter für CMTextChanged
:bouncing4: Halt STOP!
Delphi-Quellcode:
Ich weis nicht genau wie die VCL aufgebaut ist, aber du läufst Gefahr noch andere CommandMessages mitzunehmen. Vielleicht die da:
procedure TSizeEdit.CNCommand(var Message: TWMCommand);
var CurPos : Integer; begin if Message.NotifyCode=EN_CHANGE then //Achtung, hier musst du noch filtern! begin CurPos := self.SelStart; Text := CheckText(Text); if CurPos > Length(Text) then self.SelStart := Length(Text) else self.SelStart := CurPos; inherited; end; end; Zitat:
|
Re: Message-Parameter für CMTextChanged
Hallo sirius,
jetzt hättest du mich aber beinahe .... Mann oh Mann .... was da alles hätte passieren können!!!! :roteyes: Ne, Spaß beiseite, dank für die Info, wird berücksichtigt. Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 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