Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Message-Parameter für CMTextChanged (https://www.delphipraxis.net/100017-message-parameter-fuer-cmtextchanged.html)

oki 21. Sep 2007 08:07


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:
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
Kann mir jemand sagen, wie hier der Parameter Message aufgebaut ist?

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

marabu 21. Sep 2007 12:23

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:
procedure TControl.SetTextBuf(Buffer: PChar);
begin
  Perform(WM_SETTEXT, 0, Longint(Buffer));
  Perform(CM_TEXTCHANGED, 0, 0);
end;
Freundliche Grüße

oki 21. Sep 2007 12:42

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:
  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;
Gruß oki

sirius 21. Sep 2007 13:13

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.

oki 21. Sep 2007 13:22

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

oki 21. Sep 2007 15:56

Re: Message-Parameter für CMTextChanged
 
Joop,

habs getestet und klappt so super. Der neue Code sieht jetzt so aus:
Delphi-Quellcode:
  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;
Damit ist die Frage beantwortet.

Dank und Gruß an marabu und sirius

oki

sirius 21. Sep 2007 16:12

Re: Message-Parameter für CMTextChanged
 
:bouncing4: Halt STOP!
Delphi-Quellcode:
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;
Ich weis nicht genau wie die VCL aufgebaut ist, aber du läufst Gefahr noch andere CommandMessages mitzunehmen. Vielleicht die da:
Zitat:

Zitat von msdn
EN_CHANGE The user has modified text in an edit control. Windows updates the display before sending this message (unlike EN_UPDATE).
EN_ERRSPACE The edit control cannot allocate enough memory to meet a specific request.
EN_HSCROLL The user has clicked the edit control's horizontal scroll bar. Windows sends this message before updating the screen.
EN_KILLFOCUS The user has selected another control.
EN_MAXTEXT While inserting text, the user has exceeded the specified number of characters for the edit control. Insertion has been truncated. This message is also sent either when an edit control does not have the ES_AUTOHSCROLL style and the number of characters to be inserted exceeds the width of the edit control or when an edit control does not have the ES_AUTOVSCROLL style and the total number of lines to be inserted exceeds the height of the edit control.
EN_SETFOCUS The user has selected this edit control.
EN_UPDATE The user has altered the text in the edit control and Windows is about to display the new text. Windows sends this message after formatting the text, but before displaying it, so that the application can resize the edit control window.
EN_VSCROLL The user has clicked the edit control's vertical scroll bar. Windows sends this message before updating the screen.


oki 21. Sep 2007 16:31

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 17:37 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