vb.net 防止MDI子窗体被多次实例化的四种方法

方法一
            可能没有什么实用性,只适合简单项目:
       Dim frmTmp As ClassForm        "实现已经设计好了一个称作(类名为)ClassForm的表单       
       frmTmp = New ClassForm          "在此定义它的一个实例

        frmTmp.ShowDialog()                "作为模式窗体显示
这样在当前窗体没有关闭以前,其他form上的菜单按钮都不可用,巧妙使用可以避免多次实例化的问题。
方法二
          只适用于,form不是特别多,且多运行时占用内存没有特殊要求的场合
         在项目运行时,分别定义每个可能用到的form的实例,但不显示,只有在需要显示的时候每次调用,x.show(x为想显示的form实例名),关闭的时候使用x.hide即可。
方法三
        分别定义每个需要显示的form类的全局变量,在实际显示窗体前使用以下代码:
      If frm Is Nothing OrElse frm.IsDisposed Then
            frm = New Form1
            frm.Show()
        Else
            frm.Activate()
        End If
方法四
       本方法特别适用于多文档界面:
        Dim frmTmp As Form
      "搜索每个MDI子窗体一般打开的子窗体不会太多,所以不存在速度问题
       For Each frmTmp In Me.MdiChildren
          "if 找到你想显示的ClassFrm窗体
            If TypeOf frmTmp Is ClassFrm Then
                frmTmp.Activate()
                Exit Sub
            End If
        Next
        "如果MDI子窗体中没有你想显示的窗体
        "则定义新的实例,并显示。
        frmTmp = New ClassFrm400
        frmTmp.MdiParent = Me
        frmTmp.Show()
在项目中,因为TreeView的影响,使得传统的方法不能实现子窗体位于顶层,弄了好久,最后用.ShowDialog()来实现的。

时间: 2024-09-19 15:14:31

vb.net 防止MDI子窗体被多次实例化的四种方法的相关文章

vb.net 中MDI子窗体对其父窗体属性的获取与修改

兄弟前些日子做项目,第一次使用vb.net,碰上不少问题,相信很多初学者多多少少都会遇到这些问题,为了初学者学习方便,小弟总结了一些小经验,供大家参考讨论.第一篇:如何在MDI子窗体中控制父窗体的属性等等 功能:比如打开一个子窗体后,就要设置父窗体中的某个菜单项或者按钮为不可见状态,诸如此类. 内容:MDI父窗体和MDI子窗体类定义如下:MDI父窗体:Class MDIForm Inherits System.Windows.Forms.Form......... 'member mnuMain

保证相同类型的MDI子窗体只会被打开一次的方法

看到论坛中有朋友问,如何可以保证在 MDI主窗体中,同一类型的子窗体只能打开一次,再 打开只是将原来打开的窗体激活.这个要求我以前写程序的时候也遇到过.我实现的基本思路 是: 一般每个子窗体都是继承自 Form类型,不同子窗体分别代表不同的功能,因此只需要判断 当前 MDI打开的子窗体的类型中有没有当前需要打开的子窗体类型就行了,如果有,则直接激 活,如果没有则创建一个并加到主窗体中.具体实现起来有很多种办法,这里只写出一个利用 泛型的实现: /// <summary> /// 打开MDI子窗

MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现

程序 晚上逛CSDN论坛的时候,看到C#区有位朋友问"防止MDI子窗体被多次实例化",我随即写了这篇文章. 其实这个问题,就是经典的23种设计模式中的单件模式(Singleton),下面用C#实现之: 首先我们有2个Windows Form,主窗体叫Form1,子窗体叫ChildForm.在主窗体中加入一Menu,用来实例化子窗体,我们在Form1.cs中写入下代码: private static ChildForm childForm; //静态变量,保存唯一实例 private v

单例模式——解决MDI子窗体实例化的问题

                机房收费系统进行有一段时间了,但是始终有些历史遗留问题.比如,如何MDI子窗体如何显示在上层的问题和MDI子窗体实例化的问题.         对于如何显示在上层的问题,这次采用的还是SetParent函数,在模块里面添加: <span style="font-size:18px;"><span style="font-size:18px;"> '定义一个用来设置子窗体的函数 Declare Function

Delphi中在DLL动态链接库中封装VCL的MDI子窗体

不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下: 1var 2 DllApp: TApplication;//定义保存原DLL的TApplication对象 3 DllScr: TScreen;//定义保存原DLL的TScreen对象 4 5procedure UnProcDll(Reason: Integer); register; 6//重新定义DLL入口函数 7begin 8 if

MDI子窗体尺寸如何超过屏幕分辨率

问题描述 我创建了一个MDI程序,然后显示一个MDI子窗体,然后一个问题.例如在1366*768分辨率下,无法创建一个300*1024尺寸的窗体.1024高于屏幕分辨率的768.窗体倒是会显示,只是下面的部分被截断了.各位达人,有什么方式可以解决么. 解决方案 解决方案二:你自己这不是很清楚吗,尺寸比屏幕大,肯定遮住了不被遮住,就限制大小在屏幕范围内解决方案三:子窗子的大小要根据屏幕的大小改变而改变,这样才能显示出来.有获取屏幕大小的方法,可以搜一下.解决方案四:引用1楼bdmh的回复: 你自己

vb.net向父窗体传值-在vb.net中,子窗体如何向父窗体传值

问题描述 在vb.net中,子窗体如何向父窗体传值 多个窗体的变量对应的是多个SQL的视图(每个窗体变量数不同),当主窗体打开后OPC连接,打开子窗体(只能打开一个窗体),子窗体中_Load下读取的SQL视图变量名并读入一数组a(n)(全局变量)中,子窗体打开后,主窗体将a(n)读入b(n),并依据这些变量名寻找对应WINCC中的值.可是我的主窗体中应把判定子窗体是否打开的脚本写在什么事件下好呢,同时,我的OPC连接是不是也不能写在Form_Load下了,求高手指点. 解决方案 [VB.NET]

如何在MDI子窗体中使用TransparencyKey属性

问题描述 如何在MDI子窗体中使用TransparencyKey属性如果窗体不是MDI子窗体,则可以通过设置TransparencyKey属性使得窗体透明.但如果窗体时MDI子窗体,这个属性就无效了.请教有什么办法使得MDI子窗体透明或其TransparencyKey属性生效. 解决方案 解决方案二: 解决方案三:感觉是来踢馆的解决方案四:是不可以的,让MDI子窗体再穿透MDI主窗体实在有点为难windows了不知为何一定要MDI呢?解决方案五:引用3楼xuzuning的回复: 是不可以的,让M

c# mdi 键盘事件-C#怎么使MDI子窗体响应键盘事件

问题描述 C#怎么使MDI子窗体响应键盘事件 定义了一个父窗体Form1,ismdicontainer设置为true: 定义一个子窗体Form2,将其mdifather设置为Form1,在Form2中编写该窗体的key_down事件,让其捕获shift+F1的按键消息,并且form2的keypreview属性设置为True,运行程序,按下shift+F1组合键,发现不能捕捉到该键盘事件. 将父窗体Form1的keypreview属性设置为True,同样Form1中编写Form1的key_down