Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.
Seite 1 von 2  1 2      

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