Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_* Message in Komponente abfangen (https://www.delphipraxis.net/76970-wm_%2A-message-komponente-abfangen.html)

Codehunter 12. Sep 2006 22:09


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?

mkinzler 12. Sep 2006 22:15

Re: WM_* Message in Komponente abfangen
 
Zitat:

Wie kann ich ohne Fenster auf WM_Irgendwas-Messages reagieren?
Direkt garnicht. Leite sie doch von TWinControl ab.

Codehunter 12. Sep 2006 22:19

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?

mkinzler 12. Sep 2006 22:23

Re: WM_* Message in Komponente abfangen
 
Grundsätzlich ist ein Wincontrol sichtbar, kann aber unsichtbar gemacht werden.

Codehunter 12. Sep 2006 22:28

Re: WM_* Message in Komponente abfangen
 
Macht sich dann aber in der IDE doof so ein nichtssagender grauer Kasten.

mkinzler 12. Sep 2006 22:41

Re: WM_* Message in Komponente abfangen
 
Zitat:

Macht sich dann aber in der IDE doof so ein nichtssagender grauer Kasten.
Eine nicht visuelle Komponente ist in der IDE auch sichtbar.

Codehunter 12. Sep 2006 22:45

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.

SirThornberry 12. Sep 2006 22:56

Re: WM_* Message in Komponente abfangen
 
du kannst mit AllocateHwnd ein handle anfordern und eine windowproc zuweisen

Codehunter 12. Sep 2006 22:59

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!

SirThornberry 12. Sep 2006 23:01

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:
if csDesigning in ComponentState then
kannst du abfragen ob die Komponente gerade im Designer verwendet wird oder ob die Komponente im richtigen Programm genutzt wird.

Codehunter 13. Sep 2006 00:09

Re: WM_* Message in Komponente abfangen
 
Danke, noch ein guter Tip @DeAllocateHwnd. Hätte ich glatt vergessen.

Wenn man mal logisch drüber nachdenkt ist es ja klar daß TComponent-Ableger an die Windows-Messages herankommen können MÜSSEN weil TWinControl ja auch nur ein Ableger von TComponent ist. Nur weiß man bei Delphi ja nie ob es alles mit rechten Dingen zugeht oder ob da wieder "Compiler Magic" im Spiel ist.


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