Henry手记-VB.net WinForm中的FORM初探(二)

原创 2002年09月26日 10:05:00

Henry手记-VB.net WinForm中的FORM初探(二)

韩睿 (2002.9.25)

 

二、怎么样切换两个窗体?

在上一节中,我们认识到vb.net窗体的新特性,也知道了怎么样show出一个窗体了。那么面对一个这样的需求(也是真实的提得较多的问题)。怎么样实现两个窗口间的切换。即:

窗体一:Form1,上面有个button1

窗体一:Form2,上面有个button2

点击button1,会showForm2;点击button2,会showForm1

如果在vb6中,我们还真不用费工夫写文章来讨论了//hehe。上一节中我们讨论的是 Visual Basic .NET Visual Basic6 在窗体处理机制上的关键区别——你只有先创建窗体实例,然后才可以显示窗体外观、访问窗体属性及其控件。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

这节中讨论的是另一个区别:Visual Basic 6.0 项目自动创建的默认窗体实例都能被当成全局变量使用,也就是说,项目中的任何代码都能直接引用窗体,并且每次被引用的都是该窗体的同一个实例。Vb.net呢?是不能这样做了。

我们先来做个小实验,来加深类与对象的概念。

你在一个窗体frmMain里,放四个按钮,在每个按钮的click事件里写上:

dim frm1 as new form1

frm1.show

那么,你将会看到四个一模一样的form1

明白了吧?但此form1非彼form1,都是form1类的一个个实例化的内容。

所以我们不能指望在调用的时候,命名一个局部的frm1就能一直都对form1的实例进行控制,这是不可能的。

也就是说,在button1click事件中写:

dim frm2 as new form2

frm2.show

me.hide

button2click事件中写:

dim frm1 as new form1

frm1.show

me.hide

是有问题的,你发现问题在哪了吗?就在于click事件中写的都是局部变量,每一次都会新生成一个Form的实例,而hide起来的那个form的实例却再也show不回来了。如果不在formclosing(关闭时触发)或其它类似事件中做任何处理,该程序的进程是不会停止的,这是由于做为主线程的第一个form1是被hide起来了,它还在运行着,进程当然不会终止喽。

解决方法有很多,比如

1)      module中定义Form的全局变量

2)      share变量模拟vb6中窗体切换的实现

一个一个说明一下吧,希望对朋友们有所启发:

1) module中定义Form的全局变量

给程序工程加一个模块,用于存放公用变量,及启动控制用:

'Module1.vb

Module Module1

    Public F1 As New Form1()  ‘定义Form1的公用变量实例

    Public F2 As New Form2() ‘定义Form1的公用变量实例

    Sub Main()

        Application.Run(F1) ‘这句话表明程序启动了modele后,会接下来启动f1,即form1的一个实例

    End Sub

End Module

 

'Form1.vb

Class Form1

  ...

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

      F2.Show()      '利用公用变量 

      F1.hide()

  End Sub

End Class

 

'Form2.vb

Class Form2

  ...

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

      F1.Show()

      F2.Hide()

  End Sub

End Class

 

同时请在:解决方案管理器-〉windowsapplication1.sln -〉右点鼠标 -〉属性 -〉通用属性->常规->启动对象 -〉改为Module1

上面最后一句话的意思是让程序在启动时先执行Module1中的代码。初始化两个Form的公用变量,进程入口在它的sub main,用于启动F1Form1的实例)。用这个方法,我们可以完成很多窗体间控件控制(比如Form1上的操作结果显示到Form2的文本框中去)和数据传递。在这里要注意的是,只有关闭了F1窗体,程序才会被终止。我们可以做一些处理,比如在Formclosing事件里加入end等等。

但在vb.net中其实是不赞成使用公用变量的,一是由于生存期的管理,二是引用时的混乱问题。那么我们还有没有其它的解决方法?

2)      share变量模拟vb6中窗体切换的实现

其实有个最简单但是极有用的方法,不知道您想到了吗?就是利用vb.net自带的升级向导工具进行升级呀!(尽管很多人骂这个工具不行,但有的工作它还是可以做得很好的)

我就这样做了,先在vb6中写了两个Form

Form1:

Private Sub Command1_Click()

  Form2.Show

  Me.Hide

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

  End         关闭Form1,程序结束

End Sub

 

Fomr2:

Private Sub Command2_Click()

 Form1.Show

 Me.Hide

End Sub

Private Sub Form_Unload(Cancel As Integer)

  Form1.Show          关闭Form2,唤出Form1

End Sub

 升级后,多了一组用Region折起来的“升级支持”

