假设已知N个Form.Name,如何用编码的方式动态打开它?我想要的过程如下:Procedure OpenForm(FromName: string);
begin
  //代码打开名字为FromName的窗体,最好能检测此Form是否存在项目中
end;

解决方案 »

  1.   

    FromName:=TFromName.Create(Application);
      FromName.Show ;
      

  2.   

    uses Unit2;procedure TForm1.OpenForm(FormName: string);
    var
      Component: TComponent;
    begin
      Component := Application.FindComponent(FormName);
      if (Component is TForm) and (Component.Name = FormName) then
        TForm(Component).Show;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      OpenForm('Form2');
    end;不要忘记引用要开打窗体的单元
      

  3.   

    Application.CreateForm(Tform1,Form1);
    Form1.show
      

  4.   

    各位朋友不要把问题看得太简单了(也许我的表达能力太差,抱歉),分不是那么好赚的!jacky_shen(jacky):你的方法只能解决那些Form已经Create的,但我相信一个大的项目没理由程式一启动时将所有Form都Create。请真正的高手指点! 
      

  5.   

    把一个窗体添加进工程的时候,项目文件里有一行类似Application.CreateForm(TForm1, Form1);的语句,这个就是Create窗体的语句,你可以在程序需要的地方使用这个语句,然后Show一下,窗体就出来了.
    当然,创建窗体有很多种方法,楼上的朋友说的都可以用啊...
      

  6.   

    以Delphi 7为例:Project--Options--Forms这里面有两个ListBox,左边的是自动创建的窗体,右边的可用的窗体在左边那一列的,你只需要FormName.Show就可以了而右边的,你需要在这之前加上Application.CreateForm(TFormName, FormName);楼上的代码我没有验证,不过我想跟我说的意思应该差不多如果你非得要连大小上面有什么都动态创建。。你非有这爱好的话我也可以告诉你~不过那就看你的意思了:)
      

  7.   

    我觉得大家可能都没理解楼主的意思
    知道了TFormName,谁不会阿。
    难题就是怎么取得TFormName,我也不会,
    不过楼主不怕麻烦的话可以这么写:
    function StrToForm(FormName:String):TForm
    begin
      Result := nil;
      if FormName='Form1' then
         Result := TForm1.Create(Application);
      if FormName='Form2' then
         Result := TForm2.Create(Application);
       .......
    end;
    其实也不是很烦啦
    还有我也非常想知道有没有一劳永逸的方法,能不能告诉一下
      

  8.   

    假设已知N个Form.Name,如何用编码的方式动态打开它?(楼上的看清楚这行)我想要的过程如下:Procedure OpenForm(FromName: string);
    begin
      //代码打开名字为FromName的窗体,最好能检测此Form是否存在项目中(这句话不明白)
    end;
      

  9.   

    知我者,tzh2001(tzh)也!
    你的方法是我们现在使用的,我相信应该有办法的,只是我们还不够高
    ___________________________________
    我是一只菜鸟,但并不是只有菜鸟才提问
      

  10.   

    看看这个能不能满足楼主要求:
    function CreateFormByClassName(const ClassName: string): integer;
    var
      AClass: TPersistentClass;
      AForm: TCustomForm;
    begin
      AClass := GetClass(ClassName);
      if AClass <> nil then
      begin
        AForm := TComponentClass(AClass).Create(Application) as TCustomForm;
        Result := AForm.ShowModal;
      end;
    end;function CreateFormByClassName(const ClassName: string): integer;
    var
      AClass: TPersistentClass;
      AForm: TCustomForm;
    begin
      AClass := GetClass(ClassName);
      if AClass <> nil then
      begin
        AForm := TComponentClass(AClass).Create(Application) as TCustomForm;
        Result := AForm.ShowModal;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
       CreateFormByClassName('TForm2')
    end;initialization
      RegisterClass(TForm2);
      

  11.   

    楼主请看;请在mainForm 中引用要建立的两个窗体,uses 部分加入即可;uses Unit2, Unit3;{$R *.dfm}
    //这里是根据类建立窗体
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with TFormClass(FindClass('TForm2')).Create(Application) do
        try
          ShowModal;
        finally
          Free;
        end; 
    end;///这里是注册你要动态建立的所有窗体类,必须注册,否则找不到的
    initialization
      RegisterClasses([TForm2,TForm3]);
    end.
      

  12.   

    一、打開子窗體
    procedure OpenChildForm(FormClass: TFormClass; var Fm; AOwner:TComponent);
     var Child :tform;                              //子窗體打開過程
         i:integer;
    begin
      for i := 0 to Screen.FormCount -1 do
        if Screen.FormS[i].ClassType=FormClass then
        begin
        Child:=Screen.Forms[i];
        IF ((Child.WindowState=wsMaximized) OR
                      (Child.WindowState=wsNormal)) then
            Child.BringToFront
        ELSE
          BEGIN
          Child.WindowState:=wsNormal;
           Child.BringToFront;
          END ;
          exit;
        end;
      Child:=TForm(FormClass.NewInstance);
      TForm(fm):=Child;
      Child.Create(AOwner);
    end;
    二、打開一般(NORMAL)窗體
    APPLICATION.CreateForm(TFORMNAME,FROMNAME)
      

  13.   

    if not Assigned(FromName) then  //检查是否已经创建
      formname:=tformname.create(application); //没创建就创建一个
    formname.show;//显示
      

  14.   

    一、打開子窗體
    procedure OpenChildForm(FormClass: TFormClass; var Fm; AOwner:TComponent);能否将var Fm 换成 Fm:string 如何写???????
      

  15.   

    我采用了 S.F.(萧寒(Chinasf)) 的方法,其实 newc_k(帕拉丁)的方法是一样的
    多谢两位!