Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ParentForm soll ChildForm nicht löschen (https://www.delphipraxis.net/158378-parentform-soll-childform-nicht-loeschen.html)

CGEu 15. Feb 2011 14:18

ParentForm soll ChildForm nicht löschen
 
Hallo
Ich habe eine ChildForm das bei Programmstart automatisch erzeugt wird, und bis zum Progammende zur Verfügung stehen muss.
Die ParentForm wird bei Bedarf erzeugt und soll dann die ChildForm anzeigen. Wird die ParentForm nicht mehr benötigt, wird der Speicher freigegeben.

Delphi-Quellcode:
ParentForm := TParentForm.Create;
TChildForm.Parent := ParentForm;
TChildForm.Align := alClient;
TChildForm.Show;
...
...
ParentForm.Release;
ParentForm := nil;
Wird die ParentForm das erste mal erzeugt ist alles ok. Beim zweiten Aufruf dann eine Exception, sobald auf die ChildForm zugegriffen wird.

Problem: Wird die ParentForm zerstört (ParentForm.Release) wird wahrscheinlich auch die ChildForm ungültig.

Wie kann ich nun verhindern, dass die ChildForm beim Release vom Parent angefasst wird, so dass ich sie wieder verwenden kann?

Gruß
Christian

David Martens 15. Feb 2011 14:29

AW: ParentForm soll ChildForm nicht löschen
 
Was willst du damit eigentlich erreichen?

Kannst du nicht
Delphi-Quellcode:
TChildForm.visible := false/true;
den gleichen Effekt erzielen?

Gruß David

WM_CLOSE 15. Feb 2011 14:39

AW: ParentForm soll ChildForm nicht löschen
 
Was ist denn die EIgenschaft Parent des ChildForm nach dem Freigeben von ParentForm:!::?:
Doch nicht etwa
Delphi-Quellcode:
nil
:gruebel:

Ach ja, die Variable zu dem ChildForm ist hoffentlich auch nicht "TChildForm"

Ach ja2, das ParentForm ist nicht zufällig auch Application.MainForm?

TBx 15. Feb 2011 14:44

AW: ParentForm soll ChildForm nicht löschen
 
Nein, da steht noch immer der Verweis auf die alte Parentform drin.
Setze Parent auf nil, bevor Du die Parentform freigibst.

CGEu 15. Feb 2011 14:44

AW: ParentForm soll ChildForm nicht löschen
 
Zitat:

Zitat von David Martens (Beitrag 1081844)
Was willst du damit eigentlich erreichen?

Kannst du nicht
Delphi-Quellcode:
TChildForm.visible := false/true;
den gleichen Effekt erzielen?

Gruß David

Dann ist aber die ParentForm noch vorhanden (im Speicher).
Es geht nicht darum, die ChildForm auszublenden, sondern die ParentForm zu zerstören, ohne dass die ChildForm zerstört wird.

Hintergrund: auf der ChildForm befindet sich ein PageControl mit 10 TabSheets und ca. 400 Controls. Das PageControl (ChildForm) wird in mehreren Forms (ParentForm) benötigt. Jetzt dauert das erzeugen des ChildForm ca. 2 Sekunden. Wird das ChildForm immer mit dem ParentForm erzeugt, ist das bei 100 Aufrufen am Tag sehr störend. Deshalb will ich es nur einmal beim Progammstart erzeugen und immer wieder verwenden.

Gruß
Christian

Bernhard Geyer 15. Feb 2011 14:58

AW: ParentForm soll ChildForm nicht löschen
 
Zitat:

Zitat von TBx (Beitrag 1081857)
Setze Parent auf nil, bevor Du die Parentform freigibst.

Sollte funktionieren. Ansonsten ist in der VCL/Windows genau diese Freigabe: Parent freigeben -> Gib alle Childs frei fest einprogrammiert.
Ach ja: TChildForm darf natürlich auch nicht mit Parentform als Owner erzeugt sein. Sonst wird hier der gleiche Mechanismus in der VCL.

CGEu 15. Feb 2011 15:09

AW: ParentForm soll ChildForm nicht löschen
 
@TBx: das mit Parent auf nil setzen mach ich schon, hat aber nichts mit dem Problem zu tun.

@Bernhard: das ChildForm hat die MainForm als Owner (da automatisch bei Progammstart erzeugt von Delphi)

Ok, zur Verdeutlichung mal etwas ausführlicher. Wenn ich auf der MainForm auf einen Button klicke, wird das ParentForm erzeugt. Dieses wiederrum soll unter anderem das ChildForm beinhalten / anzeigen. Das ChildForm wird aber nicht wie das ParentForm mit .Create() erzeugt, sondern ist schon vorhanden.

Delphi-Quellcode:
procedure TfrmMain.ButtonShowClick()
begin
  frmParent := TfrmParent.Create(Self);
  frmParent.Parent := Self;
  ...
  frmParent.Show;
end;

procedure TfrmMain.ButtonCloseClick()
begin
  frmParent.Close;
  frmParent.Release;
  frmParent := nil;
end;

var
  FChild : TfrmChild;

procedure TfrmParent.FormShow()
begin
  FChild := frmChild;
  FChild.Parent := Self;
  FChild.Align := alClient;
  FChild.BorderStyle =: bsNone;
  FChild.Show;
end;

procedure TfrmParent.FormDestroy()
begin
  FChild := nil;
end;

WM_CLOSE 15. Feb 2011 15:16

AW: ParentForm soll ChildForm nicht löschen
 
Vielleicht mal anstatt OnDestroy OnBeforeDestroy verwenden. Vielleicht klappt es dann.

Oder vielleicht OnClose, denn schließlich schiebst du das frmChild im OnShow auf das parentForm

[edit]
Ich sehe gerade es gibt kein OnBeforeClose
Dann eben doch OnClose
[/edit]

Grund: TComponent (von dem ist TForm abgeleitet) zerstör alle childControls, bevor OnDestroy aufgerufen wird.

shmia 15. Feb 2011 15:25

AW: ParentForm soll ChildForm nicht löschen
 
Zitat:

Zitat von CGEu (Beitrag 1081839)
Ich habe eine ChildForm das bei Programmstart automatisch erzeugt wird, und bis zum Progammende zur Verfügung stehen muss.

Warum eigentlich?
Das hört sich für mich irgendwie nicht logisch an.
Das du jetzt hier Probleme bekommst ist für mich ein Zeichen, dass deine Vorgabe das Childform müsse ständig leben grundsätzlich nicht richtig ist.

Ist es vielleicht eher so, dass das Childform sagen wir mal Konfigurationsdaten enthält, die bis zum Programmende gebraucht werden?

WM_CLOSE 15. Feb 2011 15:27

AW: ParentForm soll ChildForm nicht löschen
 
Ich nehme an, das erzeugen des ChildForm dauert einfach so lange, dass es Sinn macht, das als global zu definieren.

Auch wenn es wahrscheinlich mehr Sinn macht, das Kreieren zu beschleunigen.

CGEu 15. Feb 2011 15:29

AW: ParentForm soll ChildForm nicht löschen
 
Zitat:

Zitat von shmia (Beitrag 1081875)
Zitat:

Zitat von CGEu (Beitrag 1081839)
Ich habe eine ChildForm das bei Programmstart automatisch erzeugt wird, und bis zum Progammende zur Verfügung stehen muss.

Warum eigentlich?
Das hört sich für mich irgendwie nicht logisch an.
Das du jetzt hier Probleme bekommst ist für mich ein Zeichen, dass deine Vorgabe das Childform müsse ständig leben grundsätzlich nicht richtig ist.

Ist es vielleicht eher so, dass das Childform sagen wir mal Konfigurationsdaten enthält, die bis zum Programmende gebraucht werden?

siehe Beitrag #5

blauweiss 15. Feb 2011 15:34

AW: ParentForm soll ChildForm nicht löschen
 
Zitat:

Zitat von CGEu (Beitrag 1081870)
@TBx: das mit Parent auf nil setzen mach ich schon, hat aber nichts mit dem Problem zu tun.

Hallo CGEu,

und wann bzw. wo machst Du das ? In Deinem Code steht nichts davon, oder habe ich's übersehen...?
Fehlt da nicht etwas in der Art:
Delphi-Quellcode:
procedure TfrmParent.FormDestroy()
begin
  FChild.Parent := nil;
//  FChild := nil; <- wozu das ??
end;
Gruß
blauweiss

DeddyH 15. Feb 2011 15:46

AW: ParentForm soll ChildForm nicht löschen
 
Den Create-Aufruf den Child würde ich gerne mal sehen.

CGEu 15. Feb 2011 15:51

AW: ParentForm soll ChildForm nicht löschen
 
:wall: :wall: :wall:

@blausweis & TBX: Danke das ihr so hartnäckig mit dem NIL gewesen seid.

Natürlich muss es FChild.Parent := nil sein, und nicht FChild := nil !!!

Kaum macht man´s richtig, ...

@DeddyH: Es gibt keinen Create Aufruf von mir, da ja Delphi die ChildForm automatisch erzeugt.

Thx
Christian

David Martens 15. Feb 2011 15:55

AW: ParentForm soll ChildForm nicht löschen
 
Wie schon gesagt dann erstelle doch die "ChildForm" im MainForm mit owner und parent = MainForm.

Jetzt kannst du:
1. die ChildForm anzeigen und verstecken wie du willst, ohne ParentForm
oder
2. ParentForm erstellen owner und parent auf ParentForm setzen und anzeigen und dann VOR den ParentForm.destroy wieder auf MainForm setzen.


Allerdings finde ich Variante 1 viel besser. Du brauchst doch die ParentForm garnicht.

Gruß David


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 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