2009-04-02 5 views

Antwort

29

Zusätzlich mit einem Formular können Sie Release aufrufen.

Es sendet eine CM_RELEASE Nachricht an das Formular. Als Reaktion ruft es Free auf. Der Vorteil der Freigabe besteht darin, dass für das Formular keine Nachrichten mehr vorhanden sind, die zu einem Absturz führen könnten.

+0

+1, Dies ist, IMHO, die einzige saubere Möglichkeit, in diesem Fall zu tun – Fred

+0

Ich denke, ich werde für diesen gehen, in Kombination mit der Einstellung des Eigentümers als eine zusätzliche Versicherung. – Vegar

1

Ich habe eine ganze Reihe von Objekten, die sich selbst befreien, und ich habe verschiedene Tests auf ihnen ohne Probleme/Leckagen durchgeführt gezeigt. Ein TForm könnte komplexer sein, aber solange Self.Free() der letzte Aufruf ist, sollten Sie in Sicherheit sein.

(Für diejenigen, die sich wundern, warum auf der Erde habe ich ein Objekt, das sich selbst befreien; Ich gebe sie um das System viel, so implementiert ich durch eigene Referenz Zählschema. Wenn die letzte Referenz freigegeben wird, so befreit sich das Objekt).

+0

Aber Self.Free wäre fast * nie * der letzte Aufruf eines Formulars, da ein Formular fast immer Code als Reaktion auf eine Benutzeraktion ausführt. Verwenden Sie stattdessen Freigabe. –

+0

Warum nicht einfach Schnittstellen zum Referenzzählen verwenden? –

16

Sie das Formular machen, sich zu befreien, wenn es durch den Benutzer oder von Code geschlossen wird:

procedure TForm27.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

procedure TForm27.FormCreate(Sender: TObject); 
begin 
    Timer1.Enabled := True; 
end; 

procedure TForm27.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    Close; 
end; 

Achten Sie darauf, einen Besitzer liefern an im Konstruktor einhüllen der Anwendung Abschaltungen und die Form nicht zerstört die Zeit. Der Besitzer wird das Formular freigeben, bevor es sich selbst befreit.

+0

Je mehr ich darüber nachdenke, desto mehr gefällt mir die TCloseAction-Idee. Vielleicht sollte ich das anstelle von Release verwenden ... – Vegar

+1

Wenn Formulare nur DefaultCloseAction-Eigenschaften hatten, könnte pone sie automatisch freigeben, ohne Event-Handler zuzuweisen. –

0

Dies ist genau das, was mit Schnittstellen getan wird.

+1

Ja, aber Sie sollten nicht vergessen, dass TComponent von Delphi die Referenzzählung der Schnittstelle außer Kraft setzt, was oft zu Verwirrung führt. –

+0

Mithilfe von Schnittstellen wird das Formular freigegeben, wenn es nicht mehr verfügbar ist. Ich will das nicht. Ich möchte, dass es so lange lebt, wie es will, ohne dass es darauf Bezug nimmt, und dann lasse es los, wenn es fertig ist, es selbst zu zeigen. – Vegar

+0

Fabio: Ich bin mir sicher, dass du das überschreiben könntest. Vegar: Schnittstellen sind Referenz gezählt, nicht Umfang verwaltet. – Arafangion

Verwandte Themen