AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Refferenz auf TForm über Windowshandle erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Refferenz auf TForm über Windowshandle erhalten

Ein Thema von danielA · begonnen am 14. Jan 2005 · letzter Beitrag vom 14. Jan 2005
Antwort Antwort
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#1

Refferenz auf TForm über Windowshandle erhalten

  Alt 14. Jan 2005, 14:27
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
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#2

Re: Refferenz auf TForm über Windowshandle erhalten

  Alt 14. Jan 2005, 15:30
Du könntest zB in den Fensterdaten oder als Property (GetProp/SetProp) den Objektpointer zu deiner Klasseninstanz ablegen ...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Refferenz auf TForm über Windowshandle erhalten

  Alt 14. Jan 2005, 15:55
Moin Daniel,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#4

Re: Refferenz auf TForm über Windowshandle erhalten

  Alt 14. Jan 2005, 16:55
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
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#5

Re: Refferenz auf TForm über Windowshandle erhalten

  Alt 14. Jan 2005, 17:15
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.
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#6

Re: Refferenz auf TForm über Windowshandle erhalten

  Alt 14. Jan 2005, 18:00
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz