必威注册电子书籍教程中心网文荟萃客户留言繁體中文
设为首页
加入收藏
联系必威注册
您当前的位置:92动力网 -> 教程中心 -> 编程经验 -> JAVA DotNet -> 教程内容 退出登录 用户管理
栏目导航
· Visual Basic· Delphi
· Visual C++· C++ Builder
· JAVA DotNet· 其他相关
热门教程
· 如何在Visual Basic...
· 使用Visual Basic操...
· 使用VB6.0设计Activ...
· VB动态调用外部函数...
· 建立一个程序员自己...
· 如何编写高质量的VB...
· [图文] 为更新到Visual Bas...
· 再谈在VB中调用VC++...
· 用VB语言编程实现JP...
· 用DTS实现SQL数据库...
相关教程
· Henry手记-VB.net ...
· Henry手记-VB.net ...
· Henry手记—使用Tem...
· Henry手记—使用Tem...
· Henry手记:WinForm ...
· Henry手记:WinForm...
· Henry手记:WinForm...
· Henry手记:WinForm...
· Henry手记:WinForm...
· Henry手记:WinForm...

Henry手记-VB.net WinForm中的FORM初探(二)
作者:佚名聽聽来源:本站整理聽聽发布时间:2005-12-29 18:02:19聽聽发布人:admin

减小字体 增大字体


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 在窗体处理机制上的关键区别——你只有先创建窗体实例,然后才可以显示窗体外观、访问窗体属性及其控件。

这节中讨论的是另一个区别: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


[] [返回上一页] [打 印] [收 藏]
∷相关教程评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图 - 管理登录
Copyright 2019 必威注册. All Rights Reserved .
浙ICP备05047688号