新增加Form之后,是默认创建的。
要是不默认创建Form,如何能在Application中遍历属于自己工程的所有Forms呢?
我看了Tappplication的帮助没有找到啊!

解决方案 »

  1.   

    我对动态创建的form都是自己写列表保存的.不过也可以使用Application.Components 来实现.
    前提是你创建form时采用以下方式 
      Frm := TFrm.Create(Application) ;
      //而不是 
      Frm := TFrm.Create(nil) ;
      

  2.   

    难道Form不被创建的话,就不能知道它的存在吗?
    我的意思并不是要找到那些被创建的Form,而是在只有MainForm的情况下,
    Application对象就不能找到所有应该属于他自己的那些Form?
      

  3.   

    一个获取当前所有窗体的 
    http://topic.csdn.net/t/20030828/13/2197652.html
      

  4.   

    我还是觉得对于application来说,Form只有创建后才能被找到,如不被创建的话,只有接口存在,并没有实例。
    但是直到接口并没有用。我一直觉得在工程文件中就可以找到所有的窗体实例(无论创建与否,因为delphi创建Form时,都默认增加一个该窗体类的实例作为全局变量),但是application运行之后也可以理解为是该工程的一个实例吧,看来还是找不到阿
      

  5.   

    Mdi的窗体遍历也只能是已经创建的子窗体才能被发现阿
      

  6.   

    我奉劝你不要这么写代码。
    日前,公司一个程序,存在浮动窗体。
    我就是想着怎么遍历,一直耽搁了工程。
    还是直接提供一个Form列表比较实在。
      

  7.   

    办法是有的,遍历rtti中的class或者是通过resource文件总是能找到的,但是没必要搞得又慢又麻烦,不然还何苦还要RegisterClass这种东西呢
    如果是关于TCustomForm的继承类的实例,一般在创建时都会调用TCustomForm.CreateNew,里面可以很清楚的看到这么一句
        Screen.AddForm(Self);
    所以,Application里没有的窗体也同样可以通过Screen.CustomFormCount/CustomForms遍历出来
      

  8.   

    对于MDI可以这样var
      i: integer;
      f: TForm;
    begin
    ShowMessage(IntToStr(Screen.FormCount));
      for i := 0 to Self.MDIChildCount - 1 do begin
        f := Self.MDIChildren[i];
        //todo
      end;
    end;
    对于非MDI可以这样var
      i: integer;
      f: TForm;
    begin
    ShowMessage(IntToStr(Screen.FormCount));
      for i := 0 to Screen.FormCount - 1 do begin
        f := Screen.Forms[i];
        //todo
      end;
    end;注:这种方式只能遍历所有自动创建的窗体(不包含Data Module)
      

  9.   

    回复[Seamour]:
    我看到了TCustomForm.CreateNew,里面的Screen.AddForm(Self)这句话,但是既然是CreatNew方法里面的,那么在没有创建之前,是不会触发她的阿,更谈不上添加到Tscree了。那个只能找到已经存在于屏幕的窗体
    感觉很像shift+F12那样调出所有的窗体类,一样,实在不行的话
    我觉得遍历所有的窗体接口总可以吧?但是还没找到,再不行,就只能用列表保存了。
      

  10.   

    什么叫“窗体接口”?你通过什么来遍历?ide列出窗口可以根据project中的unit枚举,rtti中倒是也有涉及unit的信息,但又不是一个array在那等着你枚举
    从链接器的角度看,如果你没有使用一个类,那么它会认为你没有使用这个类,就不会把链接它的rtti链,否则会让编译出来的文件变得非常臃肿。如果你既没有Create它,又没把类Add到list中,那么很遗憾,就算遍历映射到内存的code段,没有链接进来的照样还是没法找到
      

  11.   

    delphi 创建Form之前都是先定义一个INTERFASCE的阿 ,然后产生窗体类,那个不就是窗体类的“接口”吗,
    可能不确切  我是这么理解的