单例模式——解决MDI子窗体实例化的问题
来源:互联网 发布:java我要自学网 编辑:程序博客网 时间:2024/06/13 21:47
机房收费系统进行有一段时间了,但是始终有些历史遗留问题。比如,如何MDI子窗体如何显示在上层的问题和MDI子窗体实例化的问题。
对于如何显示在上层的问题,这次采用的还是SetParent函数,在模块里面添加:
<span style="font-size:18px;"><span style="font-size:18px;"> '定义一个用来设置子窗体的函数 Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long</span></span>
接着,要解决的就是子窗体实例化的问题,然后查过一些方法之后,选择了单例模式。回过头去查自己当初学设计模式时的代码:
<span style="font-size:18px;"> <span style="font-size:18px;">public partial class FormToolbox : Form { private static FormToolbox ftb = null; //声明一个静态的类变量 private FormToolbox() //将构造放改成私有的,外部代码不能直接new来实例化它 { InitializeComponent(); } private void FormToolbox_Load(object sender, EventArgs e) { } //得到类实例的方法,返回值就是本类对象,注意,此方法也是静态方法 public static FormToolbox GetInstance() { if (ftb == null || ftb.IsDisposed) { ftb = new FormToolbox(); ftb.MdiParent = Form1.ActiveForm; } return ftb; } }</span></span>
大的方针制定好之后,开始动手写。。
动手的时候,才会发现,学习的时候做的DEMON其实总是非常理想化的东西,实际中面临的问题往往更复杂。
复习了下设计模式之后,然后就开始写自己的VB.NET版本的了,为了解决窗体不美观的问题,这次还是加了容器空间,load的时候平铺窗体。
但是,每次子窗体弹出来,总是会闪一下,然后消失,再点击按钮,让子窗体弹出来,这下才会变正常。就像《超级破坏王》中的云妮洛普一样,
看起来就是程序中的BUG. 之后单步监视了很久,发现,调用setparent的时候,子窗体因为被前置,就会出现在主窗体的前面,但是在setparent之后,还是有了某某.Show()方法,这就造成了一个矛盾,setparent刚将窗体置前,show方法又将窗体隐藏在主窗体和控件的夹层里面了,╮(╯▽╰)╭ 矛盾啊。改完这个之后,解决了闪现的问题。
还有单例的问题:
<span style="font-size:18px;"><span style="font-size:18px;">If IsNothing(checkBalance) Or checkBalance.IsDisposed Then '如果没有实例化</span></span>
但是,每次运行到这里的时候就会出错:“未将对象的引用设置到对象的实例的问题”
细想下,刚刚声明的对象,根本没有new,在这行这句话的时候,IsNothing值为true,然后它会接着调用IsDisposed,这时就会出现问题,因为checkBalance根本就是Nothing嘛~这时想起了以前学习C#的时候学到的一个逻辑短路的问题:C语言的“逻辑短路”
利用逻辑短路,可以很好的解决“未将对象的引用设置到对象的实例的问题”。
so,只需查查VB.NET的逻辑运算符,然后我找到了OrElse。。。
代码如下:
<span style="font-size:18px;">#Region "单例模式:用来判断本窗体是否已经实例化" Private Shared checkBalance As frmCheckBalance = Nothing '定义一个静态的类变量 Private Sub New() ' 此调用是 Windows 窗体设计器所必需的。 InitializeComponent() ' 在 InitializeComponent() 调用之后添加任何初始化。 End Sub Public Shared Sub GetInstance() ' As frmCheckBalance '用来出现实例 If IsNothing(checkBalance) OrElse checkBalance.IsDisposed Then '如果没有实例化 '注意:1,要判断窗体是否已被实例化和窗体是否被销毁过(当关闭一个窗体时,资源被释放,但是并不是nothing) ' 2,orelse产生了逻辑短路的问题,如果这里用Or会产生错误,因为可能会引用不存在的对象。 checkBalance = New frmCheckBalance '实例化checkbanlance End If checkBalance.MdiParent = frmMain '设置父窗体 checkBalance.Show() '显示窗体出来,但是此时子窗体还是被隐藏在下层的,必须要通过SetParent将它拿到上层来 SetParent(checkBalance.Handle.ToInt64, frmMain.Handle.ToInt64) '设置窗体置前 'Return checkBalance '返回 End Sub#End Region</span>
上面对单例模式有所改动,但是不影响单例模式的灵魂。
在主窗体里,只需调用sub 过程就好。
<span style="font-size:18px;"> Private Sub checkBalanceMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles checkBalanceMenu.Click frmCheckBalance.GetInstance() End Sub</span>
PS:代码里面还是一点点BUG,正在修改中,希望路过的高手们指点一二~
- 单例模式——解决MDI子窗体实例化的问题
- 如何实现单实例的MDI子窗体
- MDI的子窗体问题
- VB.NET章鱼哥出品—如何解决MDI子窗体被父窗体中的控件覆盖的问题
- MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
- MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
- (转)MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
- 机房重构(二)--MDI窗体问题+优化的单例模式
- 利用单例模式操作MDI主窗体与其相关子窗体
- 单例模式实现mdi窗体控制
- MDI窗体与单例模式
- 解决点击MDI父窗体下拉菜单,子窗体重复出现的问题
- 机房收费系统-MDI窗体与子窗体的问题
- C# MDI编程中子窗体调用子窗体的问题
- MDI——单例模式
- 解决WinForm(C#)中MDI子窗体最大化的问题(VB.net中也适用)
- MDI窗体的一些问题及单件模式的应用
- MDI父窗体控件挡住子窗体的问题,用win API SetWindowPos()的方法来解决,向高手请教
- oracle sql developer 和pl sql developer的区别
- QT添加图片资源
- POJ训练计划2503_Babelfish(二分)
- Oracle 11g 启动sql developer 时提示enter full pathname of java.exe
- 怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?
- 单例模式——解决MDI子窗体实例化的问题
- SQL Server存储过程
- 学生信息管理系统初了解
- jQuery源码学习笔记:扩展工具函数
- 通过java操作mongodb
- 柳笛声声
- LeetCode Reverse Integer
- ASP.NET中如何正确使用Session
- JQuery获取浏览器高度