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 Memofelder und Tastaturbotschaften (https://www.delphipraxis.net/133938-memofelder-und-tastaturbotschaften.html)

Marco Steinebach 12. Mai 2009 12:38


Memofelder und Tastaturbotschaften
 
Hallo Zusammen,
Diese Memo-Felder machen mich noch wahnsinnig!
Mit einer Ereignisbehandlungsroutine für WM_KEYDOWN kann man ja, bekanntermaßen, ;-), Tastaturereignisse abfangen und behandeln.
Das geht aber nur solange, wie kein Memo-Feld (Tmemo) auf der Form liegt, weil das offensichtlich, ungefragt, alle Messages abfängt.
Denn ohne Tmemo funktioniert untenstehende Behandlungsroutine einwandfrei, ist ein Tmemo da, tut sich mal gar nix.
Kann mir mal bitte jemand verraten, wo hier der Code begraben liegt? ;-)

Delphi-Quellcode:
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
....
procedure TForm1.WMKeyDown(var Message: TWMKeyDown);
begin
  inherited;
  case Message.CharCode of
    VK_RETURN: // ENTER pressed
      if (Message.KeyData and $1000000 <> 0) then
        // Test bit 24 of lParam
        ShowMessage('ENTER on numeric keypad')
      else
        ShowMessage('ENTER on Standard keyboard');
  end;
end;
Freundliche Grüße
Marco

Klaus01 12. Mai 2009 12:41

Re: Memofelder und Tastaturbotschaften
 
.. hast Du keyPreview der Form auf true gesetzt?

Grüße
Klaus

quendolineDD 12. Mai 2009 12:44

Re: Memofelder und Tastaturbotschaften
 
Geht trotzdem dann nicht. Das Problem ist, dass das Memo sich den Focus holt und dann alle Messages bearbeitet und nicht mehr weiterschickt. Du müsstest den Focus des Memos verlassen.

Marco Steinebach 12. Mai 2009 12:49

Re: Memofelder und Tastaturbotschaften
 
Zitat:

Zitat von quendolineDD
Geht trotzdem dann nicht. Das Problem ist, dass das Memo sich den Focus holt und dann alle Messages bearbeitet und nicht mehr weiterschickt. Du müsstest den Focus des Memos verlassen.

*grummel, keine andere Chance? Ich müßte nämlich, während man sich im Memo befindet, zwischen den beiden Enter-Tasten unterscheiden. ;Kann man denn nicht irgendwo, bevor das memo von den Messages erfährt, die schon abfangen?
Viele Grüße
Marco

quendolineDD 12. Mai 2009 12:51

Re: Memofelder und Tastaturbotschaften
 
Du kannst doch die Verarbeitungsroutinge des Memos verändern. Also müsstest von TMemo ableiten und dann dein eigenes Memo instanzieren.

Marco Steinebach 12. Mai 2009 13:42

Re: Memofelder und Tastaturbotschaften
 
Zitat:

Zitat von quendolineDD
Du kannst doch die Verarbeitungsroutinge des Memos verändern. Also müsstest von TMemo ableiten und dann dein eigenes Memo instanzieren.

Tja, wenn ich nur wüßte, welche Routine die ganzen Botschaften abfängt?
Hiiilfe!

taaktaak 12. Mai 2009 13:55

Re: Memofelder und Tastaturbotschaften
 
.. die WinProc des Memos vielleicht?

Marco Steinebach 12. Mai 2009 21:38

Re: Memofelder und Tastaturbotschaften
 
Hallo Zusammen,
Wer also jemals ein Memofeld hat, und die Enter-Tasten unterscheiden will/muß, hier die Lösung.
Klasse ableiten
Delphi-Quellcode:
uses
  Windows, STDCTRLS, Messages;

type
  TTextfeldKomponente = Class (TMemo)
    public
      NumPadEnter: boolean; // true, wenn enter auf dem Nummernblock gedrückt wird.
      procedure WndProc(var Msg: TMessage); override;
  end;

implementation

procedure TTextfeldKomponente.WndProc(var Msg: TMessage);
begin
  if msg.msg = WM_KEYDOWN then
    if TWMKEYDOWN(msg).CharCode = VK_RETURN then
      NumPadEnter := (TWMKEYDOWN(msg).KeyData and $1000000 <> 0);
  inherited;
end;

end.
und dann kann im KeyDown des aufrufenden Formulars beispielsweise stehen:
Delphi-Quellcode:
  case key of
    VK_RETURN:
    begin
      if tf.NumPadEnter then
      begin
       // mach was, wenn enter auf dem Nummernblock gedrückt wurde...
Viel Spaß damit!
Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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