谁来解释一下这小段代码?(50分)

  • 主题发起人 主题发起人 net_donkey
  • 开始时间 开始时间
N

net_donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
新建一个工程,什么都不用改,在上面放上两个button
var
Form1: TForm1;
Test: TForm1
//全局
procedure TForm1.Button1Click(Sender: TObject);
begin
Test := TForm1.Create(self);
Test.Show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
postMessage(Test.Handle, WM_CLOSE, 0 , 0);
end;
先按几下button1再来下button2
为什么不出错?不是没有释放吗?
可见每次创建test的时候,句柄从新付了。
那原来那些被创建的窗体用的资源?
小弟糊涂
谁能把这个过程讲讲,谢谢了。
 
>>TForm1.Create(self);
是这一句使新建的test成为Self的子控件,Delphi在释放父控件之前能够找到内存中的子控件们。
当父控件被释放的时候,它的子控件也会被释放的。
你应该看看constructor TCustomForm.Create(AOwner: TComponent)
的源代码 and Delphi的Help
 
to Creation-zy:
不好意思,我问没问清楚
“ 为什么不出错?不是没有释放吗? ”
是想问连续 test := TForm1.Create(self);
而test又没有Test.free;过
那后来出现的多个“test”的资源是怎么来的?
而我想象中在第二次 test := TForm1.Create(self)
的时候 应该是会有告诉这个对象
已经存在的错误,不知道是怎么回事?
多谢。
ps:
postMessage(Test.Handle, WM_CLOSE, 0 , 0);
只能关闭最后一个test
 
》》而我想象中在第二次 test := TForm1.Create(self)
的时候 应该是会有告诉这个对象
》》已经存在的错误,不知道是怎么回事?
试试这个:
----------------
var
Form1: TForm1;
Test: TForm1
//全局

procedure TForm1.Button1Click(Sender: TObject);
begin
if assigned(Test) then
begin
ShowMessage('已经存在!');
exit;
end
else
begin
Test := TForm1.Create(self);
Test.Show;
end;
end
-------------
当窗口生成的时候,其实例已经存在了!你可以判断一下!
 
to Creation-zy:
yours:
//////
var
i:Integer;
SL:TStringList;
begin
SL:=TStringList.Create;
SL.CommaText:='dog,cat ,rice'
//CommaText 宝贝呀!
for i:=0 to SL.Count-1 do
Memo1.Lines.Add(SL);
end;

你的sl不没释放是怎么回事情。其实我就是搞不懂这个才提这个问题。是自动管理的吗?
 
to jrq:
你这样是判断了它是否存在。
但是我那样做为什么不报个错?
 
to net_donkey:
>>sl没释放
Oh!原来是这样呀。实在对不住——我当时图省事,没有Free对象,现在成了把柄不是? :(
按照正规的写法,还是要用代码显式的Free的,我的代码有漏洞,特此更正。

Delphi的对象变量其实只不过是指向对象实例的指针,和C++中完全不一样,你甚至可以
for i:=0 to 100 do test:=TForm1.Create(Self)
——每次Create都创建了一个TForm1的
实例,然后test指向这个实例的内存地址。虽然你最后只会得到最后一个被创建的TForm1
(由test保存),但是前面那100个TForm1的实例还在内存中——作为Self的Child控件,
它们只有等到Form1释放的时候才会从内存中释放。
 
恩,楼上的解释应该已经清楚了。
 
多谢!接受答案了
 
后退
顶部