奇怪,我这句怎么通不过呢:if assigned(FChild)<>nil then
var
FChild:TFrm_UserAdd;
begin
inherited;
//if not assigned(FChild) then
if assigned(FChild)<>nil then (我这句怎么通不过呢???)
begin
FChild:= TFrm_UserAdd.Create(Application);
FChild.Show ;
end
else
FChild.BringToFront; //把它Show在最前面
//Frm_UserAdd.Show;
end;
问题点数:50、回复次数:33Top
1 楼huojiehai(海天子)回复于 2003-08-03 20:32:54 得分 0
if assigned(FChild) then //这样改Top
2 楼juwuyi(我有,我可以)回复于 2003-08-03 20:36:58 得分 0
huojiehai(海天子) :
这样改不行啊,这样就不停打开新的了。
还有没有其他的什么方法?
我找过论坛上的问题了,好像就提供这个方法啊
我怎么搞都通不过编译啊Top
3 楼huojiehai(海天子)回复于 2003-08-03 20:39:11 得分 10
if not assigned(FChild) then //这样改
Top
4 楼huojiehai(海天子)回复于 2003-08-03 20:39:39 得分 0
结贴吧Top
5 楼jacky_shen(jacky)回复于 2003-08-03 20:39:47 得分 0
assigned(FChild)返回的是True或False
不能用nil去判断。Top
6 楼juwuyi(我有,我可以)回复于 2003-08-03 20:41:13 得分 0
if not assigned(FChild) then //这样改
老大,这样改根本就打不开!
你自己是怎么写的?Top
7 楼huojiehai(海天子)回复于 2003-08-03 20:43:38 得分 0
var
FChild:TFrm_UserAdd;
begin
inherited;
//if not assigned(FChild) then
if assigned(FChild)<>nil then (我这句怎么通不过呢???)
begin
FChild:= TFrm_UserAdd.Create(Application);
FChild.Show ;
end
else
begin
FChild.Show;
FChild.BringToFront; //把它Show在最前面
//Frm_UserAdd.Show;
end;
end;
Top
8 楼juwuyi(我有,我可以)回复于 2003-08-03 20:43:44 得分 0
当打开MDI子窗口的时候,如果它已经打开过了,就把这个窗口给激活到最前面,没有打开就创建新窗口。Top
9 楼huojiehai(海天子)回复于 2003-08-03 20:44:18 得分 0
var
FChild:TFrm_UserAdd;
begin
inherited;
if not assigned(FChild) then
//if assigned(FChild)<>nil then (我这句怎么通不过呢???)
begin
FChild:= TFrm_UserAdd.Create(Application);
FChild.Show ;
end
else
begin
FChild.Show;
FChild.BringToFront; //把它Show在最前面
//Frm_UserAdd.Show;
end;
end;
Top
10 楼juwuyi(我有,我可以)回复于 2003-08-03 20:45:10 得分 0
huojiehai(海天子),老大,只要你答对了,我肯定立马给分的,而且你要多少都可以拉
我这样写不行啊。达不到要求啊!Top
11 楼juwuyi(我有,我可以)回复于 2003-08-03 20:47:27 得分 0
看看这个帖子,他们就是这样写的,可是好生奇怪啊,通不过
http://expert.csdn.net/Expert/topic/1800/1800142.xml?temp=.8982355Top
12 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-08-03 20:49:50 得分 25
Assigned(对象)
用来判断一个对象是否是nil,返回值是布尔类型。True/False。所以你不能够<>nil判断
分析你的错误:
var
FChild:TFrm_UserAdd;
begin
inherited;
if assigned(FChild)<>nil then (我这句怎么通不过呢???)
//应该改为 if not assigned(FChild) then
begin
FChild:= TFrm_UserAdd.Create(Application);//对象创建再堆上,而指向实例的指针却在栈上,这个过程一运行结束,栈上的指针就被弹出了,这就是为什么你总是在这里创建了很多子窗体的原因,FChild的生存期必须在这个函数外。例如作为全局函数或者这个函数(如果这个函数是某个类的成员函数)所在类的public/private/protected/oublished域内定义
FChild.Show ;
end
else
FChild.BringToFront; //把它Show在最前面
//Frm_UserAdd.Show;
end;
Top
13 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 20:50:38 得分 10
....
if Not Assigned(FChild) then
begin
//创建并显示.........
end;
....Top
14 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 20:53:47 得分 0
呵呵,小鳄鱼.........
楼上说的没有错,每次在离开FChild的作用域(你上面写的过程)后栈中指针都会被释放,所以每次运行到这里,这个指针都是重新创建,所以窗体会始终被创建....Top
15 楼zjybestzjybest(zjybestzjybest)回复于 2003-08-03 21:00:44 得分 0
是的,你的局部变量声明实际在栈中,不信你反汇编看一下绝对有一条
sub sp,####
这实际上是在栈中为了局部变量做一个存储区Top
16 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 21:02:43 得分 0
好了,揭贴了..........一会狼多了,肉就少了.........呵呵.....Top
17 楼juwuyi(我有,我可以)回复于 2003-08-03 21:04:20 得分 0
to Eastunfail(恶鱼杀手) :
我还是有些不明白,你指的是在public/private/protected/oublished定义变量
FChild:TFrm_UserAdd;还是定义一个函数,然后通过调用这个函数来创建窗体?
我刚才是用定义变量,结果窗体关了之后,再打开就会出现“
Abstract Error.”的错误消息!是不是在没有释放对象?
Top
18 楼kyee(浪子阿鹏)回复于 2003-08-03 21:08:24 得分 0
问题出在下面这一句
var
FChild:TFrm_UserAdd;
begin
// ... ...
end;
这是局部变量,解决的办法是在参数中加 var AChild: TFrm_UserAdd 项,
if not Assigned(AChild) then
try
AChild := TFrm_UserAdd.Create(Self);
except
end;
这样就可以了。Top
19 楼juwuyi(我有,我可以)回复于 2003-08-03 21:08:27 得分 0
各位老大帮忙,尽量在我晚上走之前把这个问题原原本本的搞定啊。
各位老大,继续帮我回答问题。Top
20 楼juwuyi(我有,我可以)回复于 2003-08-03 21:10:28 得分 0
FrameSniper(§绕瀑游龙§) 和Eastunfail(恶鱼杀手) 两位老大,哪去了啊?
Top
21 楼older(井底蛙同样可以向往大海)回复于 2003-08-03 21:14:53 得分 0
var
FChild:TFrm_UserAdd; 申明不要加在过程中
begin
inherited;
if assigned(FChild)=nil then // 或者 if not assigned(FChild) then
begin
FChild:= TFrm_UserAdd.Create(Application);
FChild.Show ;
end
else
begin
FChild.Show;
FChild.BringToFront; //把它Show在最前面
//Frm_UserAdd.Show;
end;
end;
Top
22 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 21:15:28 得分 0
其实只要你FChild这个量不定义在过程体内就可以了,这样你可以定义在这个过程所属类的任何一个域(例如Public、Private、Published和Protected等)或直接定义到单元的接口部分的公共变量区域内,这样就可以保证你的过程结束的时候变量仍然存在于栈中,而不被弹出!
至于你上面说的那个错误,很容易理解,你想由于你的变量定义在过程体内,这样,但过程体退出的时候,变量的生命周期也结束,从栈中被弹出。所以当你关闭窗体的时候,实际上与堆中窗体实例对应的栈中的对象指针已经是不存在了,这样肯定会发生错误了.....Top
23 楼juwuyi(我有,我可以)回复于 2003-08-03 21:15:42 得分 0
FrameSniper(§绕瀑游龙§) 和Eastunfail(恶鱼杀手),还请你们再讲详细点吧
我是菜鸟啊,分不够再加啊。Top
24 楼older(井底蛙同样可以向往大海)回复于 2003-08-03 21:15:54 得分 0
应该是:if FChild=nil then // 或者 if not assigned(FChild) thenTop
25 楼juwuyi(我有,我可以)回复于 2003-08-03 21:17:18 得分 0
FrameSniper(§绕瀑游龙§) ,可是我现在已经定义在
public
FChild:TFrm_UserAdd;
里面啊,可是还是出错啊?Top
26 楼juwuyi(我有,我可以)回复于 2003-08-03 21:21:30 得分 0
我在main里打开FChild,然后关闭FChild。
然后再想打开FChild,结果就报错Abstract ErrorTop
27 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 21:22:03 得分 0
Delphi中任何对象指针都是放在栈中的,而对象指针指定的对象则是放在堆中的....这是其一;另外,定义在一个过程或函数体内的变量都是随着过程或函数的开始而开始生命期,并且在过程或函数执行完毕的时候也结束生命周期的.......
所以你将FChild定义在过程体内,那么由于这个变量是类类型的,所以这个变量是放在栈中的。同时当这个过程开始的时候,FChild也开始自己的生命期,但随着过程的执行结束,FCild也结束自己的生命期,这样,当过程执行完后,实际上栈中已经不存在FChild这个对象指针了,但由于你在过程执行期间创建了与FChild对应的对象实例,因此虽然FChild已经不存在了,但堆中的对象实例仍然存在。这样最后只能导致内存泄露........Top
28 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 21:23:45 得分 0
定义到单元的接口部分的公共变量区内,并且名字前不要加F,一般只有类的私有数据才加前缀F.....Top
29 楼older(井底蛙同样可以向往大海)回复于 2003-08-03 21:32:09 得分 5
var
Form1: TForm1;
FChild:TFrm_UserAdd; //定义在这儿吧
implementation
Top
30 楼juwuyi(我有,我可以)回复于 2003-08-03 21:32:43 得分 0
各位老大,我这个帖子,明天再结了,
转到那边去讨论吧
http://expert.csdn.net/Expert/topic/2104/2104559.xml?temp=.2713129
谢谢了。Top
31 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-08-03 21:36:53 得分 0
嗯~同意older(疲倦的程序员),照他那样说的坐Top
32 楼juwuyi(我有,我可以)回复于 2003-08-03 21:38:00 得分 0
to:older(疲倦的程序员)
你那个不对的。Top
33 楼fly518(我要飞)回复于 2003-08-04 00:51:04 得分 0
子窗口关闭的时候应该将它设置为nil,可是这条语句怎么写self := nil , 提示无效语句,否则前面的程序,打开一次子窗体后,在打开就出现错误Top
相关问题
- 指针的问题,p:=nil和not Assigned(p)是不是一样的
- 关于CoInitialize(nil)
- 区别nil,self,owner?
- nil是什么意思?
- ShellExecute(0,'print',filename,nil, nil,0);
- ShellExecute(0,'print',filename,nil, nil,0);
- adotable1.create(nil) 和 adotable1:=TADOTable.create(nil)的区别是什么?
- Assigned的问题?
- ShellExecute(Handle, 'open', PChar('c:\test\app.exe'), nil, nil, SW_SHOW);请问这里地两个nil是什么意思?
- null_or_nil同意就进来领10分




