Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Klasse soll auf Messages der Form reagieren
Bergmann89 - Fr 23.04.10 18:08
Titel: Klasse soll auf Messages der Form reagieren
Hey,
ich schreib grad an nem neuen Projekt. Eine Klasse in dem Projekt soll auf Änderungen der Form reagieren (MouseMove, KeyDown, Resize, ...). Dazu hab ich mir erst überlegt die Methoden einfach zu deklarieren und dann in der Form aufzurufen um die Parameter weiterzuleiten. Aber das muss doch auch irgendwie besser gehen. Kann ich nich irgendwie das Handle der Form übergeben und dann auf die Messages reagieren, die die Form bekommt?
MfG & Thx Bergmann.
Xion - Fr 23.04.10 18:33
Ich glaube nicht dass das so einfach geht. Sonst könnte man ja einfach vom andren Programm alle Events auslesen (was ne feine Sache wäre)
Ich würde das so machen, dass du die WndProc-procedure überschreibst und dann da rein ALLE messages an deine Komponenten weiterleitest. Dann musst du zwar für deine Klasse immernoch ne Procedure zum Message-Weiterleiten schreiben, aber besser als die einzelnen Events.
http://www.delphi-library.de/viewtopic.php?t=97738
Kapitel 4, 2te Hälfte (weiter unten)
Wie du dann an die Parameter kommst, die z.B. OnKeyDown hat, das ist ne ganz andre Frage...aber Delphi macht das ja auch irgendwie.
=> keine ideale Lösung
Gausi - Fr 23.04.10 18:41
Wenn deine Klasse ein visuelles Objekt ist, leite es von TWinControl ab(oder auch was anderes geeigneteres), dann kommen da von alleine Nachrichten an.
Ansonsten würde ich sehr den Delphi-Weg empfehlen, d.h. die Form bekommt die Messages und leitet ggf. in den entsprechenden Events das an deine Klasse weiter.
Tryer - Fr 23.04.10 19:07
TControl.WindowProc sollte sich "einfach" ersetzen lassen um da alle Nachrichten zu kontrollieren bevor man sie an die ursprüngliche Fensterprozedur weiterleitet.
Als "Hook" ist es halt OOP-mäßig "böse", spart aber manchmal viel Arbeit.
Denkanstoß (provisorisch, ungetestet):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| type TWindowProcHook = class private FControl: TControl; FOldWndProc: TWndMethod; protected procedure WndProcHook(var Msg: TMessage); public constructor Create(AControl: TControl); destructor Destroy; override; end; ..
constructor TWindowProcHook.Create(AControl: TControl); begin inherited Create; FControl := AControl; FOldWndProc := AControl.WindowProc; FControl.WindowProc := WndProcHook; end;
destructor TWindowProcHook.Destroy; begin FControl.WindowProc := FOldWndProc; inherited Destroy; end;
procedure TWindowHookProc.WndProcHook(var Msg: TMessage); begin case Msg.Msg of .. end; FOldWndProc(Msg); end; |
Grüsse, Dirk
Bergmann89 - Sa 24.04.10 00:01
Hey,
wenn ich mir die Parameter (zB die gedrückten Tasten) dann noch selber zusammen suchen muss, dann mach ich das vlt doch lieber über die Events.
Von TWinControl ableiten geht bei mir leider nicht wirklich, da das ganze n GUI-Manager für OpenGL wird. Also sind die Komponenten schon sichtbar, aber nicht so wie normalerweiße^^
MfG & Thx Bergmann
Steve1024 - Sa 24.04.10 23:26
Native Win32 API Hooks?
Das findet man gute Infos in der MSDN.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!