AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ParentForm soll ChildForm nicht löschen

Ein Thema von CGEu · begonnen am 15. Feb 2011 · letzter Beitrag vom 15. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
CGEu

Registriert seit: 20. Mai 2010
Ort: Bayern
14 Beiträge
 
Delphi 10.3 Rio
 
#1

ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 15:18
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
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#2

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 15:29
Was willst du damit eigentlich erreichen?

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

Gruß David
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 15:39
Was ist denn die EIgenschaft Parent des ChildForm nach dem Freigeben von ParentForm
Doch nicht etwa nil

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

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

Geändert von WM_CLOSE (15. Feb 2011 um 15:43 Uhr)
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#4

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 15:44
Nein, da steht noch immer der Verweis auf die alte Parentform drin.
Setze Parent auf nil, bevor Du die Parentform freigibst.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
CGEu

Registriert seit: 20. Mai 2010
Ort: Bayern
14 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 15:44
Was willst du damit eigentlich erreichen?

Kannst du nicht 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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 15:58
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
CGEu

Registriert seit: 20. Mai 2010
Ort: Bayern
14 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 16:09
@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;
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 16:16
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.

Geändert von WM_CLOSE (15. Feb 2011 um 16:23 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 16:25
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?
Andreas
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#10

AW: ParentForm soll ChildForm nicht löschen

  Alt 15. Feb 2011, 16:27
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:43 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