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;

解决方案 »

  1.   

    if assigned(FChild) then //这样改
      

  2.   

    huojiehai(海天子) :
    这样改不行啊,这样就不停打开新的了。
    还有没有其他的什么方法?
    我找过论坛上的问题了,好像就提供这个方法啊
    我怎么搞都通不过编译啊
      

  3.   

    if not assigned(FChild) then //这样改
      

  4.   

    assigned(FChild)返回的是True或False
    不能用nil去判断。
      

  5.   

    if not assigned(FChild) then //这样改老大,这样改根本就打不开!你自己是怎么写的?
      

  6.   

    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;
      

  7.   

    当打开MDI子窗口的时候,如果它已经打开过了,就把这个窗口给激活到最前面,没有打开就创建新窗口。
      

  8.   

    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;
      

  9.   

    huojiehai(海天子),老大,只要你答对了,我肯定立马给分的,而且你要多少都可以拉我这样写不行啊。达不到要求啊!
      

  10.   

    看看这个帖子,他们就是这样写的,可是好生奇怪啊,通不过http://expert.csdn.net/Expert/topic/1800/1800142.xml?temp=.8982355
      

  11.   

    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;
      

  12.   

    ....
    if Not Assigned(FChild) then
    begin
      //创建并显示.........
    end;
    ....
      

  13.   

    呵呵,小鳄鱼.........楼上说的没有错,每次在离开FChild的作用域(你上面写的过程)后栈中指针都会被释放,所以每次运行到这里,这个指针都是重新创建,所以窗体会始终被创建....
      

  14.   

    是的,你的局部变量声明实际在栈中,不信你反汇编看一下绝对有一条
    sub sp,####
    这实际上是在栈中为了局部变量做一个存储区
      

  15.   

    to Eastunfail(恶鱼杀手) :
    我还是有些不明白,你指的是在public/private/protected/oublished定义变量
    FChild:TFrm_UserAdd;还是定义一个函数,然后通过调用这个函数来创建窗体?
    我刚才是用定义变量,结果窗体关了之后,再打开就会出现“
    Abstract Error.”的错误消息!是不是在没有释放对象?
      

  16.   

    问题出在下面这一句
    var
      FChild:TFrm_UserAdd;
    begin
       // ... ...
    end;这是局部变量,解决的办法是在参数中加 var AChild: TFrm_UserAdd 项,
       if not Assigned(AChild) then
          try
             AChild := TFrm_UserAdd.Create(Self);
          except
          end;
    这样就可以了。
      

  17.   

    FrameSniper(§绕瀑游龙§) 和Eastunfail(恶鱼杀手)  两位老大,哪去了啊?
      

  18.   

    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;
      

  19.   

    其实只要你FChild这个量不定义在过程体内就可以了,这样你可以定义在这个过程所属类的任何一个域(例如Public、Private、Published和Protected等)或直接定义到单元的接口部分的公共变量区域内,这样就可以保证你的过程结束的时候变量仍然存在于栈中,而不被弹出!至于你上面说的那个错误,很容易理解,你想由于你的变量定义在过程体内,这样,但过程体退出的时候,变量的生命周期也结束,从栈中被弹出。所以当你关闭窗体的时候,实际上与堆中窗体实例对应的栈中的对象指针已经是不存在了,这样肯定会发生错误了.....
      

  20.   

    FrameSniper(§绕瀑游龙§) 和Eastunfail(恶鱼杀手),还请你们再讲详细点吧我是菜鸟啊,分不够再加啊。
      

  21.   

    应该是:if FChild=nil then  // 或者  if not assigned(FChild) then
      

  22.   

    FrameSniper(§绕瀑游龙§) ,可是我现在已经定义在
      public
        FChild:TFrm_UserAdd;
    里面啊,可是还是出错啊?
      

  23.   

    我在main里打开FChild,然后关闭FChild。
    然后再想打开FChild,结果就报错Abstract Error
      

  24.   

    Delphi中任何对象指针都是放在栈中的,而对象指针指定的对象则是放在堆中的....这是其一;另外,定义在一个过程或函数体内的变量都是随着过程或函数的开始而开始生命期,并且在过程或函数执行完毕的时候也结束生命周期的.......所以你将FChild定义在过程体内,那么由于这个变量是类类型的,所以这个变量是放在栈中的。同时当这个过程开始的时候,FChild也开始自己的生命期,但随着过程的执行结束,FCild也结束自己的生命期,这样,当过程执行完后,实际上栈中已经不存在FChild这个对象指针了,但由于你在过程执行期间创建了与FChild对应的对象实例,因此虽然FChild已经不存在了,但堆中的对象实例仍然存在。这样最后只能导致内存泄露........
      

  25.   

    var
      Form1: TForm1;
      FChild:TFrm_UserAdd;  //定义在这儿吧implementation
      

  26.   

    各位老大,我这个帖子,明天再结了,转到那边去讨论吧
    http://expert.csdn.net/Expert/topic/2104/2104559.xml?temp=.2713129谢谢了。
      

  27.   

    嗯~同意older(疲倦的程序员),照他那样说的坐
      

  28.   

    to:older(疲倦的程序员) 你那个不对的。
      

  29.   

    子窗口关闭的时候应该将它设置为nil,可是这条语句怎么写self := nil , 提示无效语句,否则前面的程序,打开一次子窗体后,在打开就出现错误