首先我希望你能耐心的看完。。谢谢你的帮助
建winform 工程  那么会自动有一个入口Main() 函数现在有许多的窗体,比如 form1 form2 form3 form4  现在我需要把某个窗口显示出来如 form2 f2 = new form2() form2.show(); 那么关闭窗口close的时候便释放了该窗口了。。再次调用的时候又要重新生成实例 new 一次 这样非常的繁
而且为了避免出现重复的实例化
我这里借鉴了delphi中的.DPR文件
先建一个基类窗口 baseform  Main()函数在这个类中  先声明form1 form2 form3 form4 的实例化 Main()
{
   form1 f1 = new form1();
   ......................等等
   Application.Run(f1); //第一个入口窗体}
然后重写了onCloseing() 事件
让关闭窗口 Cancel = true; this.Hide(); //不关闭窗口隐藏窗口
后面调用的话,只要f2.show(); //便可以了。。但所代来的问题...由于初始的时候我先把所有的窗口实例化了一遍 但我这个应用程序有100个窗口,一下子实例100个窗口所占的资源会不会有问题??? 
另外,有些窗口是需要一些特定的登录后才有的参数做为属性值等等。。这样实例化窗口显然有一些问题。但这个项目当中,我不希望其它小组成员会重复的实例化很多窗口。。我该怎么设计? 大家在自己的项目当中一般是怎么做的呢?

解决方案 »

  1.   

    自己写一个SHOW方法,参数是窗体名
    在方法里实例化,显示,以后调用这个方法好啦,很烦吗?
      

  2.   

    这个思路正确,蛮好的,100个窗体,应该不会占用很大的资源,对于要传参数才能实例化的窗体,提供一个属性设置,设置该属性值的时候在new该窗体,应该问题不大.
      

  3.   

    自己写一个SHOW方法,参数是窗体名
    在方法里实例化,显示,以后调用这个方法好啦,很烦吗?你的方法适用于简单的窗口,当是由于众多的窗口多态各自的属性各不一至,所以你的方法。我也复要重载100次。。这样并不见得效率高。不过还是谢谢你的建议。。还有大牛出来帮帮我吗?
      

  4.   

    既然你想统一100多个窗口,那首先要定义好这100多个窗口的统一入口,如何创建、如何设置初始属性(比如定义窗口创建的方法、设置属性的方法),然后才能谈得上如何统一调用。当然这个统一调用也可能不是一行语句就能搞定的,可能会是这样:
    MyForm mf = MyFormFactory.CreatForm("MyNameSpase.Form13");
    mf.SetPara("Witch", 200);
    mf.SetPara("Height", 100);
    mf.Show();
    ....mf.close();
    mf = null;
    其中,项目中所有窗口都继承自MyForm类,MyForm有一个SetPara的方法可以设置窗口的属性;MyFormFactory是创建窗口的工厂类,CreatForm是通过反射方法创建Form的方法。
      

  5.   

    建立一个hashtable
    存储一个实例化的窗体,
    如果要实例化一个对象,先检查hashtable中是否存在。如果没有。就实例化。
    关闭窗体的时候,要从hashtable中删除
      

  6.   

    前面几位说的很有道理,你统一的实例是不能带有参数的,当你调用show的时候你就需要在show之前为你特别需要的窗体传递参数进去了
    你需要重写show方法,但并不需要每个窗体的show都写一遍的,可以将窗体名作为参数传进去
    使用switch case以及default来实现具体窗体参数的设置或者你不重写,只是自己写一个用于show窗体的方法来实现也可以的!
      

  7.   

    我也正在做winfrom的项目,遇到的问题跟你查不多。
     在启动程序时:
                      [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    }
     但是,当你要是用Close()是就会连同运用程序一起关闭了。
     所以,做一下改动:
                   [STAThread]
    static void Main() 
    {
    (new Form1()).Show();
    Application.Run();
    }
    就可以是用Close()方法了。
    我是个初学者,说的不好请见谅。
      

  8.   

    是否你的每个窗体都是一个不同的类?如Form1类Form2类...,即是否每个类只需要一个对象(一个窗体)。
    如果是,那么可以考虑单件模式,动态生成对象:
    class Form1
    {
         private Form1 _myForm;
         private Form1(...)   //隐藏构造函数
         {
         }
         static public Form1 Create(...)
         {
              lock (this)
              {
                   if (_myForm == null)
                   {
                        _myForm = new Form1(...);
                   }
              }
              return _myForm;
         }
    }Create方法也可以改成用属性,不过通常容易把属性当作字段来看待,锁用得太多影响性能,建议这样写:
    static public Form1 CurrentForm
    {
         if (_myForm == null)
         {
              lock (this)
              {
                   if (_myForm == null)
                   {
                        _myForm = new Form1(...);
                   }
              }
         }
         return _myForm;
    }
    这样写看上去很笨拙,似乎代码很多余,但实际性能影响小得多。
      

  9.   

    单例,用多线程来加载这些窗体。
    form1代码 [STAThread]
    static void Main() 
    {
    Thread th = new Thread(new ThreadStart(Form1.Create));
    th.Start();
    Application.Run(new Form1());
    }
    private static void Create()
    {
    Form2 form2 = Form2.BuildRemind();
    } private void button1_Click(object sender, System.EventArgs e)
    {
    if(Form2.form2!=null)
    {
    Form2.form2.ShowForm();
    }

    }form2的代码 public static Form2 form2 = null;
    public static Form2 BuildRemind()
    {
    if(form2 == null)
    {
    form2 = new Form2();
    form2.Visible = false;
    }
    return form2;
    } public void ShowForm()
    {
    this.Visible = true;
    }
    protected override void WndProc(ref System.Windows.Forms.Message m) 
    {
    if (m.Msg == 0x0112&&m.WParam.ToInt32()== 0xF060)
    {
    this.Visible = false;
    m.WParam=System.IntPtr.Zero;
    }
    base.WndProc (ref m);
    }
      

  10.   

    加载也不慢,用户开窗口也狠快。内存比白菜贱。一次实例100个窗体我觉得狠爽。最佳答案。上边忘了同步这个事了,,,这样就可以了。[MethodImplAttribute(MethodImplOptions.Synchronized)]
    public static Form2 BuildRemind()