如何防止Form被多次实例化(不一定是MDI窗体)
如何防止Form被多次实例化(不一定是MDI窗体)
问题点数:20、回复次数:17Top
1 楼mapserver(杨东 http://mapserver.cnblogs.com)回复于 2006-07-04 10:41:50 得分 5
在窗体里加一个静态变量,实例化的时候就把这个静态变量置为true,下次实例化的时候判断这个静态变量。Top
2 楼NaZiChong(那子虫)回复于 2006-07-04 10:43:15 得分 10
//声明类成员
Form frm=null;
//在类中使用
if (frm==null || frm.IsDisposed) frm=new Form();
frm.Show();
......Top
3 楼liaodanz(雪宇)回复于 2006-07-04 10:44:58 得分 5
private static newpaper newpaper; //静态变量,保存唯一实例
private void menunew_Click(object sender, System.EventArgs e)
{
if(newpaper==null || newpaper.IsDisposed) //第一次实例化也好,被关了也好,都重新实例化
{
newpaper = new newpaper();
newpaper.Tag=this;
newpaper.Show();
}
else
{
newpaper.Activate();
newpaper.WindowState=System.Windows.Forms.FormWindowState.Normal;
}
}Top
4 楼Knight94(愚翁)回复于 2006-07-04 10:45:17 得分 0
参看
http://blog.csdn.net/Knight94/archive/2006/05/24/752783.aspxTop
5 楼wwfy(我舞飞扬)回复于 2006-07-04 10:45:24 得分 0
很多办法吧。
可以在类型里面增加两个静态属性,
一个记录是否已经存在类型的实例,一个记录实例的引用。
实例化类型的时候检查一下类型的静态属性,如果有实例了,直接引用显示。
如果没有,实例化类型,并将类型的实例化属性值为true,
将实例的引用赋予类型的另外一个属性。
关闭form的实例时候将类型的实例化属性值为false,将类型的另外一个属性值为null。
这样应该可以。
Top
6 楼xiaozhimin1978(小灰狼)回复于 2006-07-06 16:22:41 得分 0
用单一模式
1、构造方法私有
2、设置一个静态、私有的窗体变量
3、加一个静态、公共的 Get 属性,可以获得对这个私有变量的引用
public class MyForm : System.Windows.Forms.Form{
private static MyForm _instance = new MyForm();
public static MyForm Instance{
get{
if(_instance == null || _instance.IsDisposed)
_instance = new MyForm();
return _instance;
}
}
public MyForm(){
//......
}
}
Top
7 楼zhzuo(秋枫)回复于 2006-07-07 13:39:08 得分 0
单件模式
http://birdshover.cnblogs.com/archive/2006/06/15/424656.htmlTop
8 楼gengyu(八爪鱼)回复于 2006-09-06 16:37:44 得分 0
/// <summary>
/// 查询MDI子窗体是否存在
/// </summary>
/// <param name="childFrmName"></param>
/// <returns></returns>
private bool checkChildFrmExist(string childFrmName)
{
foreach (Form childFrm in this.MdiChildren)
{
if (childFrm.Name == childFrmName) //用子窗体的Name进行判断,如果存在则将他激活
{
if (childFrm.WindowState == FormWindowState.Minimized)
childFrm.WindowState = FormWindowState.Normal;
childFrm.Activate();
return true;
}
}
return false;
}
//---------------------------显示子窗体--------------
private void toolStripButton1_Click(object sender, EventArgs e)
{
//通过窗体名称查询该窗体是否已经存在,如存在则显示,否则就新创建一个
if (this.checkChildFrmExist("FrmMain") == true)
{
return;
}
FrmMain frmm = new FrmMain();
frmm.MdiParent = this;
frmm.size = this.ClientSize;
frmm.Show();
}Top
9 楼xfary(风飘摇)回复于 2006-09-06 16:41:48 得分 0
Use " Single Pattern "Top
10 楼terryghz()回复于 2006-09-06 16:57:06 得分 0
goodTop
11 楼delicioustian(天天酷鱼)回复于 2006-09-07 12:57:37 得分 0
谢谢楼上几位朋友。。我也碰到这问题。通过你们的方法,我解决了问题。Top
12 楼zhongwanli(㊣【为了老婆,二次重构____然后升★★】㊣)回复于 2006-09-07 13:03:01 得分 0
建立一个容器去管理Top
13 楼jackyped(MSN: jpu_jacky@eyou.com)回复于 2006-09-07 14:19:42 得分 0
.NET中的设计模式二:单件模式
--------------------------------------------------------------------------------
单件模式(Singleton)是一个非常简单的模式,这是我第一个理解并且能运用的模式。有时候模式的复杂程度并不在于本身,而是由于他的应用目的。最初的时候面对一个模式经常充满了困惑,一个简单的调用为什么要搞的如此复杂?为什么要建立这么多类,只是为了打开一个文件。
通常说来学习一个模式是一个接受、认可、领会的过程。接受:了解模式的结构,了解实例的意义;认可:认可该模式在实际工程中的作用和可行性;领会:将模式应用到开发过程中。
而模式的应用目的说到底无非是为了降低模块之间在时间和空间上的耦合程度,以此提高模块的复用性,降低出错的概率。
单件模式
Singleton模式是一个较为简单的模式,下面的代码就可以建立一个Singlton模式的例子,这是一个写系统日志的类。
public class LogWriter
{
//申明一个静态的变量,类型为类本身
private static LogWriter _instance = null;
//将类的构造函数私有化,使得这个类不可以被外界创建
private LogWriter()
{
}
//提供静态的方法,创建类的实例
public static LogWriter GetInstance()
{
if (_instance == null)
{
_instance = new LogWriter();
}
return _instance;
}
//下面实现类的其他功能
//....
}
调用者不可以通过new的形式得到Singleton的实例,调用的例子如下:
LogWriter log = LogWriter.GetInstance();
log.Debug("hello world");
实际应用
很容易想象,单件模式适用于下面的情况:整个系统中某个对象是唯一的,或者是有固定数量的。比如数据库连接,配置文件,等等……
模式是一种程序员间的约定术语,语言可以成为思维的基础。有了这样的语言,一些复杂的概念就变得容易交流了。比如设计人员只要说到,某个类是一个单件模式,是一个Singleton,程序员听见以后就至少应该明白这个类的调用方式了,而不用再详细的说明。Top
14 楼zxcayumi()回复于 2006-09-12 13:53:21 得分 0
http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c4c.aspx#q824qTop
15 楼gengyu(八爪鱼)回复于 2006-09-13 19:41:05 得分 0
/// <summary>
/// 查询MDI子窗体是否存在
/// </summary>
/// <param name="childFrmName"></param>
/// <returns></returns>
private bool checkChildFrmExist(string childFrmName)
{
foreach (Form childFrm in this.MdiChildren)
{
if (childFrm.Name == childFrmName) //用子窗体的Name进行判断,如果存在则将他激活
{
if (childFrm.WindowState == FormWindowState.Minimized)
childFrm.WindowState = FormWindowState.Normal;
childFrm.Activate();
return true;
}
}
return false;
}
使用
private void toolStripButton3_Click(object sender, EventArgs e)
{
//通过窗体名称查询该窗体是否已经存在,如存在则显示,否则就新创建一个
if (this.checkChildFrmExist("FrmStatistics") == true)
{
return;
}
// 如果该窗体不存在则新生成一个窗体
FrmStatistics frms = new FrmStatistics();
frms.Show();
}Top
16 楼bill024(小黑点,对不起,走好!)回复于 2006-09-13 20:28:29 得分 0
关注!Top
17 楼lunice()回复于 2006-11-14 20:33:15 得分 0
markTop




