如何知道一对象已经被删除 (50分)

  • 主题发起人 主题发起人 lxlzq
  • 开始时间 开始时间
L

lxlzq

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有
type xxx=class(object)
....
....
var demo:xxx;
....
demo.free;

以后如何来判断demo已经被删除
我用demo=nil来判断,似乎不行

我又做了个实验:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
t:ttimer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
t:=ttimer.Create(self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
t.Destroy;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if assigned(t) then
showmessage('在')
else
showmessage('不在');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
button1.Caption:='创建';
button2.Caption:='释放';
button3.Caption:='状态';
end;

end.

你们看看,发现了什么?
是不是在创建后不管有没有free,按第三个按纽都是‘在’
只有在创建前,按第三个按纽才是‘不在’

 
type xxx=class(object)
....
....
var demo:xxx;
....
demo.free;

以后如何来判断demo已经被删除
我用demo=nil来判断,似乎不行

我又做了个实验:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
t:ttimer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
t:=ttimer.Create(self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndNil(t)
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if assigned(t) then
showmessage('在')
else
showmessage('不在');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
button1.Caption:='创建';
button2.Caption:='释放';
button3.Caption:='状态';
end;

end.
 
这个问题看似简单,但已经困饶我好几天了
 
定义一个全局变量行不行?
 
的确是这样,不论是用assigned 还是xxx=nil的方法来判断,都只能在对象没有创建之前判断正确,如果对象已经创建然后又销毁了,就无法判断正确了,因为这时候它们都会认为对象是存在的。所以用这两个方法来判断是不可靠的,有一个可能比较“变态”的方法,就是用异常来判断:当访问一个已经销毁的对象的时候会抛出EAccessViolation异常。我们可以利用这一点,当需要判断某个对象是否已销毁的时候,就用try 语句去访问它的随便哪个数据成员(当然,该数据成员最好是简单数据类型的),如果抛出异常就可以肯定该对象已经被销毁了。
 
这个问题复杂吗?Delphi在每个Destroy方法的说明中都有下面这句话:
Do not call Destroy directly. Call Free instead.
调用Free后,把对象变量设为nil就OK了;
 
难道大家都不知道 FreeAndNil函数?
 
谢谢xeen啊,我还真不知道FreeAndNil函数[:D]我以前都是自己置nil的
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MyClass: TPersistent;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
FreeAndNil(MyClass);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(MyClass) then
MyClass := TPersistent.Create;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if not Assigned(MyClass) then
ShowMessage('Nil') else ShowMessage('Has')
end;

end.
 
多人接受答案了。
 

Similar threads

后退
顶部