在多文档程序中如何不让我的窗口多次创建
我的窗口是运态建的我用if Not Assigned(form1) then form1:=Tform1.create(application);
form1.show;

解决方案 »

  1.   

    不要判断assinged,
    直接再次创建就行了,系统自动给form取名
      

  2.   

    记住关闭窗口时
    form1:=nil;
      

  3.   


      if Form <> nil then
      begin
        Form.Free;
        Form := nil;
      end;
      

  4.   

    var   
      sClassName : String;
      TheHandle : THandle;
    begin
      sClassName := TheFormClassName;
      TheHandle := FindWindow(Pchar(s),Nil);
      if TheHandle <> 0 then 
        ShowMessage('Exist') ;
      

  5.   

    ahuige(灰不遛秋) ——对,其余的——错!记得在form1close中,写入下代码,释放所占资源。action :=caFree;
      

  6.   

    有两个办法创建和释放窗体:1、自动释放创建的时候这样写,
    form1:=Tform1.create(application);
    form1.show;
    注意:form1应该是个临时变量,创建form后,就不要用它了,然后释放代码如同bigysw(大花脸) 所说:
    在form1close中,写入下代码,释放所占资源。
    action :=caFree;这样的话就可以有多个实例。2、手工释放:可以考虑将代码编写为如下形式:form1:=Tform1.create(application);
    form1.showmodal;
    form1.free;
    form1 := nil注意:form1也应该是个临时变量不过这样做就健不了多个实例了,可以用一个动态数组保存指向Form的变量
    创建时加入数组,释放时删出数组
      

  7.   

    wjlsmail(计算机质子) :看看我们提交的时间,没看到你的回复啊,老兄。不过,就按照你说的用句柄的方式,也只能说是能找到该窗口的句柄而已,并不能创建搂主要求的多个窗口实例。如果还要在外部(该窗口类的外部代码)控制每个窗口实例,照楼上说的用数组控制就行了。
      

  8.   

    if (application.FindComponent('form1')=nil) then
      begin
        form1:=Tform.Create(application);
        form1.BringToFront;
      end
      else
        form1.BringToFront;
      

  9.   

    谢谢 bigysw(大花脸) 先生的回复,我没有明白 :
         "看看我们提交的时间,没看到你的回复啊" , ????
    --------------------------------------------------- 多文档程序中如何不让我的窗口多次创建
     
     他的意思是 :只让窗口创建一次  对吧 ,那么那么写可以呀,我都用过的 是不是我没弄懂意思 ?
      

  10.   

    呵呵,看错了,搂主的“如何”我看成了“为何”。这是我的错,实际上楼主已经自己解决了。 wjlsmail(计算机质子) :我是说我第一次回复跟你的第一次是同时回复的,也就是没有看见你的回复了,不过我也看错了,你是对的,搂主自己也是对的。
      

  11.   

    我一贯使用的办法:
    我对form1.free不赞成使用。
    推荐:
    destructor TFreightItemFormat.Destroy;
    begin
      FreeAndNil(FSrc);
    end;
    不怕多创建
      

  12.   

    各位大哥你多谢了我现在还是在关注这个问题的呀我是这个意思,
    在做一个多文档的程序时你在菜单上要动态的建立一个子窗口那么你是
    如何判断这个窗口已经存了,  
        FBSM_SHXX:=TFBSM_SHXX.create(self);
        FBSM_SHXX.show;
    在关闭时我也把它给free了但是用Assigned(FBSM) 还是可以找到的(实际上我已给free了),我是想我在点菜单时如果这个窗口还在的话那么我就把它给最大化就行了否则的话我再给它运行
        FBSM_SHXX:=TFBSM_SHXX.create(self);
        FBSM_SHXX.show;
      

  13.   

    一个最简单的方法:
      在主窗口中:  if not Assinged(FBSM_SHXX) then  //或者if FBSM_SHXX = nil
        FBSM_SHXX:=TFBSM_SHXX.create(nil);
      FBSM_SHXX.BringToFront;
      FBSM_SHXX.WindowsState:=wsMaximized;
    ——————————————————————————————————————————————————
      在子窗口的OnClose中:    FBSM_SHXX.Free;
        FBSM_SHXX:=nil;