AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

Ein Thema von KodeZwerg · begonnen am 4. Aug 2020 · letzter Beitrag vom 4. Aug 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 08:24
Guten Morgen, wiedermal "Eigene Komponente"-Thema

Wie gelangt ihr in Euren Komponenten (falls erforderlich) an das Handle vom Aufrufer-Fenster?

Ich mache es zur Zeit so:
Delphi-Quellcode:
uses Vcl.Forms;

constructor TKomponente.Create(AOwner: TComponent);
begin
  FParentWnd := (AOwner as TForm).Handle;
end;
Ich möchte aber von Vcl.Forms wegkommen. Hat jemand eine Idee wie ich an das gleiche Resultat für FParentWnd komme wie oben gezeigt?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.447 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 09:38
Kathinka sagt:
Eigentlich sollte eine Komponente das Parent gar nicht kennen müssen und erst recht nicht dessen Handle. So wie Du es machst erzwingst Du nun auch dass ein Handle erzeugt wird.
Ich selber mache auch keine Komponenten mehr seit es die TFrames gibts. Die finde ich im Handling viel einfacher.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.613 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 09:51
Guten Morgen, wiedermal "Eigene Komponente"-Thema

Wie gelangt ihr in Euren Komponenten (falls erforderlich) an das Handle vom Aufrufer-Fenster?

Ich mache es zur Zeit so:
Delphi-Quellcode:
uses Vcl.Forms;

constructor TKomponente.Create(AOwner: TComponent);
begin
  FParentWnd := (AOwner as TForm).Handle;
end;
Das funktioniert nicht unbedingt: Owner muss nicht notwendigerweise ein TForm sein. Es kann z.B. ein Frame sein, oder eine sonstige Komponente, die explizit im Code beim Aufruf des Constructors übergeben wurde:

  bal := TKomponente.Create(ed_blub);
Theoretisch geht auch NIL, also solltest Du auch das prüfen.

Sinnvoller wäre aber vermutlich sowieso Parent statt Owner, denn Owner kann ein beliebiges TComponent sein, welches evtl. gar kein Window-Handle hat. Parent ist immer ein TWinControl, hat also ein Window-Handle.

