Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi [HowTo] Auf das Parentform eines TFrame zugreifen (https://www.delphipraxis.net/137268-%5Bhowto%5D-auf-das-parentform-eines-tframe-zugreifen.html)

HeikoAdams 17. Jul 2009 12:03


[HowTo] Auf das Parentform eines TFrame zugreifen
 
Hallo,
wer schon einmal in die Verlegenheit gekommen ist, von einem TFrame aus auf das Formular zugreifen zu müssen, auf dem das Frame liegt, wird irgendwann feststellen müssen, dass das TFrame von CodeGear keine Möglichkeit dazu bietet.

Nachfolgend möchte ich eine relativ einfache Möglichkeit vorstellen, wie dies dennoch zu bewerkstelligen ist. Das Zauberwort heißt Vererbung.

Zuerst erstellen wir uns unseren eigenen Nachfahren von TFrame. In diesem definieren wir zuerste eine private Variable FPartenForm vom Typ TForm sowie eine öffentliche Property ParentForm, die ausschließlich lesend auf FPartenForm zugreift.

Anschließend überschreiben wir den Constructor unseres Frames wie folgt:
Delphi-Quellcode:
constructor TMeinFrameForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FParentForm := TForm(AOwner);
end;
Nun kann man in allen Nachfahren von TMeinFrameForm über die Property ParentForm auf das Formular zugreifen, aufdem das Frame liegt :wink:

chaosben 17. Jul 2009 14:15

Re: [HowTo] Auf das Parentform eines TFrame zugreifen
 
Danke das du dein Wissen mit anderen teilst.

Deine Methode wird in den meisten Fällen funktionieren. Sie ist aber nicht sehr sicher.
Besser ist der Zugriff über die "Parent" - Eigenschaft.
Delphi-Quellcode:
if Parent is TForm then
  FParentForm := TForm(Parent)
else
  FParentForm := nil;
Das ganze sollte man dann auch nicht im Konstruktor machen, sondern später, wenn der Parent bekannt ist.

Außerdem sollte man sich ehern nach oben "hangeln" um das Form zu erwischen in dem z.B. ein Panel liegt in dem der Frame liegt.


Und btw.: Das ist nicht Vererbung. :)

worker 17. Jul 2009 14:48

Re: [HowTo] Auf das Parentform eines TFrame zugreifen
 
Zitat:

Zitat von chaosben
Zitat:

Zitat von HeikoAdams
Das Zauberwort heißt Vererbung.

Und btw.: Das ist nicht Vererbung. :)

Darüber bin ich auch zuerst gestolpert ;)
Ich gehe davon aus, dass er meint, dass einem die Möglichkeit, den Constructor zu überschreiben, erst durch Vererbung gegeben wird.
Insofern hat er schon recht, sich nur etwas ungeschickt ausgedrückt :)

Desweiteren gebe ich Dir bzgl. Deiner Anmerkungen natürlich recht. Aus diesem Grund würde ich das Setzen des Parents auch nicht über die Property von außen ermöglichen, sondern direkt im Constructor ausführen.
Delphi-Quellcode:
Constructor TMeinFrameForm.Create(AOwner: TWinControl);
Begin
   Inherited Create(AOwner);
   Parent := AOwner;
End;

HeikoAdams 17. Jul 2009 15:08

Re: [HowTo] Auf das Parentform eines TFrame zugreifen
 
Zitat:

Zitat von worker
Aus diesem Grund würde ich das Setzen des Parents auch nicht über die Property von außen ermöglichen, sondern direkt im Constructor ausführen.

Wo habe ich geschrieben, das die Property von außen beschreibbar ist.

Okay, ich habe in dem Satz
Zitat:

... sowie eine öffentliche Property ParentForm, die lesend auf FPartenForm zugreift. ...
nicht explizit erwähnt, das die Property nicht schreibend auf die Variable zugreifen kann, aber eigentlich sollte das doch schon eindeutig genug sein. Ich habe den Satz trotzdem noch um das Wörtchen "ausschließlich" ergänzt. 8)

worker 17. Jul 2009 15:17

Re: [HowTo] Auf das Parentform eines TFrame zugreifen
 
Hallo Heiko,

meine Aussage war an chaosben gerichtet, nicht an Dich.

Zitat:

Das ganze sollte man dann auch nicht im Konstruktor machen, sondern später, wenn der Parent bekannt ist.
=> das impliziert das Setzen des Parents von außen ;)

HeikoAdams 17. Jul 2009 15:45

Re: [HowTo] Auf das Parentform eines TFrame zugreifen
 
Zitat:

Zitat von worker
Hallo Heiko,
meine Aussage war an chaosben gerichtet, nicht an Dich.
Zitat:

Das ganze sollte man dann auch nicht im Konstruktor machen, sondern später, wenn der Parent bekannt ist.
=> das impliziert das Setzen des Parents von außen ;)

Da stimme ich Dir zu. Zumal die ganze Aktion hier ja witzlos ist, wenn man den Parent eben nicht im Konstruktor setzt. Immerhin soll dieses Vorgehen ja Arbeit abnehmen 8)

Uwe Raabe 17. Jul 2009 18:15

Re: [HowTo] Auf das Parentform eines TFrame zugreifen
 
Zitat:

Zitat von chaosben
Besser ist der Zugriff über die "Parent" - Eigenschaft.

Wenn der Frame auf einem Panel liegt, dann zeigt Parent auf dieses Panel. Insofern ist deine Lösung nur der erste Schritt des richtigen Weges.

Hier eine Methode, die ohne jegliche Vererbung auskommt, für alle TControls funktioniert und auch dynamischen Änderungen des "ParentForms" gerecht wird. Es ist nämlich durchaus möglich, ein Frame (oder jedes andere Control) von einem Form auf ein anderes zu verlagern, indem man lediglich dem Parent einen neuen Wert zuweist.

Delphi-Quellcode:
function GetParentForm(Control: TControl): TForm;
var
  WinControl: TWinControl;
begin
  Assert(Control <> nil, 'nil not allowed!');
  WinControl := Control.Parent;
  while WinControl <> nil do begin
    if WinControl is TForm then
      Break;
    WinControl := WinControl.Parent;
  end;
  result := WinControl as TForm; // nil ist hier durchaus erlaubt
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf