![]() |
Windows Message in einer Klasse
Hallo,
folgendes Problem, ich möchte die Windows Message "WM_INPUTLANGCHANGE" in einer Klasse bearbeiten. Aber irgendwo fehlt mir der richtige Ansatz.
Delphi-Quellcode:
Wenn ich die Windows Message in dem Form bearbeite (auskommentierter Quelltext) geht es, in einer Klasse nicht. Wenn ich dem Form nun einen Button hinzufüge geht es auch nicht mehr. Also muss ich doch einen Denkfehler machen :wall: .
type
TSprache = class(TWinControl) private public constructor Create(AOwner: TComponent); override; procedure KeyboardChange(var Message: TMessage); message WM_INPUTLANGCHANGE; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Sprache: TSprache; //procedure KeyboardChange2(var Message: TMessage); message WM_INPUTLANGCHANGE; end; var Form1: TForm1; implementation {$R *.dfm} constructor TSprache.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TSprache.KeyboardChange(var Message: TMessage); begin Showmessage('test'); end; procedure TForm1.FormCreate(Sender: TObject); begin Sprache := TSprache.Create(Form1); end; //procedure TForm1.KeyboardChange2(var Message: TMessage); //begin // Showmessage('test2'); //end; Ziel ist es am Ende diese Windows Message in einer Komponente zu bearbeiten. Bin für jede Hilfe dankbar, kann auch ein Beispiel oder Tutorial zu diesem Thema sein. Gruß Bunke5 |
Re: Windows Message in einer Klasse
Vielleicht weil das Control die nachricht nicht kriegt?? Bzw die Form die nachricht abarbeitet und verschluckt?
Versuch mal in der Form die Msg abzufangen und leite sie dann mittels Broadcast() weiter. |
Re: Windows Message in einer Klasse
Erstmal Danke für die Idee, ich hatte auch schon eine ähnliche Idee.
Wenn ich die Nachricht im Form abfange und weiterleite geht es.
Delphi-Quellcode:
Das klapp soweit auch ganz gut, aber sobald ich einen Button auf dem Formular habe geht es nicht mehr. Und ich kann doch nicht für jeden Button oder ähnliches die Behandlungsroutine überschreiben, da muss es doch noch einen anderen Weg geben?
procedure wndproc(var Message: TMessage); override;
procedure TForm1.wndproc(var Message: TMessage); begin if Message.Msg = WM_INPUTLANGCHANGE then Sprache.KeyboardChange(Message) else inherited wndproc(Message); end; |
Re: Windows Message in einer Klasse
Probier es doch mal bitte so:
Delphi-Quellcode:
btw warum überschreibst du den constructor von TSprache wenn du ihn eh nicht brauchst??
type
TSprache = class(TWinControl) private public constructor Create(AOwner: TComponent); override; procedure KeyboardChange(var Msg: TMessage); message WM_INPUTLANGCHANGE; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Sprache: TSprache; procedure KeyboardChange(var Msg: TMessage); message WM_INPUTLANGCHANGE; end; var Form1: TForm1; implementation {$R *.dfm} constructor TSprache.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TSprache.KeyboardChange(var Msg: TMessage); begin Showmessage('test'); end; procedure TForm1.FormCreate(Sender: TObject); begin Sprache := TSprache.Create(Form1); end; procedure TForm1.KeyboardChange(var Msg: TMessage); begin Broadcast(Msg); end; |
Re: Windows Message in einer Klasse
So geht es leider nicht, die Nachricht wird nicht an die Klasse weitergeleitet.
Mit den constructor hast du recht so bringt er gar nicht, aber normalerweise ist diese Klasse etwas komplexer sie lädt dynamisch dll's und da muss ich den constructor überschreiben, habe für die Anfrage nur alles aus meiner Sicht unnötige rausgelassen, den constructor hab ich wohl übersehen. :mrgreen: Aber das Problem scheint anderes zu liegen, es bekommt immer nur die "Delphi-Komponente" die den Focus hat die Windows Message und dafür brauch ich eine Lösung. Wie stelle ich sicher, das meine Klasse dieses immer mitbekommt? |
Re: Windows Message in einer Klasse
Hmm eigentlich sollte es mit Broadcast gehen... :? keine ahnung wieso nicht :|
|
Re: Windows Message in einer Klasse
Hallo,
Form1.Broadcast(msg) versorgt alle Controls mit msg, die Form1 als Parent haben. An geeigneter Stelle sollte da irgendwann Sprache.Parent := Form1 stehen, dann kann das auch funktionieren. Grüße vom marabu |
Re: Windows Message in einer Klasse
He danke,
damit funktioniert es. Der Baustein hätte mir noch gefehlt.
Delphi-Quellcode:
Es geht dann auch ohne den Broadcast Aufruf. Ich dachte wenn ich den Owner angebe ist die Frage mit den Parent auch erledig, dumm von mir.
procedure TForm1.FormCreate(Sender: TObject);
begin Sprache := TSprache.Create(Form1); Sprache.Parent := Form1; end; Jetzt bleibt immer noch das Problem, das wenn ich z.B einen Button auf das Formular setzt, die Windows Message an den Button geht und nicht an das Formular, wenn da jemand auch noch so eine gut Idee hat, wäre klasse. |
Re: Windows Message in einer Klasse
Baue Broadcast() wieder ein - sonst bekommt nur das fokusierte Control die Message.
marabu |
Re: Windows Message in einer Klasse
Danke für den Hinweise. Das wäre wieder so was wonach ich wahrscheinlich Stunden gesucht hätte.
Das Problem mit dem Button löst dies leider auch nicht. Versucht einfachmal in meinen Quelltext dem Form1 einen Button hinzu zufügen. Danach erhält der Button die Windows Message und nicht mehr das Form1. Ich hab das ganze mal mit den WinSight32 von Borland beobachtet. Die Message geht nur an den Button nicht mehr an das Form1. Und das ist das was ich nicht verstehe. Anders herum scheint es logisch zu sein, wenn das Formular die Windows Message empfängt und es sie an seine Komponenten weiter, aber so... :?: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz