16,748
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TA = class
private
Fs: string;
public
constructor Create(s: string);
destructor Destroy;override;
procedure test;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
A: TA;
begin
A := TA.Create('test');
A.Free;
//A := nil;
//if A <> nil then
if Assigned(A) then
A.test;
end;
{ TA }
constructor TA.Create(s: string);
begin
Fs:= s;
end;
destructor TA.Destroy;
begin
Fs:= '';
inherited;
end;
procedure TA.test;
begin
ShowMessage(Fs);
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
{ 用这个类实现标记/判断对象是否已被释放 }
TCheckIsAlive = class
private
flag: Boolean; { 类创建时成员变量 flag 一定会被初始化为 False }
function GetIsAlive: Boolean;
public
destructor Destroy; override;
property IsAlive: Boolean read GetIsAlive;
end;
TA = class(TCheckIsAlive) { 注意继承 }
private
Fs: string;
public
constructor Create(s: string);
destructor Destroy; override;
procedure test;
end;
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
FA: TA;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
A: TA;
begin
A := TA.Create('test'); { 创建 }
FA := A; { 引用 }
{ 检查是否 alive }
if A.IsAlive then
A.test; { 未释放->会执行 }
A.Free; { 释放 }
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
{ 检查是否 alive }
if FA.IsAlive then
FA.test; { 已被释放->不会执行 }
end;
{ TA }
constructor TA.Create(s: string);
begin
Fs := s;
end;
destructor TA.Destroy;
begin
Fs := '';
inherited;
end;
procedure TA.test;
begin
ShowMessage(Fs);
end;
{ TCheckIsAlive }
destructor TCheckIsAlive.Destroy;
begin
flag := True; { 修改标记 }
end;
function TCheckIsAlive.GetIsAlive: Boolean;
begin
Result := not flag;
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
{ 用这个类实现标记/判断对象是否已被释放 }
TCheckIsAlive = class
private
flag: Boolean; { 类创建时成员变量 flag 一定会被初始化为 False }
function GetIsAlive: Boolean;
public
destructor Destroy; override;
property IsAlive: Boolean read GetIsAlive;
end;
TA = class(TCheckIsAlive) { 注意继承 }
private
Fs: string;
public
constructor Create(s: string);
destructor Destroy; override;
procedure test;
end;
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
A: TA;
begin
A := TA.Create('test');
A.Free;
{ 检查是否 alive }
if A.IsAlive then
A.test;
end;
{ TA }
constructor TA.Create(s: string);
begin
Fs := s;
end;
destructor TA.Destroy;
begin
Fs := '';
inherited;
end;
procedure TA.test;
begin
ShowMessage(Fs);
end;
{ TCheckIsFree }
destructor TCheckIsAlive.Destroy;
begin
flag := True; { 修改标记 }
end;
function TCheckIsAlive.GetIsAlive: Boolean;
begin
Result := not flag;
end;
end.
var
A: TA;
begin
A := TA.Create('test');
FreeAndNil(A); {和A.Free; A:=nil;是一个效果}
if Assigned(A) then
A.test; {这句将不会被执行了}
end;