//子窗口显示
procedure ShowFM(FName: TForm);
begin
  if assigned(FName) then
    FName.Show
  else
    Application.CreateForm(TForm , FName);
end;
//调用
ShowFM(FUnit2);
怎么出不来呀?我用的是MDI,在判断里加上FName.Show,会新创建一个空窗体,而不是打开已经设计好的子窗体。
请高手指教。

解决方案 »

  1.   

    那就是一直在执行ELSE 也就是创建窗体咯
      

  2.   

    用  Action := caFree;
      Form2:=nil;
    关闭掉子窗体后,如果再打开,不是需要加一个 if assigned(FName) 吗?
    为什么    Application.CreateForm(TForm , FName)  创建的不是我设计好的子窗体,而是一个空窗体呢?begin 
      if assigned(Form2) then 
        Form2.Show 
      else 
        Application.CreateForm(TForm2 , Form2); 
    end; 
    /////////////////////////////////////////////////////这样直接就能打开
    是不是用的那个函数 de 参数有问题,发现不懂的地方太多了。请指教
      

  3.   

    没有问题... procedure ShowFM(FName: TForm2);
    begin
    if assigned(Form2) then begin
        Form2.Show ;
        end
      else begin
        Application.CreateForm(TForm2 , Form2);
      end;end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    if assigned(Form2) then begin
        Form2.Show;
        end
      else begin
        Application.CreateForm(TForm2 , Form2);
        end;
    end;
      

  4.   

    procedure ShowFM(FName: TForm2);
    begin
    if assigned(Form2) then begin
        Form2.Show ;
        end
      else begin
        Application.CreateForm(TForm2 , Form2);
      end;end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      showfm(form2);
    end;
      

  5.   

    //子窗口显示 
    procedure ShowFM(FName: TForm); 
    begin 
      if assigned(FName) then 
        FName.Show 
      else 
        begin
        Application.CreateForm(TForm , FName); 
        FName.show;
        end;
    end; 
    //调用 
    ShowFM(FUnit2); 
      

  6.   

    如果还不行,那这样
    //子窗口显示 
    procedure ShowFM(FName: TForm); 
    begin 
      if not assigned(FName) then 
        Application.CreateForm(TForm , FName); 
       FName.show; 
    end; 
    //调用 
    ShowFM(FUnit2); 再不行的话,这样
    procedure ShowFM(FName: TForm); 
    begin 
      if not assigned(FName) then 
        FName:=TForm.create(self); 
       FName.show; 
    end;
      

  7.   

    bob008
    你的方法我试过了,只能打开Form2,
    如果打开其它子窗体就要再写另外的procedure ShowFM(FName: TForm3); procedure ShowFM(FName: TForm4);
    我是想 ShowFM(Form3); ShowFM(Form4);这样的使用ShowFM(窗体名称);这个函数。  
      

  8.   

    hys_427 你的方法打开的是新创建的空白窗体,不是已经设计好的窗体了。还有其它办法吗?
      

  9.   

    完全逻辑问题嘛
    procedure ShowFM(FName: TForm); 
    begin 
      if assigned(FName) then 
        FName.Show 
      else 
        Application.CreateForm(TForm , FName); 
    end; 
    当你的子窗体free并置nil后.assigned(FName)就为false了,然后你就将一个空白的窗体
    tform创建的窗体赋给了fname,所以以后永远都是show也是show这个空白的tform的fname了.
      

  10.   

    fenger8293 
    谢谢,听你解释我好像懂了,不过我发现个新问题,照下面的代码procedure ShowFM(FName: TForm); 
    begin 
      if assigned(FName) then 
        FName.Show 
      else 
        Application.CreateForm(TForm , FName); 
    end; 现在知道FName 是空白窗体的原因了,可为什么新创建的FName 不会被 assigned(FName) 检测到,好像一直在else后面的创建操作,每次执行都要创建个新的Fname出来
    assigned(FName) 不是识别窗体名称的吗?老问题还没搞懂,又出个新问题来 郁闷呀...高手请指教!
      

  11.   

    assigned(FName) = FName<>nil
      

  12.   

    问题在于你关闭新的空的form的时候,注意这时候FName已经指向了你的新的空的form(tform类),你再重新又置了nil
    也就是说你永远也找不回来你的设计了内容的form了.
      

  13.   

    所以你要用你tform2(假设是tform2)来create,而不是用它的父类tform的create.你要知道在vcl里只有destroy是virtual的,create不是virtual的.明白了没,所以你这个写的通用的方法本身设计就有问题.
      

  14.   

    这下我明白了,这么说我不能用一个通用的方法判断并打开子窗体了,只能一个按键一个按键的去判断。谢谢fenger8293 ,跟你学了不少,以后请多指教。