![]() |
Warum macht ein TForm.Close nicht NIL
Hi.
Ein TForm.Close lässt eigentlich vermuten, dass das Objekt weg ist. Aber das ist es nicht immer, bzw. nicht sofort.
Delphi-Quellcode:
Damit ich auf NIL prüfen kann musste ich noch das 'Close' ergänzen
MyForm := TMyForm.Create(MainForm);
MyForm.Show; ... ... MyForm.Close; ... ... if MyForm <> NIL then begin ShowMessage('Bin verwirrt. Warum bist du nicht NIL???') end;
Delphi-Quellcode:
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??
MyForm.Close;
FreeAndNil(MyForm); 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. |
Re: Herr 'Close' und Frau 'NIL'
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.
|
Re: Herr 'Close' und Frau 'NIL'
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] |
Re: Herr 'Close' und Frau 'NIL'
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:
[/edit]
procedure ReleaseAndNil(var X: TCustomForm); //inline;
begin if Assigned(X) then begin X.Release; X := nil; end; end; Mfg FAlter |
Re: Warum macht ein TForm.Close nicht NIL
Zitat:
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. |
Re: Warum macht ein TForm.Close nicht NIL
Zitat:
|
Re: Warum macht ein TForm.Close nicht NIL
![]() Zitat:
|
Re: Warum macht ein TForm.Close nicht NIL
Ohhh neee :wall:
Jetzt hab ichs gesehen. Wenn ich im OnClose keine CloseAction definiere (z.B. caFree), macht es ein caHide. Aber wie nun:
Delphi-Quellcode:
oder
MyForm.Close;
MyForm.Release;
Delphi-Quellcode:
MyForm.Close;
FreeAndNil(MYform) |
Re: Warum macht ein TForm.Close nicht NIL
Nur MyForm.Release für deine Zwecke.
|
Re: Warum macht ein TForm.Close nicht NIL
Wird die Variable noch genutzt dann FreeAndNil() sonst MyForm.Free;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz