Zitat von
Union:
Im FormClose der Objekte solltest Du folgendes machen:
Delphi-Quellcode:
Procedure MyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Dann genügt es, später die globale Variable auf
nil abzufragen:
Delphi-Quellcode:
if frmMyForm = nil then
frmMyForm := TMyForm.Create(Application);
frmMyForm.Show;
Das bringt nichts.
Das hatte ich ja auch schon im 1. Beitrag geschrieben.
- In TCustomForm.Close wird falls Assigned das Ereignis onClose aufgerufen.
- In OnClose wird die CloseAction auf caFree gesetzt.
- Es wird dann im else Zweig der If Abfrage das Release aufgerufen.
- Release schickt eine Nachicht CM_RELEASE an das Form
- Die Methode CMRelease wird dadurch aufgerufen.
- in CMRelease wird ein Free aufgerufen.
- Das Ergebnis ist ein freigegebenes Formular
Leider ist das aber nicht nil
Ein "if frmMyForm = nil then" bringt genauso wie ein "if not assigned(frmMyForm) then" False und ich kann nicht erkennen ob dort ein existierendes Formular existiert.
Die isObject Funktion von
choose (
http://www.delphipraxis.net/internal...=460126#460126 ), die in Zusammenarbeit mit
negaH entstand bringt eine
Exception.
Hier ein Auszug des Quelltextes der TCustomForm zum Nachvollziehen:
Delphi-Quellcode:
{*******************************************************}
{ Borland Delphi Visual Component Library }
{ Copyright (c) 1995-2002 Borland Software Corporation }
{*******************************************************}
unit Forms;
...
type
TCustomForm =
class(TScrollingWinControl)
private
...
procedure CMRelease(
var Message: TMessage);
message CM_RELEASE;
...
protected
...
procedure DoClose(
var Action: TCloseAction);
dynamic;
...
public
...
procedure Close;
...
procedure Release;
...
end;
...
procedure TCustomForm.CMRelease;
begin
Free;
end;
...
procedure TCustomForm.DoClose(
var Action: TCloseAction);
begin
if Assigned(FOnClose)
then FOnClose(Self, Action);
end;
...
procedure TCustomForm.Close;
begin
...
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;
...
procedure TCustomForm.Release;
begin
PostMessage(
Handle, CM_RELEASE, 0, 0);
end;
...
[edit] Hatte Hagen statt negaH geschrieben[/edit]