Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Nochmal: Ermiteln ob Objekt freigegeben wurde

  Alt 13. Dez 2005, 13:46
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]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat