体也不会发生任何变化。
升级向导如何解决它
如果你用升级向导 (Upgrade Wizard) 把 Visual Basic 6.0 项目升级为 Visual Basic .NET 版,则它会在每个窗体中自动添加一段特殊代码,通过显式创建窗体实例来模拟早期 Visual Basic 版本中的默认实例化机制。此段代码被包裹于标号为 “Upgrade Support”的代码区块内,借助一个新增的 Shared 属性来生成当前窗体的实例:
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(ByVal Value As Form1)
m_vb6FormDefInstance = Value
End Set
End Property
代码中的 DefInstance 是一个 Shared 属性,它能以 “窗体名.DefInstance” 的形式直接访问。它所在项目中的任何代码访问它都将得到同一个窗体实例。这样,你就能模拟 Visual Basic 6.0 项目对窗体的直接引用了,只不过在代码中以 “Form2.DefInstance” 代替 “Form2” 而已。
这时,你只需用 Form2.DefInstance.Show() 和Form2.DefInstance.TextBox1.Text = "Fred" 分别替换原先对 Form2 相应的直接引用就大功告成了。假如你不用升级向导,而是在 Visual Basic .NET 窗体中手工插入上述代码 (以及升级向导在窗体的 New过程中自动添加的代码),也行。当然了,你并不一定非要修改窗体代码,因为有一种编程模式可以在 .NET 项目中模拟默认窗体实例的创建。本文将用余下的篇幅来介绍这种编程模式。
.NET 窗体之间的交互
在 Visual Basic 6.0 等早期版本中,多个窗体之间的交互通常需要借助默认窗体实例来完成。下面我将结合某些具体的编程任务来讲解如何在 .NET 下实现多窗体交互,希望它能对你的开发任务有所帮助。
保持窗体引用的全局性
前面提到,进行 .NET 窗体编程时应该牢牢把握下列原则:在访问窗体之前,你必须进行窗体实例化;如果在项目中有多处代码访问同一窗体,则你必须把它的同一实例指针传递给这些代码。对于早已习惯了直接把默认窗体实例当成全局变量来使用的 Visual Basic 6.0
程序员来说,这可是个严重的挑战。好在 .NET 为你提供了两条出路:其一,把窗体实例指针保存在全局变量中;其二,把窗体实例指针传递给任何需要访问它的窗体、类、模块或者过程。
.NET 中的数值全局化
我以前曾经指出,Visual Basic .NET 不支持全局变量,现在我又要说,在 .NET 中可以在某种程度上实现数值全局化。这算不算此一时,彼一时?不,我不是那种人。Visual Basic .NET 确实不支持全局变量,然而它借助 Shared (相当于 C# 中的 static) 变量却能模拟全局变量。事实上,前面介绍的 Visual Basic 升级向导自动添加到窗体代码中的 DefInstance 属性就是 Shared 类成员。无论容纳 DefInstance 属性的窗体类是否已经实例化,它都能被项目中的任何代码所引用。象这样的 Shared 属性不就相当于全局变量吗?因此,你可以创建这样的类:
Public Class myForms
Private Shared m_CustomerForm As CustomerForm
Public Shared Property CustomerForm() As CustomerForm
Get
Return m_CustomerForm
End Get
Set(ByVal Value As CustomerForm)
m_CustomerForm = Value
End Set
End Property
End Class
你需要在首次实例化一个窗体时,把该窗体的实例保存到一个类中:
Dim myNewCust As New CustomerForm()
myNewCust.Show()
myForms.CustomerForm = myNewCust
这里的 Cus