各位兄弟,我在编写MDI程序中,希望每次只出现一个Form,如果调用一个新Form,就将目前存在的form清除,再动态建立新Form,然后显示。
  我们知道,建立一个Form可以这样书写
   Application.CreateForm(TfrmMain, frmMain);    因此,我希望建立这样的一个过程(其中全程私有变量OldForm:TForm,用于保存目前的Form对象)
    Procedure TfrmMain.ShowForms(FormClass:TForm;NewForm:TForm);
    在这个过程中应实现这样的功能,先判断OldForm是否为nil,如不为,则OldForm.free,然后再动态建立NewForm,最后将OldForm:=NewForm,可是我查了帮助,发现Tapplicaiton的CreateForm过程是这样定义的:
  procedure CreateForm(FormClass: TFormClass; var Reference);      照这样,我怎么也不能定义自己的动态调用窗体的ShowForms过程,也就不能动态实现动态调用如ShowForms(Form1)..ShowForms(Formn)了。  请各位兄弟,帮帮忙,帮我实现一下这个ShowForms过程。

解决方案 »

  1.   

    参考例子如下:但是意义不大.
    TFormClass= Class of TForm;
    var
     TempFormClass:TFormClass;Procedure ShowForm(FormClass:TFormClass);
    begin
      FormClass:=TFormClass.Create;
      FormClass.show;
    end;调用:ShowForm(TempFormClass);
      

  2.   

    不用傳入原來的Form, 用如下代碼試下:
     if Screen.ActiveForm <> Application.MainForm then
      Screen.ActiveForm.Close;
      

  3.   

    只要看子窗体的个数就行了
    if MDIChildCount>0 then
          ActiveMDIChild.Close;
      

  4.   

    第一位兄弟说的我还没试,但要知道每次传入的窗体是不同的呀。第二、三位兄弟的意思我明白,但这只解决了MDI窗体中只保留一个Form,但还没有解决动态建立另一个窗体。
        我的意思是啊,当我点击工具栏中A按钮时,动态建立FormA并显示它,当我再点击工具栏中B按钮时,清除FormA, 并同时动态建立FormB 并显示它。tmainform.AClick(sender:tobject);
    begin
       ShowForms(FormA);
    end;TmainForm.BClick(Sender:Tobject);
    begin
       ShowForms(FormB);
    end;TmainForm.ShowForms(form);
    begin
      if MDIChildCount>0 then
          ActiveMDIChild.Free;//此处不能使用Close ,因在MDI中,Close只能缩小窗体,不能清除窗体
      TApplcaiton.createForm(参数1,Form);
      Form.show;
     end;  在上面中,参数1该怎样传入呢,传入什么呢???因为平时在Delphi自动生成的语句中一般是这样的。
      Tapplicaiton.createform(TFormA,FormA);
        Tapplicaitopn.createform(TFormB,formB);因此,在ShowForm中,怎样传入正确的CreateForm的两个参数就非常重要的啊。
      

  5.   

    同志们,该怎么办呢?这个通用过程应该很有用啊,如果不是form参数,就好办,可是一牵涉到form就不知道了,唉...................
      

  6.   

    TApplcaiton.createForm(参数1,Form);
    改为
    TApplcaiton.createForm(TForm,Form);
      

  7.   

    经过查找,找到以下方法,非常好用,现在给出答案,让大家共享。procedure TMainFrm.runProgram(strForm:string);
    var
       ClassClient:TComponentClass;
       client:TForm;
    begin
       ClassClient:=TComponentClass(FindClass(strForm));
       Application.CreateForm(ClassClient,client);
    end;
    在调用这个函数之前,必须在相应类单元文件中的"end."之前加上如下语句:
    initialization
       RegisterClass(类名);
    finalization
       UnRegisterClass(类名);
      

  8.   

    楼上的差不多,不用showform,要用application来控制,找到form后showmodal
      

  9.   

    rocedure TForm1.OpenFrom(AfromClass: TFormClass;var Afrom);
    begin
     if not Assigned(TForm(Afrom)) then Application.CreateForm(AfromClass, Afrom)
     else TForm(Afrom).BringToFront;
    end;
    AfromClass:為窗口類,Afrom為指針
    調用
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    OpenFrom(TForm2,Form2);
    end;
      

  10.   

    我也提供一个思路吧,我做的时候,如果发现有一窗体已经存在则直接显示之;procedure CreateExclusiveForm(InstanceClass: TComponentClass; var Reference);
    var
      i:Integer;
    begin
      for i :=0  to screen.FormCount-1 do begin
        if screen.Forms[i].ClassType=InstanceClass then begin
          TComponent(Reference) := screen.Forms[i];
          exit;
        end;
      end;  application.CreateForm(InstanceClass,Reference);
    end;
      

  11.   

    FrmList:TList;FrmList;=TList.Create;tmainform.AClick(sender:tobject);
    var
     FormA:TForm;
    begin
       TForm(FrmList).Free;
       FrmList.Delete[0];   FormA:=TForm.Create(Self);
    FrmList.Add(FormA);
       ShowForms(FormA);
    end;TmainForm.BClick(Sender:Tobject);
    begin   TForm(FrmList).Free;
       FrmList.Delete[0];Formb:=TForm.Create(Self);
       ShowForms(FormB);
    FrmList.Add(FormB);
    end;另把close里的Aciton := caFree;