AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit Tform und free

Ein Thema von R2009 · begonnen am 28. Okt 2010 · letzter Beitrag vom 28. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2      
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Problem mit Tform und free

  Alt 28. Okt 2010, 06:52
Hi DP'ler,

ich habe ein Problem mit dem dynamischen erzeugen und zerstören einer Form.

Delphi-Quellcode:
 If form_adressing=nil then
   begin
     Application.CreateForm(Tform_adressing, form_adressing);
   end;
  form_adressing.showmodal;
  form_adressing.destroy;
  form_adressing.free;
Rufe ich diesen Code zum ersten mal auf geht alles gut alles funktioniert. Rufe ich ihn zum zweiten Mal auf so erscheint eine Meldung: Object freed. Dies geschieht obwohl er die create Methode durchlaufen hat.
Die Form ist unter Delphi erstellt und.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 07:08
Hallo,

Delphi-Quellcode:
var
  Form: TForm_Adressing; // lokale Variable
begin
  Form:= TForm_Adressing.Create(NIL);
  try
    Form.ShowModal;
  finally
    FreeAndNIL(Form);
   // oder
   // Form.Free; Form:= NIL;
  end;
Das von Delphi automatisch als globale Variable erstellte form_adressing
läßt du gleich ganz liegen.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 08:09
Delphi-Quellcode:
var Form: TForm_Adressing; // lokale Variable

Form := TForm_Adressing.Create(NIL);
try
  Form.ShowModal;
finally
  Form.Free;
end;
FreeAndNil ist hier eigentlich nicht nötig

Delphi-Quellcode:
with TForm_Adressing.Create(NIL) do
  try
    ShowModal;
  finally
    Free;
  end;
$2B or not $2B
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 08:09
Hi Hoika,

danke für deine Hilfe.
Freeandnil hat das Problem gelöst. Mir ist zwar nicht klar warum aber es funktioniert.
Destroy ist der destructor von Tform.
Wenn ich form.destroy und form:=nil aufrufe müsste das doch eigentlich genauso funktionieren wie bei Freeandnil.

Danke
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 08:16
Hallo,

Destroy ruft man nie selber auf, wenn dann Free.
Ich habe das FreeAndNIL genommen, weil du vorher noch auf <>NIL geprüft hattest,
das Free hätte hier aber gereicht.

Bei

Delphi-Quellcode:
Form.Free;
Form:= NIL;
würde vielleicht sogar der Compiler einen Hinweis bringen,
dass das Form:= NIL sinnloser Code ist.


Heiko
Heiko
  Mit Zitat antworten Zitat
knochen

Registriert seit: 26. Aug 2009
81 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 08:24
Auszug aus der Delphi Hilfe:

Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free [...] benutzen.

Die Gründe dafür stehen in der Hilfe.

Bezogen auf den Code des Fragestellers würde das für den Code heißen:

Delphi-Quellcode:
if form_adressing = nil then
begin
  Application.CreateForm(Tform_adressing, form_adressing);
end;
form_adressing.ShowModal;
form_adressing.Release;
form_adressing := nil;
A fool with a tool remains a fool.

Geändert von knochen (28. Okt 2010 um 08:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 08:43
Auszug aus der Delphi Hilfe:

Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free [...] benutzen.

Delphi-Quellcode:
if form_adressing = nil then
begin
  Application.CreateForm(Tform_adressing, form_adressing);
end;
form_adressing.ShowModal;
form_adressing.Release;
form_adressing := nil;
Ich kenne jetzt den Code drumherum nicht, aber befindet der Code sich an dieser Stelle in einer Ereignisbehandlungsroutine der Form???
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 09:16
Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free [...] benutzen.

Die Gründe dafür stehen in der Hilfe.
Bei Verwendung von ShowModal zum Anzeigen sorgt schon der Code in ShowModal dafür das kein Problem auftritt. Bei Verwendung von Show für einen nicht Modalen Dialog ist Release angebracht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 09:28
Wir hätten also 4 Wege um ein Formular freizugeben:
1.) Destroy
2.) Free
3.) FreeAndNil
4.) Release
Was soll man jetzt nehmen?

Destroy darf man nur aufrufen, wenn man 1000% sicher ist, dass das Objekt exisitiert:
Delphi-Quellcode:
var Form: TForm_Adressing; // lokale Variable
begin
  Form := TForm_Adressing.Create(NIL);
  try
    Form.ShowModal;
  finally
    Form.Destroy; // erlaubt, da garantiert ist dass "Form" <> nil
  end;
Mit Destroy kann man einige CPU-Zyklen sparen; allerdings sollte man doch besser Free verwenden.
Wir streichen also Destroy aus unserem Spielraum und merken uns dass man Destroy theoretisch verwenden kann.

FreeAndNil macht dann Sinn, wenn die Objektvariable nicht lokal, sondern global ist und ausserdem an anderen Stellen im Sourcecode mit Assigned abgeprüft wird.

Lokale Objekte werden immer mit Free freigegeben.
Dies gilt auch für globale Formularobjekte, wenn man sicher ist, dass nirgends mehr
auf diese Variable zugegriffen wird.

Release ist wiederum eine ganz spezielle Methode.
Wenn man z.B. mitten im OnClick-Event eines Formulars ist und Free aufrufen würde,
dann würde man sich das Objekt unterm Hintern weglöschen.
Mit der Folge einer Zugriffsverletzung.
Release schickt eine Windows-Message an das eigene Formular.
Diese Message wird erst empfangen und verarbeitet, wenn das Formular alle anderen
Messages verarbeitet hat.

Wir halten fest:
Destroy - Finger weg
Free - die Standardmethode
FreeAndNil - sparsam einsetzen; nur dort wo es Sinn macht
Release - nur verwenden, wenn das Formular sich selbst aus einem Event heraus freigeben möchte
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#10

AW: Problem mit Tform und free

  Alt 28. Okt 2010, 12:28
Hallo sx2008,

klasse Beitrag von Dir, sowohl inhaltlich als auch vom Aufbau. Danke !

Grüße,
blauweiss
  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 10:01 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