Ich habe ein Formular, das ich benutze, um einige Informationen für einige Sekunden zu zeigen. Ist es in Ordnung für das Formular, sich zu befreien? Kann ich einen Timer im Konstruktor starten und dann im Timer-Event self.free aufrufen? Oder wird dies möglicherweise zu Schwierigkeiten führen?Delphi: Ist es in Ordnung für ein Formular, um es selbst zu befreien?
Antwort
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.
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).
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. –
Warum nicht einfach Schnittstellen zum Referenzzählen verwenden? –
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.
Je mehr ich darüber nachdenke, desto mehr gefällt mir die TCloseAction-Idee. Vielleicht sollte ich das anstelle von Release verwenden ... – Vegar
Wenn Formulare nur DefaultCloseAction-Eigenschaften hatten, könnte pone sie automatisch freigeben, ohne Event-Handler zuzuweisen. –
Dies ist genau das, was mit Schnittstellen getan wird.
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. –
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
Fabio: Ich bin mir sicher, dass du das überschreiben könntest. Vegar: Schnittstellen sind Referenz gezählt, nicht Umfang verwaltet. – Arafangion
- 1. Ist es in Ordnung, downcast?
- 2. Ist es in Ordnung, mit() zu verwenden?
- 3. Ist es in Ordnung, ein leeres Anker-Tag zu haben?
- 4. Xeditable Formular ist speichern Formular ohne es selbst anzuzeigen
- 5. Lasten von if's, ist es in Ordnung?
- 6. Ist es in Ordnung, google.setOnLoadCallback mehrmals zu verwenden?
- 7. Android Benachrichtigungsabsicht, um es selbst zu löschen
- 8. Ist es möglich, mehrere Instanzen derselben Delphi-Dienstanwendung zu installieren?
- 9. Ist es manchmal in Ordnung, Gracefully nicht zu degradieren?
- 10. Ist es in Ordnung, C++ anzupassen?
- 11. Ist es in Ordnung, Docker aus dem Andockfenster zu starten?
- 12. Ist es in Ordnung, UITableViewCells in einem Array zu speichern?
- 13. Python - Ist es in Ordnung, selbst an eine externe Funktion zu übergeben
- 14. Ist es in Ordnung, Ruby 1.8.5 zu verwenden?
- 15. Ist es möglich, Erweiterungen in Delphi Debugger zu schreiben?
- 16. ist es in Ordnung, Leute ohne Javascript zu vergessen?
- 17. Ist es in Ordnung, RabbitMQ `/` VHost zu löschen?
- 18. Ist es in Ordnung, divs in einer Tabellenzelle zu verschachteln?
- 19. Ist es in Ordnung, einen ListView-Adapter dynamisch zu ändern?
- 20. Ist es in Ordnung HTML in HTML-Attribute zu setzen?
- 21. Ist es in Ordnung, Python 2.7 und 3.5 zu installieren?
- 22. Core Data Vererbung: Ist es in Ordnung, dies zu tun?
- 23. ist es in Ordnung, Vektor in einem Destruktor zu löschen
- 24. Ist es in Ordnung, statische Attribute zur Laufzeit zu manipulieren?
- 25. Ist es in Ordnung, Mercurials Umbenennungsfunktion zu "missbrauchen", um die Bewegung von Codeblöcken zu verfolgen?
- 26. Ist es in Ordnung, PEPROCESS-Werte zu vergleichen?
- 27. Ist es möglich, Attribute für Delphi-Methodenargumente zu verwenden?
- 28. Ist es in Ordnung, Destruktor als privat zu deklarieren?
- 29. Ist es in Ordnung, mehrere Dispatcher.BeginInvoke zu haben?
- 30. F #: Ist es in Ordnung, Theorembeweiser zu entwickeln?
+1, Dies ist, IMHO, die einzige saubere Möglichkeit, in diesem Fall zu tun – Fred
Ich denke, ich werde für diesen gehen, in Kombination mit der Einstellung des Eigentümers als eine zusätzliche Versicherung. – Vegar