Wenn ich mich recht erinnere, gibt es eine GetOwnerForm-Methode (oder war's GetParentForm?) in TComponent.
Thomas Mueller

Geändert von dummzeuch ( 4. Aug 2020 um 10:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#4

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 10:00
Wie gelangt ihr in Euren Komponenten (falls erforderlich) an das Handle vom Aufrufer-Fenster?
Was verstehst du denn genau unter dem Aufrufer-Fenster?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#5

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 10:01
Ein HWND ist nicht unveränderlich, denn es kann unter Umständen entladen und neu erstellt werden.
Auch muß es beim Erstellen/Laden der Form noch nichtmal existieren.

Besser das Handle immer bei Benutzung (maximal zu Beginn jeder Methode) frisch besorgen.


Wenn man das Handle "aktuell" nicht unbeding "sofort" benötigt, dann kann man auch HandleAllocated prüfen, bevor man auf Handle zugreift.


Zitat:
Delphi-Quellcode:
constructor TKomponente.Create(AOwner: TComponent);
begin
  FParentWnd := (AOwner as TForm).Handle;
end;
Wieso willst du von Vcl.Forms wegkommen? FMX?
Bzw. was meinst du mit "wegkommen"?

Zitat:
Das funktioniert nicht unbedingt: Owner muss nicht notwendigerweise ein TForm sein.
Genau, darum geht man auch nicht über die Owner-Beziehungen, sondern nimmt die Parent-Beziehungen.
Außer man definiert fpr seine Klasse, dass der Owner unbedingt eine Form sein muß, was hier implizit gemacht wird, denn AS lässt ausschließlich TForms oder NIL zu.
Aber wie immer in der Verärbung sollte man besser TCustomForm für den Cast verwenden, anstatt TForm. (Beispiel: siehe Result von GetParentForm)

Delphi-Referenz durchsuchenGetParentForm
Delphi-Referenz durchsuchenTWinControl.ParentWindow
Delphi-Referenz durchsuchenTWinControl.GetParentHandle
Delphi-Referenz durchsuchenTWinControl.GetTopParentHandle (aufpassen bei MDI und eingebetteten Forms)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Aug 2020 um 10:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 10:06
Hi,
das obige dient zur demonstration was ich erreichen will. Ja checking muss noch rein.

Ich wollte ja von Vcl.Forms weg und nicht noch tiefer darin versumpfen.
Das GetParentForm ist auch nur in der Forms Unit enthalten.

Danke schonmal für's Lesen.


Sinn und Zweck soll sein:
Später generiere ich dynamisch Fenster die von der Parent-Position abhängig sind, also ohne ein Fenster-Handle klappt dies nicht.
Dann generier ich noch etwas, was einen direkten Bezug zum Parent bekommt (per CreateWindowEx mit FParentWnd als hWndParent parameter).


Zitat:
Besser das Handle immer bei Benutzung (maximal zu Beginn jeder Methode) frisch besorgen
@himitsu: Vorschläge "Wie" sind mehr als erwünscht


Aufrufer-Fenster: Das Fenster wo meine Komponente raufgezogen wurde.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#7

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 10:18
Aufrufer-Fenster: Das Fenster wo meine Komponente raufgezogen wurde.
Das könnte dann ja auch ein TPanel, eine TGRoupBox, ein TFrame oder ein TTabSheet sein. In dem Fall ist wohl GetParentHandle die beste Wahl.

Oder soll es immer das TForm sein? (wobei auch ein TForm in ein anderes TWinControl eingebettet sein kann - z.B. im IDE Embedded Designer)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 10:32
Das werde ich heute Abend mal durchtesten, GetParentHandle sieht vielversprechend aus.

Vielen Dank für Input!


IdR. kann meine Komponente nur auf Hauptfenster gezogen werden und nicht eingebettet werden da es eine nicht-visuelle Komponente ist.
(man sieht im Designer nur das kleine Rechteck auf dem Formular.)
Per code wiederum ist, wie dummzeuch richtig schreibt, alles möglich.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#9

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 14:56
Unabhängig von GetParentHandle und Co.


Wenn du eine VCL-Komponente baust, dann ist die VCL so oder so im Programm,
womit es keinen Grund gibt, warum diese Unit auch in deinem USES nicht drin sein sollte. (es macht einfach keinen Unterschied)

Fazit: Falls man Funktionen/Typen davon braucht, dann nehme man sie, mache sich das Leben leicherter und erspare sich sonstwelche komischen Hacks.
Ist auch viel unanfälliger für Fehler.





Was leider nicht wirklich machbar ist, auch wenn es theoretisch ginge.
Eine Nichtvisuelle-Komponente für FMX und VCL, die aber auf andere visuelle Komponenten Zugriff haben soll.

Denn sowas wie {$IFDEF FMX} gibt es nicht, womit man zwar Code schreiben könnte, der mit VCL und FMX kann, aber dann nur mit kranken Hacks
oder indem man alle Units von VCL und FMX einbinden müsste, was im Windows ginge (auch wenn es nicht schön wäre), aber ansonsten wunderschön abraucht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Aug 2020 um 15:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Eigene Komponente -> Handle vom Aufruf-Fenster bekommen?

  Alt 4. Aug 2020, 15:35
An himitsu,

wie immer überrascht mich Dein umfangreiches Wissen und vor allem auch die vielen definitionen/methoden die Du so aus dem Ärmel schüttelst!

Aber nein, ich habe keine Vcl erstellt, Vcl ist bei mir auch nur mit "Vcl.Forms" eingebunden weil ich halt das Handle bzw "TForm" brauchte um da ran zu kommen, mehr nicht.
Zu keinem anderen Zeitpunkt in meinem Komponenten-Project benötige ich das außer da oben.
Ich greife auch auf nichts vom Caller zu, abgesehn einer Positions- und Dimensionsabfrage interessiert mich der Caller nicht.
Alles was bei mir zZ. passiert ist WinApi (ich trauer immer noch wegen M.Puff).
Entwickelt für Windows samt Abfragen die das auch sicherstellen bevor der Pc sich in einen Zombie verwandelt.

Wo ich ins stottern gekommen bin war die stelle "vor" und "nach" dem einbinden dieser Unit. Die hat meine bpl Dateigröße grob verfünzigfacht, aus 35kb wurde ein megabyte.
Nicht das mich das stört, aber irgendwie doch

Da ich generell neugierig bin wollte ich weitere Anlaufpunkte finden, drei habe ich ja nun Dank Dir. Danke nochmal!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:22 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