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)
GetParentForm
TWinControl.ParentWindow
TWinControl.GetParentHandle
TWinControl.GetTopParentHandle (aufpassen bei
MDI und eingebetteten Forms)