首先我希望你能耐心的看完。。谢谢你的帮助
建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个窗口所占的资源会不会有问题???
另外,有些窗口是需要一些特定的登录后才有的参数做为属性值等等。。这样实例化窗口显然有一些问题。但这个项目当中,我不希望其它小组成员会重复的实例化很多窗口。。我该怎么设计? 大家在自己的项目当中一般是怎么做的呢?
建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个窗口所占的资源会不会有问题???
另外,有些窗口是需要一些特定的登录后才有的参数做为属性值等等。。这样实例化窗口显然有一些问题。但这个项目当中,我不希望其它小组成员会重复的实例化很多窗口。。我该怎么设计? 大家在自己的项目当中一般是怎么做的呢?
在方法里实例化,显示,以后调用这个方法好啦,很烦吗?
在方法里实例化,显示,以后调用这个方法好啦,很烦吗?你的方法适用于简单的窗口,当是由于众多的窗口多态各自的属性各不一至,所以你的方法。我也复要重载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的方法。
存储一个实例化的窗体,
如果要实例化一个对象,先检查hashtable中是否存在。如果没有。就实例化。
关闭窗体的时候,要从hashtable中删除
你需要重写show方法,但并不需要每个窗体的show都写一遍的,可以将窗体名作为参数传进去
使用switch case以及default来实现具体窗体参数的设置或者你不重写,只是自己写一个用于show窗体的方法来实现也可以的!
在启动程序时:
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
但是,当你要是用Close()是就会连同运用程序一起关闭了。
所以,做一下改动:
[STAThread]
static void Main()
{
(new Form1()).Show();
Application.Run();
}
就可以是用Close()方法了。
我是个初学者,说的不好请见谅。
如果是,那么可以考虑单件模式,动态生成对象:
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;
}
这样写看上去很笨拙,似乎代码很多余,但实际性能影响小得多。
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);
}
public static Form2 BuildRemind()