我在学习类的时候,当我把自定义的对象Free的时候,调用它的Button控件不见了?
以下是源码:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
THuman=class
private
age:integer;
public
constructor Create();
procedure PrintWWW();
end;
var
Form1: TForm1;
// Man1:THuman;
implementation{$R *.dfm}
procedure THuman.PrintWWW();
begin
showmessage('printWWW');
end;constructor THuman.Create();
begin
inherited Create();
// age:=0;(如果加上这句的话,退出From还会出错呢!)
showmessage('Create THuman Class!!!');
end;procedure TForm1.Button1Click(Sender: TObject);
var
Man1:THuman;
begin
Man1.Create();
Man1.Free();
//man1.Destroy();
end;
end.
以下是源码:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
THuman=class
private
age:integer;
public
constructor Create();
procedure PrintWWW();
end;
var
Form1: TForm1;
// Man1:THuman;
implementation{$R *.dfm}
procedure THuman.PrintWWW();
begin
showmessage('printWWW');
end;constructor THuman.Create();
begin
inherited Create();
// age:=0;(如果加上这句的话,退出From还会出错呢!)
showmessage('Create THuman Class!!!');
end;procedure TForm1.Button1Click(Sender: TObject);
var
Man1:THuman;
begin
Man1.Create();
Man1.Free();
//man1.Destroy();
end;
end.
你这样的写的话,你就要完全自己写Create()的全部;
实际上inherited Create();没有起到任何作用
begin
showmessage(self.ClassName ); //这里的self是什么? 看看inherited的代码
inherited;
end;procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
var
Man1: THuman;
begin
Man1 := THuman.Create();
Man1.Free;
end;这不是C++呀!
Man1.Create()
//改为
Man1 = THuman.Create;
************************
你的程序就没问题。
至少为什么?我想大概是...不知道了,要看看asm有什么区别才知道了
在我看来,应该有两处错误.
(1)
....
public
constructor Create();//没加override
....(2)
....
Man1.Create();//应该用Man1=THuman.Create;
....
大家说是不是啊?
TObject.Create方法你说是静态方法?我的理解是静态方法是不能用Override重载的.
但TObject.Create竟然能被Override,那么它就不应该是静态的.(虽然我Create那里没有加)你说的是TObject.Create不能override?
还是说没有override不能用inheritted?
var
Man1: THuman;
begin
Man1 := THuman.Create();
Man1.Free;
end;这不是C++呀!
TObject.Create构造器是静态方法Sorry,我知道你是对的了,我刚才试过了.
之前是我看少了一个参数,
CS打多了反而看不清了^_*