![]() |
Refferenz auf TForm über Windowshandle erhalten
Hallo erstmal,
ich muß innerhalb meiner Anwendung die WNDProc für alle Fenster überschreiben/umleiten. Dazu habe ich mir eine Komponente gebastelt, welche ich auf meinem Hauptformular plaziert habe. Da ich nicht weiß wie viele Formulare in der künftigen Anwendung existieren werden, fange ich die Message WM_ACTIVATE beim deaktivieren des Hauptformulars ab und überprüfe ob das neue Aktive Fenster bereits in der Komponente Registriert ist. Leider bekomme ich beim auslösen von WM_ACTIVATE lediglich das Windowhandle des neuen Aktiven Fensters zurück. Wie bekomme ich aus diesem Handle nun eine Refferenz auf das TFormobjekt. Schonmal vielen Dank im vorraus, Gruß Daniel |
Re: Refferenz auf TForm über Windowshandle erhalten
Du könntest zB in den Fensterdaten oder als Property (GetProp/SetProp) den Objektpointer zu deiner Klasseninstanz ablegen ...
|
Re: Refferenz auf TForm über Windowshandle erhalten
Moin Daniel,
Zitat:
Delphi-Quellcode:
durch die gesamten Formulare durchgehen, und ansprechen.
for i := 0 to Application.ComponentCount-1 do begin
if Application.Components[i] is TForm then ... end; |
Re: Refferenz auf TForm über Windowshandle erhalten
Hallo nochmal,
@Assarbad Ich habe das jetzt mal mit GetProp ausprobiert, bekomme aber beim testweisen Aufruf von GetProp(Form1.Handle,'WindowProc') aber auch anderen Propertys wie 'Name' oder 'WndProc' leider immer 0 zurück. @all Ich habe es jetzt so gemacht wie Christian es vorgeschlagen hat. Den Quelltext habe ich einfach mal mit angehängt. Es werden hier aber leider im ungünstigsten Fall alle Objekte vom Typ TComponent und Nachkommen des Projekts angesprochen. Außerdem werden Formulare, die mit Nil als Owner erzeugt wurden icht gefunden (also MyForm := TForm.CreateNew(Nil))
Delphi-Quellcode:
vielen Dank und Gruß
function TForm1.GetFormFromHandle(FHandle: HWND; ParentComponent : TComponent): TForm;
var i : integer; begin Result:=nil; if (assigned(ParentComponent)) and (FHandle<>0) then begin for i:=0 to ParentComponent.ComponentCount-1 do begin if ParentComponent.Components[i] is TForm then begin if TForm(ParentComponent.Components[i]).Handle=FHandle then begin Result:=TForm(ParentComponent.Components[i]); break; end; end; Result:=GetFormFromHandle(FHandle,ParentComponent.Components[i]); if assigned(Result) then break; end; end; end; Daniel |
Re: Refferenz auf TForm über Windowshandle erhalten
Zitat:
|
Re: Refferenz auf TForm über Windowshandle erhalten
Hallo Assarbad,
nein ich habe den Pointer nicht vorher mit SetProp gesetzt. Ich glaube ich habe den Befehl ein wenig mißverstanden. Ich dachte mit GetProp kann ich bereits existiende Propertys auslesen bzw. mit SetProp umleiten. Da der Programmierer der meine Komponente benutzt nicht weiter mit deren interna beläßtigt werden soll bzw. es wahrscheinlich auch schnell mal vergißt die OnCreate zu schreiben, nützen mir diese beiden Befehle glaube ich nicht unbedingt etwas. Mein eigentliches Problem ist, ich habe mir in Windows neue Messages Definiert, welche von einem Programm an ein anderes geschickt werden sollen. Es wird bei beiden Programmen meine Komponente benutzt. Nun mußten wir feststellen, daß die ganze Sache zwar ganz Prima funktioniert, aber nur solange das Formular der "Clientanwendung" aktiv ist, auf welchem meine Komponente liegt. Sobald ein anderes Formular der "Clientanwendung" aktiv wird, kommen die Messages nicht mehr an. Meine Idee war jetzt, alle Fenster (welche zum Teil auch nur für kurze Zeit dynamisch zur Laufzeit erstellt werden) in meiner Komponente zu registrieren und die WNDProc auf eine Prozedur umzuleiten, welche selbstverständlich die original WNDProc (nicht inherited) am Ende aufruft. Dazu habe ich mir eine Klasse geschrieben, welche den Zeiger auf die Original WNDProc, eine Refferenz auf das Formular und einige andere Sachen kapselt und diese Objekte in ein TListobjekt einträgt. Um Formulare, welche dynamisch erzeugt werden zu "fangen"eignet sich das Abfangen der Message WM_Activate welche auch immer in einem Formular aufgerufen wird welches bereits registriert ist. Um mein Object, welches ich in der TList speichern will zu füllen brauche ich nun aber die Refferenz auf das Form, bekomme aber leider nur dessen Handle. Hast du / habt ihr vielleicht noch eine Idee, wie man das weniger umständlich als wie von mir oben in meinem Quelltext angegeben lösen kann. Grüße und ein schönes Wochenende Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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-2025 by Thomas Breitkreuz