假如:我现在有20个FORM,名字分别为form1,form2.......form20。在程序运行的时候,我只希望系统显示一个form,其它的form都是隐藏的。例如现在显示的是form1,当我点击相应的button之后,form2会显示出来,而其它的窗体,包括form1都是隐藏的。我想到一个笨方法:procedure TMainForm.Button1Click(Sender: TObject);
begin
  form1.show;
  form2.hide;
  form2.hide;
  ...........
  ...........
  form20.hide;end;我觉得这个方法有点笨了,要是有20个button,那么,要写20遍类似的代码。要是有更多的form,就会累爬下了,^_^想问问各位,有什么方法能使这个过程简单一些??如何实现的哪???有没有一个统一的方法来实现?如果有,我就可以编写成一个DLL了,:)

解决方案 »

  1.   

    都说代码是类似的咯,copy一下再修改一点不就行了?
    呵呵
      

  2.   

    呵呵,我也知道COPY的啊,只是想象各位请教一下,是否有别的方法实现,就当作是讨论了吗,呵呵
      

  3.   

    你去看看RegisterClass和GetClass函数吧,用这两个函数可以实现你需要的功能,目前我在作的系统超过100个Form,是通过这个方法来处理的
      

  4.   

    使用FindComponent,对button和form建一个对应关系,通过窗体名来查找。简单例子如下:procedure TForm1.Button1Click(Sender: TObject);
    var
      frm : TForm;
    begin
      frm := TForm(application.FindComponent('Form2'));
      frm.Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      frm : TForm;
    begin
      frm := TForm(application.FindComponent('Form2'));
      frm.Hide;
    end;
      

  5.   

    procedure OnlyShowForm(AFormName: String);
    var
      I: Integer;
      comp: TComponent;
    begin
      for I := 0 to Application.componentcount - 1 do
      begin
        comp := Application.Components[I];
        if comp is TForm then
        begin
          if comp.name = AFormName then
            TForm(Comp).show
          else
            TForm(comp).hide;
        end;
      end;
    end;
      

  6.   

    const int   NumForms = 20;
    在主Form(假设为Form1)里建立一个成员变量 TForm * forms[NumForms];
    在Form1的FormShow消息处理函数里增加 赋值定义(注意不能在FormCreate里定义,因为通常Form1在其它Form之前创建).
          forms[0]= this;
          forms[1]= Form2;
          forms[2]= Form3;
          forms[3]= Form4;    ......
    编写一个函数:
    void ShowForms(int n)
    {
         for(int i=0;i<NumForms ;i++)
         {
            if(i==n)
                forms[n]->Show();
            else 
                forms[i]->Hide();
         }
    }
    在按钮消息里,如Button1点击后显示Form2,其它不显示(包括Form1):
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         ShowForms(1);
    }
    如此即可。注意:要在其它Form里(如Form2)安排返回主Form的代码:如Form2里点击某个按钮后返回:
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
         ShowForms(0);
    }外部函数原型说明就不说了。
      

  7.   

    你20个Form都是同一个类吗?还是20个不同的类?
    像这样:?
    var
      Form1: TForm1;
      Form2: TForm2;
      .....
      Form20: TForm20;
      

  8.   

    // 隐藏所有窗口
    for I := 0 to Pred(Screen.FormCount) do
      Screen.Forms[I].Hide;Form1.Show;
      

  9.   

    报歉,给的是BCB的代码,Delphi应该差不多吧。TForm是基类. Show和Hide是基类中的函数,TForm1~TForm20都派生自TForm,给的代码转到Delphi应该可以。