刚学Delphi,有一点不太明白:既然Delphi中所有的对象都是从TObject中继承的,那么就都可以继承或自己重载Free,那对象销毁时会自动调用它,什么时候应用显式调用呢?比如说下面这个例子:(是《Delphi4编程技术内幕》中的第一个例子)unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Gauges, ExtCtrls, Menus, ComCtrls;
const
MAX = 3;type
TMyGauge = class(TGauge)
private
//FGauge : TGauge;
FTimer : TTimer;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure TimeStart(sender: Tobject);
end;type
TForm1 = class(TForm)
Timer1: TTimer;
PageControl1: TPageControl;
mnuMain: TMainMenu;
Menu: TMenuItem;
mnuShowForm: TMenuItem;
mnuExit: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure mnuShowFormClick(Sender: TObject);
private
{ Private declarations }
FGauge : array [1..MAX] of TMyGauge;
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses unit2, unit3;
{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
randomize; for I := 1 to MAX do // Iterate
begin
FGauge[i] := TMyGauge.Create(Self);
FGauge[i].parent := Self;
FGauge[i].visible := true;
FGauge[i].top := 50;
FGauge[i].left := i* 150;
FGauge[i].Color := RGB(Random(255),Random(255),Random(255));
FGauge[i].ForeColor := RGB(Random(255),Random(255),Random(255));
end; // for
end;{ TMyGauge }constructor TMyGauge.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimer := TTimer.Create(Self);
FTimer.OnTimer := TimeStart ;
FTimer.Interval := 50;
FTimer.Enabled := true;
Width :=75;
Height :=75;
Kind := gkPie;end;destructor TMyGauge.Destroy;
begin
FTimer.Enabled := false;
FTimer.Free; {*************************}
inherited Destroy;
end;procedure TMyGauge.TimeStart(sender: Tobject);
begin
Progress := Progress +1;
if Progress = 100 then Progress := 0;
Color := RGB(Random(255),Random(255),Random(255));
ForeColor := RGB(Random(255),Random(255),Random(255));end;procedure TForm1.mnuShowFormClick(Sender: TObject);
begin
form2.Show ;
form3.Show ;
end;procedure TForm1.Destroy(Sender: TObject);
var
i : integer;
begin
for i:= 1 to MAX do
FGauge[i].Free; {*************************}
end;end.打注释的这两行必须要显式调用Free吗?对象不应该和析构函数一样自动调用Destroy的吗?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Gauges, ExtCtrls, Menus, ComCtrls;
const
MAX = 3;type
TMyGauge = class(TGauge)
private
//FGauge : TGauge;
FTimer : TTimer;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure TimeStart(sender: Tobject);
end;type
TForm1 = class(TForm)
Timer1: TTimer;
PageControl1: TPageControl;
mnuMain: TMainMenu;
Menu: TMenuItem;
mnuShowForm: TMenuItem;
mnuExit: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure mnuShowFormClick(Sender: TObject);
private
{ Private declarations }
FGauge : array [1..MAX] of TMyGauge;
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses unit2, unit3;
{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
randomize; for I := 1 to MAX do // Iterate
begin
FGauge[i] := TMyGauge.Create(Self);
FGauge[i].parent := Self;
FGauge[i].visible := true;
FGauge[i].top := 50;
FGauge[i].left := i* 150;
FGauge[i].Color := RGB(Random(255),Random(255),Random(255));
FGauge[i].ForeColor := RGB(Random(255),Random(255),Random(255));
end; // for
end;{ TMyGauge }constructor TMyGauge.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimer := TTimer.Create(Self);
FTimer.OnTimer := TimeStart ;
FTimer.Interval := 50;
FTimer.Enabled := true;
Width :=75;
Height :=75;
Kind := gkPie;end;destructor TMyGauge.Destroy;
begin
FTimer.Enabled := false;
FTimer.Free; {*************************}
inherited Destroy;
end;procedure TMyGauge.TimeStart(sender: Tobject);
begin
Progress := Progress +1;
if Progress = 100 then Progress := 0;
Color := RGB(Random(255),Random(255),Random(255));
ForeColor := RGB(Random(255),Random(255),Random(255));end;procedure TForm1.mnuShowFormClick(Sender: TObject);
begin
form2.Show ;
form3.Show ;
end;procedure TForm1.Destroy(Sender: TObject);
var
i : integer;
begin
for i:= 1 to MAX do
FGauge[i].Free; {*************************}
end;end.打注释的这两行必须要显式调用Free吗?对象不应该和析构函数一样自动调用Destroy的吗?
但良好的习惯是Free
Free内部会自动调用Destroy的http://lysoft.7u7.net