![]() |
Nochmal: Ermiteln ob Objekt freigegeben wurde
Hallo,
ich muß das Thema noch mal aufnehmen, da ich noch keine befriedigende Antwort / Lösung gefunden habe. Folgendes Problem: Ich habe ein von TForm abgeleitetes Objekt. Dieses Objekt wird erzeugt und dargestellt. Der Benutzer kann das Objekt schliessen und es soll dann auch Freigegeben werden. Es gibt eine Funktion um das Form anzuzeigen und falls nicht vorhanden neu zu erzeugen. Beispielcode:
Delphi-Quellcode:
Mein Problem ist nun folgendes:
// Unit1.pas
... procedure TForm1.Button1Click(Sender: TObject); begin if not Assigned(Form2) then begin Form2 := TForm2.Create(self); Memo1.Lines.Add(DateTimeToStr(now)+' Create'); end else Memo1.Lines.Add(DateTimeToStr(now)+' schon da'); Form2.Caption := 'Test'; Form2.Show; end; ... // unit2.pas ... type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; ... procedure TForm2.Button1Click(Sender: TObject); begin Close; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin // hier werden noch viele weitere Dinge freigegeben Action := caFree; end; ...
Delphi-Quellcode:
Hat jemand eine Idee?
...
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin FreeAndNil(Self); // oder Free; Self := nil; end; ... Folgende Beiträge habe ich auch schon gelesen, aber keine akzeptable Antwort erhalten: ![]() ![]() Danke für Eure Hilfe |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Evtl das
![]() |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Du musst die Methode Notification überschreiben. Da wirst du über das Freigeben des Formulares informiert:
Delphi-Quellcode:
Gruß, Frank
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FForm2: TForm; { Private-Deklarationen } protected procedure Notification(AComponent : TComponent; Operation : TOperation); override; public constructor Create(AOwner: TComponent); override; { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} constructor TForm1.Create(AOwner: TComponent); begin inherited; FForm2 := nil; end; procedure TForm1.Button1Click(Sender: TObject); begin // Form erzeugen, wenn nicht vorhanden if not Assigned(FForm2) then begin FForm2 := TForm2.Create(Self); // FForm2.FreeNotification(Self); FForm2.Show; end; end; procedure TForm1.Notification(AComponent : TComponent; Operation : TOperation); begin inherited Notification( AComponent, Operation); if Assigned(FForm2) then if (Operation = opRemove) and (AComponent = FForm2) then FForm2 := nil; end; end. |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Im FormClose der Objekte solltest Du folgendes machen:
Delphi-Quellcode:
Dann genügt es, später die globale Variable auf nil abzufragen:
Procedure MyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := caFree; end;
Delphi-Quellcode:
if frmMyForm = nil then
frmMyForm := TMyForm.Create(Application); frmMyForm.Show; |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
oder ganz einfach so:
Delphi-Quellcode:
Falls Form2 modal dargestellt wird, besser nach Schema
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin // hier werden noch viele weitere Dinge freigegeben Action := caFree; Form2 := nil; end; Create Showmodal Free vorgehen |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Eine Idee, wie es auf alle Fälle immer klappt, ist, einfach die Caption (z.B.) des Formulars zu ermitteln ... und das in einem try except block. Falls es schief geht, gibt es kein Objekt mehr. Falls es funktioniert ist dein Objekt noch da.
ist aber, zugegeben, nicht sehr elegeant.... aber funzt |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Zitat:
Bekomme dann bei manchen Aktionen allgemeine Schutzverletzungen. :-( Form ist nicht Modal. |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Zitat:
Das hatte ich ja auch schon im 1. Beitrag geschrieben.
![]() Hier ein Auszug des Quelltextes der TCustomForm zum Nachvollziehen:
Delphi-Quellcode:
[edit] Hatte Hagen statt negaH geschrieben[/edit]
{*******************************************************}
{ 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; ... |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Hi MaBuSE,
was stört dich daran, die Methode Notification zu verwenden. Die ist dafür da und wird vor allem in der Komponentenentwicklung für solche Fälle benutzt. Cu, Frank |
Re: Nochmal: Ermiteln ob Objekt freigegeben wurde
Zitat:
Ich bin gerade am ausprobieren und debuggen. Ich wollte erst was dazu schreiben, wenn ich mir das angeschaut habe :stupid: Aber Danke schon mal für die Antwort :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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 by Thomas Breitkreuz