![]() |
WM_* Message in Komponente abfangen
Ich habe eine Komponente abgeleitet von TComponent. Darin möchte ich auf ein Windows-Ereignis basierend auf WM_DEVICECHANGE reagieren. Normalerweise handle ich sowas in der WndProc ab. Aber in TComponent gibts noch keine WndProc sondern erst in TWinControl. Ich habe aus meiner Komponente aber auch keinen sicheren Durchgriff auf ein Formular mit WndProc.
Wie kann ich ohne Fenster auf WM_Irgendwas-Messages reagieren? |
Re: WM_* Message in Komponente abfangen
Zitat:
|
Re: WM_* Message in Komponente abfangen
Bin mir jetzt gar nicht sicher: Ist TWinControl schon eine sichtbare Komponente? Sprich wenn ich eine selbstgeschriebene TWinControl-Childklasse aus der Komponentenpalette aufs Form lege, hab ich dann ein Non-Visible-Icon oder einen grauen Kasten?
|
Re: WM_* Message in Komponente abfangen
Grundsätzlich ist ein Wincontrol sichtbar, kann aber unsichtbar gemacht werden.
|
Re: WM_* Message in Komponente abfangen
Macht sich dann aber in der IDE doof so ein nichtssagender grauer Kasten.
|
Re: WM_* Message in Komponente abfangen
Zitat:
|
Re: WM_* Message in Komponente abfangen
Ja schon aber nicht-sichtbare Komponenten haben in der IDE einen Rahmen und ein Icon. Eine nur von TWinControl abgeleitete Klasse hätte perse erstmal Höhe und Breite 0, Farbe grau oder schwarz (je nach OS). Das heißt ich müßte da extra für die IDE noch ein paar grafische Routinen bauen.
Es geht ja um eine Redist-Komponente und nichts was nur ich in der IDE verbaue wo ich zur Not was tricksen kann. |
Re: WM_* Message in Komponente abfangen
du kannst mit AllocateHwnd ein handle anfordern und eine windowproc zuweisen
|
Re: WM_* Message in Komponente abfangen
Klasse Tip :)
Ich halte jetzt innerhalb vom TComponent-Ableger eine HWND-Variable vor und im Constructor mach ich ein FWindowHandle:=AllocateHWnd(WndProc) Das funzt vom Feinsten und ich hab Zugriff auf die System-Messages genauso wie ich es wollte. Manchmal braucht man nur nen kleinen Schubs in die richtige Richtung. Danke! |
Re: WM_* Message in Komponente abfangen
vergiss nicht im Destroy (Destructor) das Handle mit DeAllocateHwnd wieder frei zu geben. Und am besten nur während der Laufzeit (also nicht zur Designzeit) das Handle anfordern außer du brauchst es auch zur Designzeit.
mit
Delphi-Quellcode:
kannst du abfragen ob die Komponente gerade im Designer verwendet wird oder ob die Komponente im richtigen Programm genutzt wird.
if csDesigning in ComponentState then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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