VB.NET中的变化 |
|||||||||||||||||
简介 在本篇文章中,我们将介绍Windows Forms,它与我们以前所熟知的窗体是有所不同的。此外,我们还会说明在VB.NET中编程与在以前的VB版本中有何不同之处。 Windows Forms Windows Forms是目前我们所知道的最高级的窗体,其中有许多很酷的功能,使开发人员能够设计出更精彩的屏幕显示。 在这里我们不会再叙述冗长的理论,我们将直接说明有关Windows Forms的问题: ·启动VB.NET。 ·在VB.NET的开始页上,点击Create New Project(创建新工程)。 ·在Visual Basic Projects标签下选择Windows Application。 ·如果有必要,改变Name和Location。 ·点击OK按钮。 哈哈!现在屏幕上出现一个Windows Form了吧。
现在点击Form1,就会出现Properties窗口,与以前的版本相比,这里有了一些小小的变化,原来的Caption属性如今变成了Text,Font属性被分解成了Name、Size等属性,此外,还新添加了为创建MDI应用程序而设置的IsMDIContainer属性。 现在我们再来看看屏幕左侧的Toolbox,点击Win Forms框,然后看一下屏幕,马上就会发现,在VB.NET中的控制都是全新的。 使用Toolbox底部附近向下的方向键浏览该表,就会发现其中的控制比以往的版本中多了许多。 在Form1中添加一个Label控制,方法与在VB6中添加Label控制相同。试着改变Font和在以往的版本中被称作Caption的Text属性。 VB.NET中也包含有许多常见的控制:Button(以往的CommandButton)、RadioButton(以往的OptionButton)、GroupBox(以往的Frame),另外象TextBox、CheckBox、 PictureBox、ListBox和ComboBox等控制都进行了适当的扩展。试着在窗体上添加上述的各种控制,并研究其关健的属性。 提示:或许你已经注意到了,Shape控制已经不见了,但我们仍然可以通过被称作System.Drawing.Graphics的名字空间在窗体上添加图像。 在这个列表中,我们还会发现许多在VB6中不经常使用的控制,例如,DateTimePicker、ProgressBar和ListView等控制,这些控制必须使用Components菜单才能添加进应用程序中。 现在你已经可以来亲自试一下在以前的版本中没有出现过的控制了。 提示:如果想看看你添加的控制在运行时是个什么模样,可以按下F5键,这样就可以编译你的应用,并运行应用程序了,这一点与在VB6中完全一样。 除此之外,还有一些在以前的VB版本中没有出现过的控制,我们来看看这些控制的用法。首先是MainMenu控制,它就是以前的Menu Builder,下面我们来试试它的功能: ·在窗体上添加MainMenu控制。 ·点击窗体上标有Type Here的方框。 ·输入&File。 ·现在在新的File菜单中添加一个子项。 ·在File菜单项的右侧点击标有Type Here的方框,扩充菜单系统,添加菜单项。 ·按下F5键,运行应用程序,并测试新设计的菜单系统。 提示:输入一个破折号可以在菜单中添加一个分隔符。
我们可以象在VB6中那样给菜单项添加代码。双击相应的菜单项,就可以在出现的代码窗口中添加该菜单项对应的代码。我们将后面详细地说明这一问题。 下面让我们来看看LinkLabel,这是一种看起来与互联网网页上的超文本链接类似的控制。缺省情况下,它是蓝色的,并标有下划线,当鼠标经过它时就会变成一只手,如果被点击,颜色就会随之发生变化。但在缺省情况下它并不指向一个互联网网页,点击它时,它的Click事件的代码就会运行。 在窗体上添加一个LinkLabel控制,然后按下F5键运行程序,测试新添加的LinkLabel控制。 提示:试着改变LinkBehavior属性,看看更多的LinkLabel的效果。 另外,我个人认为ErrorProvider是一个特别有用的控制,如果有确认错误发生,它将用一个图标高亮度地显示出错的控制。下面是它的用途的一个例子:
此外,以往版本中的ToolTips在VB.NET中成为了ToolTip控制,原来的Windows Open 和Save对话框也成了控制。TrayIcon控制允许开发人员轻而易举地在系统托盘中添加图标和菜单,HelpProvider控制使你能够简单地实现帮助文件的访问。 类似的控制还有许多,但在本篇文章中我们不可能都一一涉及,如果读者希望得到更多的有关这些方面的资料,请参阅VB.NET系统中的帮助。 提示:点击Properties窗口下的Dynamic Help按钮就可以得到相关的帮助。 控制的定位 长期以来,VB中的Resize命令一直是困扰编程人员的一个因素,虽然有许多人提出了解决方案,但效果并不理想。这也是大多数的VB.NET控制包含有Anchor和Dock属性的原因,这二个属性将有助于解决对象的大小和位置问题。 我们先来看看Anchor属性,它能够使一个或多个控制边缘与窗体的边缘保持固定的距离。我们来看看下面的例子: ·创建一个新的Windows Application类型的应用程序。 假设你正在创建一个Web应用软件,并希望在窗体的底部放置一个TextBox控制,我们希望它的长度与窗体相适应。 ·在窗体中添加一个TextBox控制,如下图所示:
·点击TextBox1,并察看其Anchor属性。 缺省情况下,控制的anchor属性为TopLeft(即窗体的左上角)。换一句话说,它与窗体的左侧和上部保持着一定的距离。
下面我们来改变TextBox1的Anchor属性: ·改变Anchor的属性,不选择Top,而选择Left、Right和Bottom。 Anchor属性将变化为BottomLeftRight,意味着TextBox1将与窗体的底部、左侧和右侧保持着同样的距离。 ·按F5键,运行你的应用程序。 ·改变窗体的大小。 Dock属性也相当地重要,但它毕竟不是革命性的,它与VB6中控制所拥有的Align属性类似,它使得特定的控制一直在窗体的一边,或者使用Fill选项,覆盖整个窗体。 ·在Form1中添加一个新的TextBox控制。 ·试验其Dock属性。 继承 在VB.NET中也有继承的概念。在以后的文章中,我还将对真正的代码继承进行专门的讨论。在本篇文章中,我们讨论的是Visual Inheritance(视觉继承),也即一个窗体从主窗体那儿得到了输出布局(甚至是其代码。)。 假设我们有许多通用的控制,例如可能是一个OK按钮、互联网网址链接、窗体背景、用于数据输入的TextBox控制和向导的输出布局等,不论需要使用任何窗体元素,我们都可以通过视觉继承共享它们及其相关的逻辑。 ·创建一个新的Windows Application类型的应用程序。 ·在Form1中添加一些公共元素。 我添加的公共元素包括anchor属性为BottomRight的LinkLabel、anchor属性为BottomLeft的OK按钮和一个提示我的应用程序名字的Label。添加控制后的窗体应该如下图所示:
在能够继承一个窗体前,必须“建立”它(一种微编译)。 ·在Build菜单中选择Build菜单项。 下面我们来继承这一窗体。 ·依次点击Project->Add Inherited Form(添加被继承窗体)。 ·确保已经选择了Inherited Form(被继承窗体),然后点击OK键。 ·在出现的列表中选择Form1并点击OK按钮。
·如果Form2没有自动出现,则在Solution Explorer中双击它。Form2拥有Form1所拥有的所有控制。 ·在Form2中添加一些TextBox控制。
下面我们来看看运行时的Form2,不过这样需要改变Project Properties(工程属性): ·在Solution Explorer(方案浏览器)中右击你创建的Windows Application类应用程序。 ·从弹出式菜单中选择Properties(属性)。 此时,屏幕上应该显示如下所示的画面。如果不是这样,那可能是你在Solution Explorer中选错了项目。
我们可以在这里改变Assembly名(以前补称作Project名)、版本号、应用程序图标和Startup对象,这才是我们感兴趣的目标。 ·将Startup Object改为Form2,点击OK按钮。 现在我们来测试一下继承得到的窗体: ·点击F5键,对应用程序进行测试。 注意观察它们是如何协同作用的。试着改变Form2的大小━━如果已经使用过Form1的Anchor属性,它们对Form2也起同样的作用。如果为Form1编写了代码,这些代码也将自动地被Form2所继承。甚至可以让Form2覆盖掉Form1的一部分功能。例如,尽管其外观是由Form1继承得到的,但OK按钮可以被Form2识别。 编程方面的变化 有一点是毫无疑问的,VB.NET在编程方面也有巨大的变化。 有许多读者对VB.NET在编程方面的变化不理解,但一旦他们开始理解为什么会发生这样的变化,并能够正确地使用这些变化时,就会感受到这些变化的重大意义。 下面我们就通过对VB.NET的代码窗口进行研究,来领会VB.NET在编程方面的变化。 ·创建一个新的Windows Application类型的应用程序。 ·在Form1上添加一个新的Button控制。 ·右击Form1。 ·选择View Code菜单项。 此时屏幕上应该显示如图所示的Code Window(代码窗口):
你一定会感到惊奇,代码窗口中怎么会有这么多代码呢?然而更令人惊奇的是其答案,这些代码都是你添加上去的。这些代码都是你在创建新的Windows Form时添加的,那么这些代码的作用是什么呢?这些代码看起来有点奇怪,但其核心的作用就是定义创建的窗体。 还记得我曾经说过VB.NET中的所有文件都有一个.vb扩展名吗?VB.NET之所以知道它是窗体,正是由于其代码的原因,这些代码定义了窗体的从窗体名到其坐标,再到其中所包含的控制等方方面面。 提示:如果仔细浏览该窗体后的代码,就会发现,Form1实际上是个类。从VB4开始,我们就能够将窗体当作类来处理了,但实际上,它们从来都不是真正的类。但在VB.NET中,窗体成了真正的类,拥有Constructors和Dispose方法等VB.NET中类的所有特性。 这就是其他多余的代码的作用了。好了,我们现在先不理这些代码,首先来看看如何添加自己的代码。 提示:我们可以通过在代码的左侧使用+或-号扩展或消去自己的代码,还可以使用#Region命令定义自己的“不可见区域”。 名字空间━━最大的变化 要添加自己的代码,需要首先回到Design视图中。 ·依次点击View->Designer。 我们再次回到了代码窗口,你可以发现,在VB.NET中编写Button的代码象在VB6中一样地简单,如果它有Button控制的话。呵呵,VB6中是没有Button控制的。 ·双击Button1。 光标应该在代码窗口中的
和
之间闪烁。 Button1按钮被点击时,在上面有二行内容之间的任何代码都会被执行。 提示:为了能够对Button控制或窗体的其他事件响应,应该使用代码窗口正上方的组合框选择类和方法的名字。当然也可以自己编写一个单独的子程序响应一个事件。 下面我们为Button1添加自己的代码: ·在Button1的Click事件中添加下面的代码: MessageBox.Show("Hey... hehe... you clicked me and it tickles!") ·按F5键,对代码进行测试。 提示:象我们以前曾提到的那样,MessageBox.Show是VB.NET中用来显示信息框的新方法,它取代以以前的MsgBox命令。 你可能已经听说过VB.NET中的“名字空间”这个术语了。“名字空间”是组织函数的一种很有用的途径。它从本质上说就是嵌入在整个.NET框架中的一组类,每种.NET编程语言都可以使用它。例如,VisualBasic名字空间中就包含有我们使用的数十个函数。 为了搞清楚我上面所说的意思,可以转到代码窗口,输入Microsoft后再输入一个.号,就会出现二种选择:Win32和VisualBasic。如果输入VisualBasic后再按一个.号,就会显示出许多编辑器所知道的功能来。 因此,如果想使用象我们在VB中使用的StrReverse函数那样的功能,则可以通过下面的代码实现:
呵,不要惊叫,它就是比我们以前使用的语句还要长,我也没有什么办法。下面我们来解释一下这种结构所具有的优点,首先,它具有很好的组织性,这样可以避免名字冲突,为使用所有的编程语言打下了良好的基础。缺省情况下,Microsoft.VisualBasic名字空间中的所有命令都缺省导入的,这意味着我们无需再在命令前添加Microsoft.VisualBasic前缀。 提示之一:名字空间是通过在窗体或组件中指定“Imports 什么.什么”或指定工程属性中的Imports属性而指定的。 提示之二:不要对Imports感到迷惑。它只是使你无需输入冗长前缀的一种方法,事实上,它与我们早已熟悉的With语句非常相似。 一定会有读者提出来,我们不使用Microsoft.VisualBasic名字空间不就行了,这初听起来确实是个好主意,因为没有Microsoft.VisualBasic名字空间,我们照样可以实现所需要的功能。但你不要忘记,名字空间不只有Microsoft.VisualBasic这一个,还有System等许多名字空间,其中包含的功能非常多。也许你会需要用到一个没有缺省导入的名字空间的功能,这时就需要导入它或者使用一个名字空间的全路径名。 我们什么时候需要这样作呢?也许你在编写图形软件,可能会用对System.Drawing.Graphics名字空间有兴趣;如果正在处理数据库,则可能会用到System.Data.ADO名字空间;如果你还希望使用以前版本的Visual Basic代码,那就研究研究Microsoft.VisualBasic.Compatibility.VB6这个名字空间吧。
下面我们书归正传。名字空间是一种有助于在应用程序中合理安排各种类变量名字的命名方案,我们可以在程序中使用已经被缺省导入的名字空间中的命令,而无需输入其整个前缀。 好了,我们已经讲述了名字空间。照我的看法,名字空间是VB.NET与以前VB之间的最大的不同之处。名字空间是一个很奇怪的概念,有点不大好理解,我们需要在实践中慢慢领会。 核心的变化 在编程方面,与以前的VB6相比,VB.NET有哪些变化我们需要掌握呢? 除了名字空间外,下面的变化也会对你的编程产生影响: Long,Integer━━以前的Long型变量成了VB.NET中的Integer,而Integer则成了VB.NET中的Short,新的Long型变量的长度成了64位。 Byte,Char━━新的Byte型数据的值可以是0-255之间的一个数,新的Char类型数据占用2个字节的空间,可以是一个Unicode编码的字符。 不再有数组━━在VB.NET中已经不再有数组了,而代之以Object数据类型,可以包含任何内容。 Currency数据类型被取代━━VB.NET中没有了Currency数据类型,取而代之的是128位的Decimal数据类型。 变量定义━━在VB6中,Dim X, Y, Z As Integer这个语句将生成2个数组和1个整型数;而在VB.NET中,将生成三个Integer类型的数组。 0基数组━━VB.NET中的数组是从0开始的,意味着其下标将从0开始。因此,Dim MyArray(10) As Integer语句将会生成11个Integer类型的数组变量━━从0到10。 UDT的变化━━用户自定义数据类型非常有用,在VB.NET中定义这种类型的变量时,需要使用象API那样的关健词结构,而不能再使用Type。下面是一个如何定义UDT类型变量的例子:
不再支持Collection对象━━VB.NET不再支持Collection对象,它在System.Collections名字空间中提供了几种新的集合类型━━最相近的是HashTable和ObjectList,当然了,你也可以象在下面那样通过Compatibility名字空间使用原来的Collection对象。
新的运算符━━VB.NET新增加了一些新的有助于减少代码长度的算术运算符。例如,X += 4与X = X + 4是等效的。 简化流程━━VB.NET简化了If...Then语句中的流程。因此,如果If...Then语句有二部分,第一部分返回了“假”值,VB.NET就不会再去检查第二部分的值了。 不再使用Set语句━━在VB6中,我们经常使用Set语句,它可以用来建立除一般的数据类型之外的对象。由于在VB.NET中,所有的数据都是对象,因此已经不再需求它了,如果你输入了它,VB.NET会自动地把它删除掉。 属性定义━━VB.NET中的属性定义已经不再需要Set和Get语句了。下面是一个新的Property过程的例子,需要注意的是Value是一个关健字,它的值就是传递给这一属性的值。
错误处理━━ VB.NET中,我们使用Try,Catch和Finally结构进行错误处理。Try模块中的代码是正在运行的代码,如果有错误发生,Catch模块中的代码就会执行,Finally模块中的代码则一直在运行。VB编程人员会感到有点不适应,熟悉C或Java的编程人员也是如此。我建议你使用VB.NET帮助中的索引找到Error Handling(错误处理)部分中的Introduction to Exception Handling(意外处理介绍),找到其中的Try...Catch...Finally statement小节,测试一下其中的例子。 采用传值方式传递参数━━ 缺省情况下,所有的参数的传递都是按值进行的。 不再支持.Show方法━━VB.NET已经不再支持简单的Form.Show方法。由于VB.NET中的所有数据都是对象,因此,需要在首先执行Dim FormName As New Form1语句后,再执行FormName.Show。 碎片收集━━尽管碎片收集并不是编程方面的变化,但如果操作系统认为认为需要清理对象地址等时,碎片收集过程就会开始运行。因此在VB6中,如果把一个对象的值设置为Nothing,它就会立即在内存中消失。在VB.NET中就不是这样了,在你的对象被碎片收集程序清除前,它仍然会在内存中保留一段时间。因此在类终止代码运行后,不能认为对象已经从内存中消失了。这样有个好处,能够自动纠正循环调用问题。 Return关健字━━在一个函数内部,无须再把函数名设置为返回值或一个对象,可以简单地通过Return MyData在不改变实际代码的情况下改变函数的名字。 提示:在这里我不能一一写出所有语法的变化,只能拣最重要的写出来,希望能起到抛砖引玉的作用。 提示之二:值得一提的是,VB6中的许多功能在VB.NET中仍然有效,只要通过Microsoft.VisualBasic.Compatibility.VB6名字空间调用就可以了。但如果能够使用新的方法、更一般的功能,那是最好不过的了。 |