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 In Komponente Message vom Form abfangen (https://www.delphipraxis.net/94894-komponente-message-vom-form-abfangen.html)

jakobwenzel 27. Jun 2007 19:53


In Komponente Message vom Form abfangen
 
Hallo zusammen!

ich habe folgendes Problem: Ich schreibe an einer nicht visuellen Komponente, die irgendwie mitkriegen muss, wenn in dem ansonsten leeren Formular Tasten gedrückt werden.
An die meisten Tasten komme ich ja, indem ich OnKeyDown/OnKeyUp "umbiege" (meinen Eventhandler reinschreiben und den alten bei Bedarf aufrufen), nur für Tab funktioniert das ja leider nicht.
Normalerweise würde man jetzt die Message "CMDialogKey" abfangen, aber da komme ich so von der Komponente aus nicht ran.

Eine mögliche Lösung wäre jetzt, das Formular von einem eigenen TForm-Nachfolger abzuleiten, der für diese Message ein Event bereitstellt. Aber solche Codeänderungen wollte ich eigentlich vermeiden.
Gibts da irgendeine Lösung?

Ein Crosspost

mfg jakobwenzel

jakobwenzel 11. Aug 2007 11:08

Re: In Komponente Message vom Form abfangen
 
*push* :oops:

jfheins 11. Aug 2007 11:15

Re: In Komponente Message vom Form abfangen
 
Wenn du die WndProc umbiegst bekommst du garantiert alle Tastendrücke mit ;)

So in etwa: (Das beispiel ist jetzt für eine Progressbar, aber das musst du dann mit deinem Form machen ;) )
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ComCtrls, StdCtrls, xpman;

type
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
      { Private-Deklarationen }
      OldProgressWndProc: TWndMethod;
      procedure ProgressWndProc(var Msg: TMessage);
   public
      { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.ProgressWndProc(var Msg: TMessage);
var
  dc: HDC;
  rect: TRect;
begin
   OldProgressWndProc (Msg);

   if Msg.Msg = WM_xyz then
// Auf irgendeine Nachricht (siehe msdn oder Luckie ^^) reagieren ....
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   OldProgressWndProc := ProgressBar1.WindowProc; // alte merken
   ProgressBar1.WindowProc := ProgressWndProc; // wndproc umbiegen
end;

end.

jakobwenzel 11. Aug 2007 11:23

Re: In Komponente Message vom Form abfangen
 
Vielen Dank, funktioniert perfekt! :thumb:

sirius 11. Aug 2007 11:47

Re: In Komponente Message vom Form abfangen
 
Wenn es viele Komponenten wären, dann wäre noch TApplicationEvent etwas für dich. Dadurch bekommst du dann alle Messages an dein Programm mit.


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