AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi [HowTo] Auf das Parentform eines TFrame zugreifen

[HowTo] Auf das Parentform eines TFrame zugreifen

Ein Tutorial von HeikoAdams · begonnen am 17. Jul 2009 · letzter Beitrag vom 17. Jul 2009
Antwort Antwort
Benutzerbild von HeikoAdams
HeikoAdams
Registriert seit: 12. Jul 2004
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
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
 
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#2
  Alt 17. Jul 2009, 13:15
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.
Benjamin Schwarze
  Mit Zitat antworten Zitat
worker
 
#3
  Alt 17. Jul 2009, 13:48
Zitat von chaosben:
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;
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

 
FreePascal / Lazarus
 
#4
  Alt 17. Jul 2009, 14:08
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)
  Mit Zitat antworten Zitat
worker
 
#5
  Alt 17. Jul 2009, 14:17
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
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

 
FreePascal / Lazarus
 
#6
  Alt 17. Jul 2009, 14:45
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)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

 
Delphi 12 Athens
 
#7
  Alt 17. Jul 2009, 17:15
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;
Uwe Raabe
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

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 10:45 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