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 1 von 3  1 23      
Eurowig
(Gast)

n/a Beiträge
 
#1

Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 11:55
Hi.

Ein TForm.Close lässt eigentlich vermuten, dass das Objekt weg ist. Aber das ist es nicht immer, bzw. nicht sofort.

Delphi-Quellcode:
MyForm := TMyForm.Create(MainForm);
MyForm.Show;

...
...
MyForm.Close;

...
...
if MyForm <> NIL then
begin
  ShowMessage('Bin verwirrt. Warum bist du nicht NIL???')
end;
Damit ich auf NIL prüfen kann musste ich noch das 'Close' ergänzen

Delphi-Quellcode:
MyForm.Close;
FreeAndNil(MyForm);
Meine Frage: Ist das nun gut oder schlecht. Wenn ein Objekt auf NIL gesetzt wird was ist dann mit dem Speicher. Räumt Delphi trotzdem auf oder hab ich ein Speicherleck??
Ein 'TForm.Close' macht einen 'Release'. Bisher dachte ich damit wäre alles aus dem Speicher raus. Jetzt musste ich mit Erstaunen feststellen, dass dem nicht so ist.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Herr 'Close' und Frau 'NIL'

  Alt 8. Mai 2008, 11:59
So amüsant wie dein Threadtitel auch ist, er ist nicht sehr hilfreich, wenn es um die kurze Beschreibung deines Problems geht., Bitte ändere ihn in einen aussagekräftigen Titel.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Herr 'Close' und Frau 'NIL'

  Alt 8. Mai 2008, 12:00
Ein Glück, dass es nicht so ist.
Die Methode "Close" schließt das Fenster nur, aber es bleibt weiterhin vollständig im Speicher vorhanden und wartet nur darauf, mittels "Show()" wieder angezeigt zu werden. Bei Fenstern gelten leicht andere Spielregeln, hier solltest Du im Allgemeinen die Methode "Release" nehmen, um es aus dem Speicher zu entfernen. Das erlaubt dem Fenster, noch ein paar Aufräumarbeiten zu erledigen.

[edit]
... und dann natürlich das, was Luckie in Bezug auf den Thementitel sagte.
[/edit]
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Herr 'Close' und Frau 'NIL'

  Alt 8. Mai 2008, 12:00
Hi,

das Objekt wird bei Close nicht unbedingt freigegeben, das hängt davon ab, was du im OnClose zurückgibst (Action = caFree --> Freigabe, ansonsten nicht).

Mit .Free oder FreeAndNil hingegen wird das Formularobjekt immer freigegeben, aber nur bei FreeAndNil wird es auch auf nil gesetzt, ansonsten verweist deine Variable immer noch an die Stelle, an der das Objekt vorher lag.

[edit] Wie wärs denn damit:

Delphi-Quellcode:
procedure ReleaseAndNil(var X: TCustomForm); //inline;
begin
  if Assigned(X) then
  begin
    X.Release;
    X := nil;
  end;
end;
[/edit]

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Eurowig
(Gast)

n/a Beiträge
 
#5

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:19
Zitat von Daniel:
... hier solltest Du im Allgemeinen die Methode "Release" nehmen, um es aus dem Speicher zu entfernen. Das erlaubt dem Fenster, noch ein paar Aufräumarbeiten zu erledigen.
Ein TForm.Close macht ein 'Release' oder etwa nicht ??

Auszug Forms.pas
Delphi-Quellcode:
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;

In der Delpi Hilfe steh:
Mit Release können Sie das Formular aus dem Speicher entfernen.

Dieser Info habe ich auch bisher Glauben gescheckt.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:23
Zitat von Eurowig:
Ein TForm.Close macht ein 'Release' oder etwa nicht ??
Aber doch nur wenn im OnClose caFree als CloseAction angegeben ist.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#7

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:24
Delphi-Referenz durchsuchenTCustomForm.OnClose
Zitat von Delphi Hilfe:
Das Ereignis OnClose wird beim Schlieen des Formulars ausgelst.

type
TCloseAction = (caNone, caHide, caFree, caMinimize);

TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

property OnClose: TCloseEvent;

Beschreibung

Mit OnClose knnen Sie spezielle Verarbeitungen durchfhren, wenn das Formular geschlossen wird. Sie knnen in der zugehrigen Ereignisbehandlungsroutine beispielsweise prfen, ob in allen Feldern eines Dateneingabeformulars gltige Eingaben vorgenommen wurden.

Ein Formular wird geschlossen, nachdem die Methode Close aufgerufen oder im Systemmen die Option Schlieen gewhlt wurde.

Der Typ TCloseEvent zeigt auf eine Methode, die fr das Schlieen des Formulars zustndig ist. Der Parameter Action bestimmt, ob das Formular tatschlich geschlossen wird. Er kann die folgenden Werte annehmen:

Wert Bedeutung

caNone Das Formular darf nicht geschlossen werden, daher geschieht nichts.
caHide Das Formular wird nicht geschlossen, sondern lediglich verborgen. Die Anwendung kann nach wie vor auf das Formular zugreifen.
caFree Das Formular wird geschlossen und sein Speicher freigegeben.
caMinimize Das Formular wird nicht geschlossen, sondern als Symbol angezeigt. Bei untergeordneten MDI-Formularen ist dies die Standardeinstellung.

Enthlt bei einem untergeordneten MDI-Formular die Eigenschaft BorderIcons den Wert biMinimize, wird caMinimize als Standardaktion verwendet. Ist diese Eigenschaft nicht gesetzt, erhlt Action den Standardwert caNone, und beim Schlieen des Formulars werden keine speziellen Verarbeitungen durchgefhrt.

Bei einem untergeordneten SDI-Formular wird Action der Standardwert caHide zugewiesen.

Um das Formular in einer Ereignisbehandlungsroutine fr OnClose zu schlieen und freizugeben, setzen Sie Action auf caFree.

Hinweis: Beim Beenden der Anwendung tritt das Ereignis OnClose nur im Hauptformular, aber nicht in den untergeordneten Formularen auf.
(Umlaute sind beim Kopieren übers VNC verloren gegangen ...)
  Mit Zitat antworten Zitat
Eurowig
(Gast)

n/a Beiträge
 
#8

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:25
Ohhh neee

Jetzt hab ichs gesehen. Wenn ich im OnClose keine CloseAction definiere (z.B. caFree), macht es ein caHide.

Aber wie nun:
Delphi-Quellcode:
MyForm.Close;
MyForm.Release;
oder
Delphi-Quellcode:
MyForm.Close;
FreeAndNil(MYform)
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#9

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:26
Nur MyForm.Release für deine Zwecke.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Warum macht ein TForm.Close nicht NIL

  Alt 8. Mai 2008, 12:27
Wird die Variable noch genutzt dann FreeAndNil() sonst MyForm.Free;
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:06 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