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 Refferenz auf TForm über Windowshandle erhalten (https://www.delphipraxis.net/38081-refferenz-auf-tform-ueber-windowshandle-erhalten.html)

danielA 14. Jan 2005 13:27


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

Assarbad 14. Jan 2005 14:30

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 ...

Christian Seehase 14. Jan 2005 14:55

Re: Refferenz auf TForm über Windowshandle erhalten
 
Moin Daniel,

Zitat:

Zitat von danielA
Da ich nicht weiß wie viele Formulare in der künftigen Anwendung existieren werden,

Wenn Du beim Erzeugen eines Formulares als Owner das Application-Objekt angibst, kannst Du einfach mit

Delphi-Quellcode:
for i := 0 to Application.ComponentCount-1 do begin
  if Application.Components[i] is TForm then ...
end;
durch die gesamten Formulare durchgehen, und ansprechen.

danielA 14. Jan 2005 15:55

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:
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;
vielen Dank und Gruß

Daniel

Assarbad 14. Jan 2005 16:15

Re: Refferenz auf TForm über Windowshandle erhalten
 
Zitat:

Zitat von danielA
@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.

Du hast den Pointer aber vorher schon selber per SetProp gesetzt? Das solltest du natürlich machen. Vorzugsweise während WM_CREATE/OnCreate.

danielA 14. Jan 2005 17:00

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