AGB  ·  Datenschutz  ·  Impressum  







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

Warum macht ein TForm.Close nicht NIL

Ein Thema von Eurowig · begonnen am 8. Mai 2008 · letzter Beitrag vom 8. Mai 2008
Antwort Antwort
Seite 2 von 3     12 3      
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 11:29
Zitat von Eurowig:
In der Delpi Hilfe steh:
Mit Release können Sie das Formular aus dem Speicher entfernen.

Dieser Info habe ich auch bisher Glauben gescheckt.
Ja und? Das wird doch auch erfüllt.

Deine Variable ist nur eine Referenz auf den Speicher des Formulars. Du bist wirklich der Meinung, dass Delphi einen riesigen Verwaltungsaufwand treibt um im folgenden Beispiel alle diese Variablen auf NIL zu setzen, weil sie alle auf das eine Formular verweist?

Delphi-Quellcode:
var
  Form1, Form2, Form3, Form4, Form5, FormWhatever: TForm;
begin
  Form1 := TForm.Create(nil); // eine Instanz
  Form2 := Form1;
  Form3 := Form1;
  Form4 := Form1;
  Form5 := Form1;
  FormWhatever := Form1;

  // Nun zeigen alle diese Variablen auf dieses eine Formular.

  Form1.Release; // Formular freigeben

  // Nun ist der vom Formular belegte Speicher freigegeben. Aber alle Variablen von Form1 bis FormWhatever
  // enthalten aber immernoch die Adresse die das Formular hatte. Nur der Speicher an der Adresse ist wieder
  // verfügbar.

  // Irgendwelche Zugriffe auf Form1 bis FormWhatever sind tödlich!

  // Delphi müsste einen riesigen Verwaltungsaufwand treiben um alle Variablen auf NIL zu setzen. Schon allein
  // folgendes setzt (natürlich) nicht gleich alle Variablen auf nil:

  Form1 := nil;

  // Hiernach sind Form2 bis FormWhatever noch immer mit der alten Adresse gefüllt.
Anderes Beispiel:

Ein Freund von dir zieht um und hat eine neue Adresse. Du schreibst seine neue Adresse in dein Adressbuch, aber trotzdem sind nicht automatisch alle anderen Stellen wo die Adresse vermerkt wurde mit geändert: Outlook Buch, Telefon, etc.

Die Variablen die die Instanz der Form aufnehmen sind an unterschiedlicher Stelle im Speicher und sind jeder für sich. Diese Variablen verweisen nur an eine Stelle mit der Form Instanz.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 11:31
Zitat von Muetze1:
Deine Variable ist nur eine Referenz auf den Speicher des Formulars. Du bist wirklich der Meinung, dass Delphi einen riesigen Verwaltungsaufwand treibt um im folgenden Beispiel alle diese Variablen auf NIL zu setzen, weil sie alle auf das eine Formular verweist?
Das würde nur in einer managed Umgebung wie .NET oder Java gehen (und dort auch nicht für Ressourcen). Jedoch nachträglich ein Programm GC-Tauglich zu machen ist aufwendig.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#13

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:08
Zitat von mkinzler:
Wird die Variable noch genutzt dann FreeAndNil() sonst MyForm.Free;
Was bringt mir ein MyForm.Free, wenn ich die Variable noch nutzen möchte? Wird mit Free nicht der Speicher der MyForm freigegeben und die noch in MyForm hinterlegte Speicheradresse verweist dann auf freigegeben Speicher?!

Ich hab bisher immer caFree oder eben FreeAndNil verwendet. Wenn ich nun Release statt FreeAndNil verwende, muss ich doch MyForm nach dem Release noch "nilen", oder? Wenn ja, gibt das dann keine unschönen Nebeneffekte, da Release laut Hilfe nicht wartet bis alles freigegeben wurde und so man theoretisch MyForm schon Nil zuweist bevor Release im Hintergrund überhaupt fertig ist.

Ist die CloseAction caFree eher mit FreeAndNil oder mit Release vergleichbar?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:20
Daher habe ich ja geschrieben, wenn genutzt wird FreeAndNil()
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:21
Oh, da hab ich doch glatt was vertauscht - sorry.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Eurowig
(Gast)

n/a Beiträge
 
#16

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:26
@hitzi
caFree ist dann wohl eher ein Release und kein FreeAndNil.

Wenn also das Formular nach dem Close nicht mehr benötigt wird bzw. nicht mehr vorhanden sein darf ist

Delphi-Quellcode:
MyForm.Close; <<< eventuelle OnClose Routinen ausführen
FreeAndNil(MyForm); <<< nilen und Speicher freigeben
wohl eine gute Lösung.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#17

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:30
Zitat von Eurowig:
wohl eine gute Lösung.
Was nun? Ist FreeAndNil oder Release die bessere Lösung bei folgenden Code?
Delphi-Quellcode:
frmTest := TfrmTest.Create(Application);
try
  frmTest.ShowModal;
finally
  //was nun?
  frmTest.Release;
  //oder
  FreeAndNil(frmTest);
end;
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:32
.Release ändert den Wert der Referenzvariable nicht!
Markus Kinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#19

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:35
Release ist definitiv die bessere Lösung.

Und egal ob Close oder Release: man kann beides ohne Delphi-Referenz durchsuchenFreeAndNil() nutzen, wenn man z.B. im FormDestroy des jeweiligen Formulars einfach die Instanzenvariable selbst mit NIL zuweist.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#20

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:49
Ok, dann so:
Delphi-Quellcode:
frmTest := TfrmTest.Create(Application);
try
  frmTest.ShowModal;
finally
  //was nun?
  frmTest.Release;
  frmtest := nil;
  //oder
  FreeAndNil(frmTest);
end;
Ich seh immer noch nicht so richtig den Unterschied, außer dass Release nicht wartet bis dass zu entfernende Fenster fertig mit allen Botschaften ist. Was passiert, wenn ich Release verwende um beim Beenden des Programmes die Unterfenster zu schließen? Das Release fängt an das Unterfenster zu entfernen und gibt die Kontrolle noch bevor es fertig ist wieder zurück an das Hauptprogramm. Dieses schließt sich nun selber. Was aber, wenn das Release des Unterfensters länger als das Beenden des Programmes dauert?

Theoretisches Beispiel:
Delphi-Quellcode:
frmTest := TfrmTest.Create(Application);
try
  frmTest.ShowModal;
finally
  //was nun?
  frmTest.Release; //dauert 5 Sekunden - warum auch immer, aber laut Hilfe: Release gibt die Steuerung sofort an die aufrufende Routine zurück und wartet nicht, bis das Formular freigegeben wird.
  //Alles ab hier wird also ausgeführt bevor frmTest.Release überhaupt fertig ist.
  frmtest := nil;
end;
Close; //Programm selber beenden - was aber wenn frmTest.Release noch läuft?
@Muetze: meinst du das so?
Delphi-Quellcode:
procedure TfrmTest.FormDestroy(Sender: TObject);
begin
  Self := nil; //so?
end;
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 07:18 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