是否每一个实例都要创建?每一个实例用完之后都要释放? (50分)

  • 主题发起人 主题发起人 刘亚林
  • 开始时间 开始时间

刘亚林

Unregistered / Unconfirmed
GUEST, unregistred user!
1.是否每个类的实例(对象)在使用之前都得先创建?
2.是否每个类的实例(对象)在使用之后都得释放?
我们在写注册表之类的程序时常这样:reg:=Tregistry.create;用完之后我们常这样:reg.free。

而当我们拖一个按钮进form的时候,你去看看代码吧,根本没有Tbutton.create,而用完之后也不用button1.free.还有,当我们用完form之后,也就是说在关闭form类,关闭窗体的时候也没有释放资源的相应代码呀~~~,哦,我们有时候在一个按钮上加form1.close;可是close会释放资源吗?用form1.free可以吗?

为什么?
我没得什么分了,希望大家不要抛弃我~~
 
还有:
3.当我们在一个按钮上加form1.close;时,点这个按钮可以关闭窗体,它会不会调用析构函数来释放窗体实例所占的资源呢?
 当你在此按钮上加form1.close();时,点此按钮也可关闭窗体!!怎么回事?它是过程?是不是调用此过程的时候用的是默认参数?它又会不会释放资源呢?
 还有,当在它上面加form1.free;时,也可关闭窗体!
 同样,你在其上加form1.free();也可关闭窗体……
 但是我在它们后面加括号的时候发现:弹出函数提示,"no parameters expected"--是表示此过程没有参数的意思吗?
 问题:
 是不是在delphi里面的过程,当它没有参数的时候,你还加个括号,它仍然可以通过编译,而且与不加括号无区别?

 
 
4.还想问一下:
……//省略。
var
Form1: TForm1;

implementation
var
x,y,z:integer;

{$R *.dfm}
x:=10;
end.

请问一下,上面的代码按F9后,它说x没定义?报错如下:identifier redeclared:'x'

而我在x:=10之前加上一个begin(注意没加end;),它竟然能正确执行!
此时的代码如下:
implementation
var
x,y,z:integer;

{$R *.dfm}
begin
x:=10;
//没加end;
end.
//执行正确!

这样似乎程序就没有问题了……但是,这之后如果你拖个按钮进来,给它加上事件,并且,你打算写上button1.caption:=**的时候你就会发现当你刚输完button1后面的小圆点就报错了——[Pascal Error] Unit1.pas(1): Unable to invoke Code Completion due to errors in source code
 
全乱套了啊~~我是不是学得走火入魔了?
 
对,实例都得创建以及释放,
你拖控件到FORM,就已经创建了,而释放是用宿主(一般是FORM)完成的
 
3.我认为你的理解是正确的,如果没有参数,则加不加括号无所谓
 
还在等待更完美的答案……
 
jobsxy的我认同~~

可是还有其它问题没回答呢~~

顶一下看
 
1.不一定。如果你只调用类方法或只调用静态方法并且没有访问类中定义的变量的话不一定要创建类实例。
2.不一定。程序结束时系统会自动回收所有资源。当然必须是程序结束时,如果程序继续运行中,你用完而不释放的类实例可以认为是内存泄漏。
你看不到form中控件的创建和释放代码并不表示没有这些代码,而是被系统封装了起来你不容易找到而已。
3.主form关闭时会自动终止application的运行并开始释放资源。其它form关闭时默认只是hide(即form.visible:=false)除非你设定onclose事件中的action为caFree,否则不会释放。
4.纯粹是pascal语法规定而已。
所有执行代码必须用begin..end包起来, 而且在begin...end之间只能是可执行代码,而不能是定义,声明等。定义、声明必须处于用到它的可执行代码所在的begin...end之前。
 
“4.纯粹是pascal语法规定而已。
所有执行代码必须用begin..end包起来, 而且在begin...end之间只能是可执行代码,而不能是定义,声明等。定义、声明必须处于用到它的可执行代码所在的begin...end之前。”

当我建一个application的时候,并没有begin(在implementation后只有end.)
如果我加个begin却仍可以在里面写x:=10;之类的语句。但我一旦拖个按钮进来就报错了。
是怎么回事呢?
 
这个是Pascal的规则问题,没有为什么,因为编译器不认得,就报错了
 
后退
顶部