AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Message-Parameter für CMTextChanged

Ein Thema von oki · begonnen am 21. Sep 2007 · letzter Beitrag vom 21. Sep 2007
Antwort Antwort
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 08:07
moin,

ich möchte einen Nachfahren von TCustomEdit erstellen und auf die Änderung des Textes zu deren Behandlung reagieren. TCustomedit beinhaltet die Procedure
    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
42
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 12:23
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 12:42
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
42
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 13:13
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 13:22
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
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 15:56
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
42
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 16:12
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 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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Message-Parameter für CMTextChanged

  Alt 21. Sep 2007, 16:31
Hallo sirius,

jetzt hättest du mich aber beinahe .... Mann oh Mann .... was da alles hätte passieren können!!!!

Ne, Spaß beiseite, dank für die Info, wird berücksichtigt.

Gruß oki
42
  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 21:38 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