Form1:

  #Region "升级支持"

    Private Shared m_vb6FormDefInstance As Form1

    Private Shared m_InitializingDefInstance As Boolean

    Public Shared Property DefInstance() As Form1

        Get

            If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then

                m_InitializingDefInstance = True

                m_vb6FormDefInstance = New Form1()

                m_InitializingDefInstance = False

            End If

            DefInstance = m_vb6FormDefInstance

        End Get

        Set

            m_vb6FormDefInstance = Value

        End Set

    End Property

#End Region

    Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click

        Form2.DefInstance.Show()

        Me.Hide()

    End Sub

    Private Sub Form1_Closed(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Closed

        End

    End Sub

Form2中,除了升级支持外的代码是:

Private Sub Command2_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click

        Form1.DefInstance.Show()

        Me.Hide()

    End Sub

    Private Sub Form2_Closed(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Closed

        Form1.DefInstance.Show()

    End Sub

   在上面的代码中,要注意的是是用Form1.DefInstance.Show()showForm1的一个实例。DefInstance Shared的属性,它能以窗体名.DefInstance” 的形式直接访问。它所在项目中的任何代码访问它都将得到同一个窗体实例。

这样,我们就能模拟 vb6完成的项目对窗体的直接引用了,只不过在代码中以 Form1.DefInstance 代替 Form1 而已。如果要设置窗体上的一个label的内容,现在是这样用了:Form1.DefInstance.Label1.text=”Henry”

我们完全可以copy下“升级支持”这一段代码,然后注意我上两段写的内容,就可以不用升级工具,而自己动手写了。

 

----

  声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

 

 

 

Henry手记-VB.net WinForm中的FORM初探(一)

Henry手记-VB.net WinForm中的FORM初探(一)韩睿(2002.9.25) 经常有网友在我主持的版面上发贴子或写信直接来问我,为什么vb.net和vb6差了这么多。当然,问得最多的就...
  • Latitude
  • Latitude
  • 2002年09月25日 22:09
  • 3069

VB.Net Winform程序的简单打包和部署--<机房收费系统>

我们经常会遇到这样一个问题:自己开发好了一个Winform系统,如何使之可以平稳的运行在没有安装.NET Framework的操作系统上?这就涉及到打包和部署的内容。通过打包和部署形成安装程序,实现W...
  • mazhaojuan
  • mazhaojuan
  • 2012年03月11日 15:44
  • 9157

vb.Net(winform)

  • 2008年06月27日 14:02
  • 7.66MB
  • 下载

浅谈VB6中的自定义类的使用

[SHR]浅谈VB6中的自定义类的使用    PS:除非特别声明,本文所说VB指的是VB6,而非VB.NET。    大家都知道,VB是一种半面向对象(也有人称之为“伪面向对象”)的语言,...
  • chinajobs
  • chinajobs
  • 2015年06月30日 11:28
  • 2767

vb.net程序打包发布

本篇文章主要介绍的是我所做的机房收费系统VB.NET版的打包发布过程,全文基本由图片组成,文字其实也不少。         首先介绍下,写这篇文章之前,我参看过的文章。vb.net 打包发布  ,W...
  • liuyanlinglanq
  • liuyanlinglanq
  • 2013年02月25日 17:37
  • 10744

VB.NET WinForm读取App.config配置信息

VB.NET WinForm读取app.config信息     在configuration节点里配置键值,如实例:
  • fengqingtao2008
  • fengqingtao2008
  • 2014年07月30日 19:07
  • 7270

Henry手记-VB.net WinForm中的FORM初探(三)

Henry手记-VB.net WinForm中的FORM初探(三)            韩睿(2002.9.25) 三、Forms到哪去了?    第一节讲的是一个窗体的类的问题,第两节讨论的是两窗...
  • Latitude
  • Latitude
  • 2002年09月27日 11:39
  • 2008

WebRTC手记之初探

转载请注明出处:http://www.cnblogs.com/fangkm/p/4364553.html  WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直...
  • zwz1984
  • zwz1984
  • 2015年11月19日 15:27
  • 363

.net winform下 C#/VB.NET项目代码行数统计

  • 2009年06月05日 11:35
  • 1.09MB
  • 下载

【.net基础】--.NET、winform、Asp.Net区别

有的东西要扼杀在摇篮里面,比如不懂的知识点,比如Asp.Net是什么,.Net是什么,winform是什么,C#又是什么,它们之间又有什么样的关系,要不走到后面不懂的越来越多,简单问题也因为畏惧复杂化...
  • successA
  • successA
  • 2015年05月24日 20:58
  • 2477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry手记-VB.net WinForm中的FORM初探(二)
举报原因:
原因补充:

(最多只允许输入30个字)