CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

奇怪,我这句怎么通不过呢:if assigned(FChild)<>nil then

楼主juwuyi(我有,我可以)2003-08-03 20:30:37 在 Delphi / VCL组件开发及应用 提问

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分

关键词

  • .net
  • 函数
  • 指针
  • 执行
  • fchild
  • tfrm
  • useradd
  • 变量
  • 定义
  • assigned

得分解答快速导航

  • 帖主:juwuyi
  • huojiehai
  • Eastunfail
  • FrameSniper
  • older

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo