窗体变量的释放问题
var Form:TForm; //全局变量
if not Assigned(Form) then
begin
try
Form:=TFBar_Mid.Create(self);
Form.Show;
finally
Form.Free;
Form:=nil;
end;
end;
这样如果是showmodal就可以,如果是show就不行的,请问应该在那里写呢?
问题点数:20、回复次数:48Top
1 楼youfly(无名)回复于 2001-12-28 14:27:15 得分 0
当使用ShowModal时要使Finally下面语句的执行必需要关闭Form
而有show时,则不必,所以你这里用show的结果是Form.Show以后,马上执行Form.Free,所以就不行了Top
2 楼Liujc(阿聪)回复于 2001-12-28 14:28:02 得分 0
使用ShowModal则程序等待窗体关闭返回,而Show则是马上返回。
你可在窗体的OnClose事件中加入 Action := caFree ;Form := Nil ;
//窗体名Top
3 楼xiaoxiao197821(你的笑对我很重要)回复于 2001-12-28 14:28:38 得分 0
用showmodal会有什么问题么Top
4 楼gaden007(斌)回复于 2001-12-28 14:33:18 得分 0
Liujc(阿聪) 不行呀,这样会出错的,
xiaoxiao197821(洪飞)用showmodal没问题,但我现在要用showTop
5 楼youfly(无名)回复于 2001-12-28 14:43:32 得分 20
你可以在Form的Close事件里写上Action:=caFree;
然后把Finally中的Form.free去掉就可以了;Top
6 楼Liujc(阿聪)回复于 2001-12-28 14:46:50 得分 0
你的OnClose事件是否为TFBar_Mid窗体的事件Top
7 楼m_leaner(和日本鬼子势不两立)回复于 2001-12-28 14:56:29 得分 0
来晚了Top
8 楼iampole(pole)回复于 2001-12-28 14:57:46 得分 0
youfly(无名):
和我一样的高手就是你了。
但是需要考虑的是Form是否会生成多个实例,但是本例中是不会的。Top
9 楼kylion(凯林)回复于 2001-12-28 15:05:33 得分 0
同意youfly(无名)的做法.Top
10 楼gaden007(斌)回复于 2001-12-28 15:28:04 得分 0
不行吧,
Liujc(阿聪) ,我的OnClose事件是在TFBar_Mid窗体
Top
11 楼gaden007(斌)回复于 2001-12-28 15:29:21 得分 0
如果在finally里写Free,那一建立就马上释放掉了,因为不是showmodal窗体Top
12 楼gaden007(斌)回复于 2001-12-28 15:43:05 得分 0
都走了?????????????Top
13 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-28 16:13:32 得分 0
if not Assigned(Form) then
begin
try
Form:=TFBar_Mid.Create(self);
Form.Show; //很快就执行了
finally
Form.Free;
Form:=nil;
end;
Top
14 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-28 16:15:48 得分 0
//建议
if not Assigned(Form) then Form := TFBar_Mid.Create(Self);
Form.Show;
Top
15 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-28 16:17:16 得分 0
Form := TFBar_Mid.Create(Self);
// ~~~~~Self.Free会触发Form.Free
Top
16 楼gaden007(斌)回复于 2001-12-28 16:19:31 得分 0
如果self.Free不就是释放了本窗口了吗, 那还有什么用呀Top
17 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-28 16:27:22 得分 0
if not Assigned(Form) then Form := TFBar_Mid.Create(Self);
Form.Show;
Top
18 楼gaden007(斌)回复于 2001-12-28 16:30:03 得分 0
如果不把Form清空就不能第二次建立窗体,请帮忙呀Top
19 楼gaden007(斌)回复于 2001-12-28 16:32:14 得分 0
这样好像不会释放Form吧,因为Form是在第一个窗体上的变量Top
20 楼gaden007(斌)回复于 2001-12-28 16:58:19 得分 0
还在吗Top
21 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-28 17:29:21 得分 0
你想在什么时候释放Form?Top
22 楼gaden007(斌)回复于 2001-12-28 17:45:34 得分 0
想在FBar_Mid这个窗体关闭了之后释放Top
23 楼youfly(无名)回复于 2001-12-28 18:10:52 得分 0
用我的方法可行的,你可是不必管创建了多少个TFBar_Mid实例,因为在Close时会释放Top
24 楼gaden007(斌)回复于 2001-12-28 18:18:37 得分 0
在TFBar_Mid里只会释放掉它自己窗体的的东西,但Form是在它的父窗体上的,你那个方法好像没有释放掉吧,我试过也不行Top
25 楼zswang(伴水清清)(专家门诊清洁工)回复于 2001-12-28 18:20:31 得分 0
Form := TFBar_Mid.Create(Self);
// ~~~~~Self.Free会触发Form.Free
Top
26 楼gaden007(斌)回复于 2001-12-28 18:21:18 得分 0
是了,你说在Form的close里写,请请怎样可以在Form的close里写呢,因为Form只是一个窗体变量,怎样在它的close里写呢,是不是自己写一个过程,然后把它赋给Form的close呢Top
27 楼Kingron(单身走我路……)回复于 2001-12-28 18:22:41 得分 0
分数给youfly(无名) 吧。他的答案非常好的。Top
28 楼gaden007(斌)回复于 2001-12-28 18:22:58 得分 0
zswang(伴水)(被黑中) ,还是不明白你的意思 ,self.free释放不就是把父窗体释放掉了吗,但我不要关闭父窗体呀Top
29 楼Kingron(单身走我路……)回复于 2001-12-28 18:25:56 得分 0
gaden007(斌) :
>>>你说在Form的close里写,请请怎样可以在Form的close里写呢
选择Form,在Object Inspect中,有一个Events页面,其中有一个OnClose事件,双击右边的空白,就可以写代码了。
P.S:真的很想在你的PP上面踢一脚!!!拜托,看看书再来问问题,这样的问题你也问?你也太心急了!学习Delphi不是这样的。,
Top
30 楼man8888(北京男人)回复于 2001-12-28 18:31:56 得分 0
呵呵。。。Top
31 楼thedream(梦幻使者)回复于 2001-12-28 18:58:49 得分 0
我也同意youflyTop
32 楼gaden007(斌)回复于 2001-12-29 11:09:00 得分 0
Kingron(戒网中……),呵呵,不要踢那么大力呀,很痛的。
你没看清楚我的题目吗?我的Form只是一个窗体变量来的,不是一个窗体呀,所以它没有Object Inspect的。不过我已经解决了,就是在OnClose里写,不过是自己定义的事件,再赋给Form 的Close事件Top
33 楼gaden007(斌)回复于 2001-12-29 11:14:17 得分 0
不过还想问多个问题,完了再加多20再结贴
如果我所把这句加多个条件if not Assigned(Form) and Label1.Caption<>Edit1.text then
我想同时可以建立多个窗体,请问又要怎样做呢?
Top
34 楼gaden007(斌)回复于 2001-12-29 13:30:12 得分 0
还有人来吗Top
35 楼halfdream(哈欠)回复于 2001-12-30 09:57:51 得分 0
看来你真得多看看书了
if not Assigned(Form) and Label1.Caption<>Edit1.text then ???
这句显然就有问题.
同意Kingron(戒网中……)
Top
36 楼gaden007(斌)回复于 2001-12-30 14:54:54 得分 0
halfdream(哈欠) ,我想问下有什么问题?Top
37 楼wangxj333(天天真人)回复于 2001-12-30 15:31:31 得分 0
皮之不存,毛将焉附!Top
38 楼halfdream(哈欠)回复于 2001-12-30 15:33:18 得分 0
嗯.wangxj333(王老虎) 已经帮我回答了.
如果FORM的实例已经没有了,那LABEL1 ,EDIT1还有意义吗?
Top
39 楼gaden007(斌)回复于 2001-12-30 15:43:45 得分 0
哦,sorry, 应该改为 "or" 才对Top
40 楼largewang(成都:王臻义[老王][C#学习中断])回复于 2001-12-30 16:03:43 得分 0
caFree啊Top
41 楼gaden007(斌)回复于 2001-12-30 16:12:21 得分 0
应该改成这样:
if (not Assigned(Form))or (Assigned(Form) and Label1.Caption<>Edit1.text) then
释放Form我可以做到了,就是在OnClose里写,但如这样同时有多个窗体存在时我想关闭其中一个那么其它的也会关闭了Top
42 楼gaden007(斌)回复于 2001-12-30 16:41:29 得分 0
顶Top
43 楼gaden007(斌)回复于 2001-12-30 21:46:56 得分 0
u..........Top
44 楼morphia(吗啡)回复于 2001-12-31 08:50:05 得分 0
if (not Assigned(Form))or (Assigned(Form) and Label1.Caption<>Edit1.text) then
有问题,算术的优先级不对,你需要括号
if (not Assigned(Form))or (Assigned(Form) and (Label1.Caption<>Edit1.text)) then
这样才对Top
45 楼gototop99(※ 今天的月亮,明天的太阳! ※)回复于 2001-12-31 09:01:38 得分 0
以上问题以解决!!!Top
46 楼gaden007(斌)回复于 2001-12-31 14:56:20 得分 0
多谢,是我打漏了
gototop99(巴蒂),还没解决的,如果同时建立了几个窗体,那只要关闭其中一个窗体,那么其它的窗都会关闭的Top
47 楼gaden007(斌)回复于 2001-12-31 15:49:02 得分 0
元旦放假了吗?????????????Top
48 楼007pro(水样天波)回复于 2001-12-31 16:26:02 得分 0
那只要关闭其中一个窗体,那么其它的窗都会关闭的
怎么关的,手工还是在程序中释放呢? Top




