VB.NET的重大转变


<奇迹>  绪论

  本文讨论一下VB.NET中的一些重大转变,看一看在下一个版本的Visual Basic中,你的代码将变成什么样子。好,现在系紧安全带,打起精神投入到又一次VB.NET的旋风之旅吧...

  Windows 表单

  从本质上来说,Windows表单比我们今天所了解的表单有了很大的改进。它们捆绑了一些相当酷的功能,这些功能使你能够建立相当高级的屏幕效果。

  好,现在开始探索Windows 表单 ...

  1、启动VB.NET

  2、在开始页面上点击"创建新的工程文件"

  3、在"Visual Basic工程文件"下,选择"Windows应用程序"

  4、如果需要,就修改名字和位置

  5、点击 OK按钮

  好,现在你看到了一个Windows表单!

  现在看看方案浏览器。请看看Form1.vb文件中的表单文名是怎么称呼的?所有的Visual Basic代码,不管我们说的是表单还是类模块,都存储为.vb文件。文件内的代码描述了它是什么以及它做什么。

  点击Form1 ,快速浏览一下属性窗口:



  这里与VB6.0相比有一些变化,标题属性现在叫做文本,字体属性被分成名称和字号等,还有一个IsMDIContainer 属性用于建立MDI应用程序。

  注意:.Caption属性在VB.NET中消失了,它们都被标准化为.Text,并且.Tag属性也消失了。

  现在看看左侧的工具箱。点击"Win Forms"框,你会惊奇地看到可以在VB.NET中使用的所有新的控件种类。

  使用向下箭头将列表滚动到工具箱底部,你会发现比以前更具"本色"的控件。现在我们就来看其中几个。

  向 Form1增加一个标签,这同VB6中的操作一样。

  尝试改变字体和以前的标题属性,这也没有主要的改变。

  VB.NET捆绑了常用的控件:Button(按钮)(对应以前的CommandButton), RadioButton(复选按钮) (对应以前的OptionButton) 、GroupBox (对应以前的Frame)。当然还有 TextBox(文本框)、 CheckBox(单选框)、 PictureBox(图形框)、 ListBox(列表框) 和ComboBox(组合框)。

  试一试向表单中增加以上各个控件,并设置它们的核心属性。

  注意:你会注意到Shape控件没有了。但是你还是可以向表单中增加图形的,这将使用到System.Drawing.Graphics 名称空间,也就是"用代码画图"。

  在这个列表中,你还能发现一些在Visual Basic 6 工具箱中不常发现的热门控件。例如: DateTimePicker、ProgressBar 和ListView 控件。这以前,你不得不用组件菜单把这些控件带进应用程序中。

  要想知道控件在运行时间看起来是什么样的,按 F5键进行编译并启动应用程序,这与VB6一样。

  新控件

  除了这些之外,你还会发现一些从没见过的控件。下面我们看一下其中最重要的几个。

  MainMenu控件

  首先是MainMenu(主菜单)控件,其实这就是以前的Menu Builder(菜单建立器)。让我们用用它:

  l 向表单中增加 MainMenu控件

  2 在表单中,点击方框,显示以下内容:在这里键入

  3 键入:&File(文件)

  4 现在向新的文件菜单中增加一些子项

  5 在"在这里键入"框中点击,将其扩大到"File"右侧,增加一些菜单


  6 按F5,运行应用程序,测试新菜单

  注意:向菜单中增加一个间隔时,可以键入一个单破折号。



  现在可以同VB6中一样,向这些菜单项中增加代码。

  LinkLabel控件

  这是一个控件设计,看起来象是一个Web页面的超级链接。默认状态下它是带有下划线的兰色,当鼠标经过它时会变成手的形状,并且当它被点击后会改变颜色。但是在默认状态下它并不是被链接到一个Web站点,当点击它时,Click事件下的代码就会运行。

  向表单中增加一个LinkLabel 控件,按 F5 运行并测试新的LinkLabel。

  注意:试着找出LinkBehavior属性以获得 LinkLabel的更多效果。

  其他控件

  ErrorProvider是一个格外酷的控件。如果发生了一个确认错误,它就会自动用一个图标来突出控件。这里是一个使用范例:



  另外,ToolTips(工具提示)在VB.NET中的处理也不同,VB.NET中增加了ToolTip(工具提示)控件。还有,那些Windows 打开和保存的对话框现在是作为"内置"控件使用的。

  TrayIcon控件使得向系统盘增加自定义图标和菜单简单化。HelpProvider 控件使你很容易地进行帮助文件的访问。

  现在我们开始研究几个新的很棒的表单特性...

  Dock的乐趣

  也许我不应该把整整一页都用在这些叫做"Anchor"(锚)或"Dock"(坞)的东西上。但是不管怎么说,我们都曾经被困在调整大小的地狱中。我曾经亲自在VB-World中写过一些代码,帮助自动修复这些问题,但是结果有可能变得出人预料地混乱。

  这就是为什么大多数VB.NET控件都包含着Anchor和Dock属性,它们将帮助你解决那些棘手的调整大小的情况。

  首先看看Anchor属性,它可以强制控件的一个或多个边沿与表单的边沿保持一个固定的距离。

  下面创建一个应用程序。想象一下你正在创建一个Web应用程序,在表单底部想要一个文本框。你想要它保留在那里,随着表单大小而伸缩。

  然后,向表单中增加一个文本框。看起来是这样的:



  最后,点击TextBox1,查看它的 Anchor属性(在 Layout(布局)下面)。默认状态下,"anchors"都是在左上角。也就是说,它与表单的上面和左边的边沿保持一个固定的距离:



  现在我们来修改一下:

  首先,修改 Anchor属性,不选Top(顶部),而选 Left(左)、 Right(右)和Bottom(底部)。属性文本应该修改为 'BottomLeftRight'。这就是说控件将在底部、左侧和右侧与表单保持固定距离。

  然后,按F5运行你的应用程序。

  最后,调整表单大小,享受一下你的成果。

  Dock也相当重要,它与VB6中某些控件的Align属性相似。它强制特定控件固定在表单的一侧,或者是用"Fill"选项来覆盖整个表单。

  l 向Form1增加一个新的文本框


  2 实验一下Dock属性

  Visual的遗产

  在VB.NET中,你也可以得到遗产。但是不是现金,而是一些代码和组合框之类的东西。

  现在我们看看视觉遗产。这就是从另一个"主人"表单那里"继承"其布局的的表单,也许还包括代码。

  假设在多个表单中有一套公共的特征。也许是一个 'OK' 按钮,一个Web超级链接,一个表单背景,数据输入文本框控件,或者是向导的布局,随便使用的是什么公共表单元素都可以,你都可以用视觉遗产来共享它们以及相关逻辑。

  首先创建一个新的Windows应用程序,然后向表单Form1中增加一些公共元素。

  公共元素包括:一个LinkLabel(链接标签),它的"anchors"固定为BottomRight;一个OK 按钮,其anchors为 BottomLeft;还有一个带有应用程序名的简单标签。整体看起来就象这样:



  现在,在你可以继承一个表单之前,它必须被"建立"(也就是某种小型编译处理)。下面开始:

   l 在建立菜单中选择建立

  然后,继承那个表单:

   2 点击工程文件,增加被继承的表单

   3 确认"被继承的表单"被选中,然后点击OK

   3 在出现的列表中,选择Form1并点击OK



  如果Form2没有自动出现,就在方案浏览器中双击它。好,现在看看,Form2具有了Form1的所有特性。

  接着向Form2中增加一些文本框控件:



  现在看看运行中的Form2。要这样做,我们必须修改工程文件的属性:

   l 在方案浏览器的Windows应用程序上点击右键,

   2 在弹出菜单中选择属性

   屏幕应该是下面这样的:



  如果不是的话,那就是在方案浏览器中选择了错误的项目:

  现在快速浏览一下。在这里你可以修改汇编名(改成我们给工程文件用的名称)、版本号、应用程序图标以及Startup(启动)对象。

  试一试将Startup对象改成Form2 并点击 OK,并按F5来测试应用程序,也就是测试继承来的表单。

  注意到它是如何工作的吗?现在试着调整Form2的大小。如果在被继承的控件上已经使用了Anchor属性,那么它们就会跟着新表单一起移动。

  如果你在Form1上放入了代码,那么也会自动被继承。实际上,你甚至可以允许Form2覆盖功能的某些部分。例如,"OK"按钮后面的代码可以由Form2来决定,尽管其外型是从Form1中来的。

  编码

  毫无疑问,VB.NET对编码带来了很大的变化。

  每次我写文章详细介绍这些不同,都会收到憎恨的邮件和持续的ICQ 麻烦。实际上,我还在为以下问题思考一个聪明的答案: "你到底为什么要去掉Shape控件?"

  所以我打算从一开始就承认,并不是每个人都赞成这种变化。这是个很大的变化!当然,没人喜欢变化。但是,一旦你真正开始理解为什么会有这些变化以及如何适当地使用它们,所有这些才突然变得有意义了。

  无论如何,让我们描画出来,进入代码窗口看看:

  l 创建一个新的Windows应用程序

  2 向Form1上放一个新的按钮


  3 在Form1 上点击右键

  4 选择"查看代码"



  现在你可能已经在挠头了。如果还没有的话,那你总是要挠的。现在我已经非常迷惑了。

  所有这些代码都是从哪来的?答案真是奇怪,这些代码是你做的。这都是在你增加一个新的Windows 表单时创建的。还有,它是做什么的呢?这个代码的核心只是描述了你的表单。

  还记得前面说过VB.NET中的所有文件扩展名都是.vb吗?VB.NET之所以知道它是一个表单,是因为屏幕后面的这些代码告诉了它。代码对表单的名称直到它的维度都进行了描述。

  你会注意到Form1实际上是一个类。从VB4开始,我们就能够将表单作为类来对待。但是事实上,它们从来就不真正是类。而有了VB.NET,它们成为了类,而且带来了在VB.NET类中所能找到的常用资源,包括构造器和处理方法。

  注意:通过在代码窗口的左侧使用"plus"和"minus"标记,可以扩展或隐藏大块的代码。另外还可以用 #Region 语句来定义自己的"hideable"(可隐藏)区域。

  编写自己的代码

  现在来编写一个我们自己的VB.NET代码。首先要切换回Design(设计)视图。

  l 点击视图,Designer

  你会看到在VB.NET中编写一个按钮的代码同在VB6中同样容易。

  2 双击 Button1

  现在光标应该停留在代码窗口的以下内容处:

  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)

  End Sub

  当Command1被点击时,这两行之间的代码就会被启动。

  要响应按钮事件或表单中的其它事件,可以通过代码窗口上面的组合框来选择类和方法的名称。而且,在响应一个事件时还可以激活一个单独的子程序。

  现在我们来增加一些代码。向Button1的Click事件中增加以下代码:

  MessageBox.Show("Hey... hehe... you clicked me and it tickles!")

  然后按F5并进行测试。

  在第一部分我们已经提到,MessageBox.Show 是一个新的VB.NET 方法,用来显示一个信息框,它代替了旧的 MsgBox语句。

  名称空间

  VB.NET中的"名称空间"是一种对功能进行组织的很棒方法,其实它们就是建立在整个.NET 框架上的一批类,每种.NET编程语言都要使用这些名称空间。名称空间是一种命名方案,帮助我们组织应用程序可用的各种类。你可以使用一些被默认引入的名称空间的指令,而不需要键入其全部冗长的前缀。

  在Microsoft.VisualBasic 名称空间中,有许多是我们VB开发人员惯于使用的。要想知道我在说些什么,请到代码窗口,键入Microsoft并跟随一个句号。这时你会面临两个选择:Win32和VisualBasic。如果你键入了VisualBasic并且再一次按下句号,就会看到我们这些编码人员所熟悉的全部函数列表了。

  所以,如果你想使用我们在VB6时代就了解的StrReverse函数,就应该执行下列这串代码:

  MessageBox.Show(Microsoft.VisualBasic.StrReverse("Karl Moore"))

  首先,让我解释一下这种类的"组织"有许多优越性。作为一个开端,它是有组织的。而且,还可以避免命名的冲突,从而在所有的语言之间获得了一个共同的基础。

  在默认状态,Microsoft.VisualBasic名称空间中所有的指令都是默认引入的,这就意味着你只需要使用它们的名称,而可以跳过Microsoft.VisualBasic 这个前缀。

  引入一个名称空间时可以在你的表单或组件中指定"Imports 什么.什么",也可以在工程文件属性中指定引入。"Imports"是一种免去你键入全部冗长的前缀的一种方法。事实上,它同你已经了解并喜爱的"With"语句非常相似。

  并不只是有 Microsoft.VisualBasic 名称空间,还有System(系统)名称空间... 它们下面有无穷多个指令。

  有时候你会想要使用一个不是默认引入的名称空间中的功能,这时候你就需要"引入"它或是用完整的"名称空间路径"来引用它。如果正在进行图形方面的工作,你也许会对 System.Drawing.Graphics 名称空间感兴趣。如果在操作数据库,也许你会想要仔细研读System.Data.ADO。也许想要保存旧的Visual Basic代码,那么就应该查看Microsoft.VisualBasic.Compatibility.VB6 名称空间。



  新的名称空间会不断出现,你的"VB专家地位"会根据你所了解的现有名称空间的数量而发生变化。

  好,现在你已经知道名称空间了。以我的观点来看,这是VB.NET中最大的转变。

  接下来,将进入我认为是实际编码语法的重大转变部分。我将给你指出几点你应该注意的问题。

  编码的核心转变

  在编码中,有哪些转变是你所需要了解的呢?除了名称空间以外,我们再来回顾一下可能会对你带来影响的其它资源:

  l Longs, Integers :过去的Long变成了Integer,过去的Integer变成了所谓的Short。VB.NET 中新的Long 可容纳64位。

  2 Byte, Char:新的Byte 数据类型可容纳 0 到255之间的数字。新的Char 数据类型消耗2个字节的空间,可容纳一个Unicode 字符。

  3 Variants消失了:代替它的是普通的Object数据类型,实际上它现在可以容纳任何内容,同时它也不象VB6占用的内存那么多。

  4 Currency 的替代物:在VB.NET 中,Currency数据类型不再存在,它被更强大的128位Decimal(十进制)数据类型所代替。

  5 变量声明:在VB6中,"Dim X, Y, Z As Integer" 的结果是两个Variants和一个Integer。但是在VB.NET中,这会带来三个Integers(记住,这就是过去的Longs)。

  6 基于0的数组:许多人对此都有所抱怨并且面临改变。VB.NET中的数组是基于0的,这意味着它们总是从0开始。所以类似于 "Dim MyArray(10) As Integer" 这样的代码带来的结果是一个有11个元素的Integer数组:从0到10。

  注意:要想声明"表单层次"范围内的变量和数组,就要将它们放置在'New'方法之前,这个方法是在代码窗口中自动生成的。这是过去的Declarations区域。

  7 UDT 的改变:自定义类型非常有用。但是将来声明自定义类型时,需要使用类似于API关键字结构,而不能使用Type。下面是如何声明一个UDT的举例:

  Structure MyStructure

  Public Name As String
  Public Age As Byte

  End Structure

  7 Collection消失了:VB.NET不支持我们所了解的Collection对象。相反,它在System.Collections 名称空间中提供了一系列新的集合类型,其中最相似的是HashTable和 ObjectList。但是使用Compatibility名称空间时你可以使用旧的Collection 对象,就象这样:

  Dim MyCol As Microsoft.VisualBasic.Compatibility.VB6.Collection
  MyCol.Add("My Information")

  8 新的操作符:VB.NET带来了一些新的数学操作符,从而缩减了代码。如VB.NET中的 "X += 4"与VB6中的 "X = X + 4" 作用相同。试试这些: "X -= 10, X *= 2", "X /= 13", "X \=13", "X ^= 3", "X &= " OK"。

  9 短循环:VB.NET 存在短循环If...Then声明。如果你的If...Then 有两部分,而第一部分返回了False,VB.NET就不再理会第二部分了。

  10 没有Set:在VB6中,我们经常使用Set声明,它是用来设置其它常规数据类型以外的对象的。在VB.NET,任何事物都是一个对象,所以不再需要这个声明了。如果你真的键入了,VB.NET会为你将其删除。

  11 属性声明:现在声明属性不一样了,不再用单独的Lets 和 Gets。下面是一个新的属性程序的例子,请注意Value现在是一个关键字,总是包含着传递给这个属性的值:


Public Property MachinePart() As String
Set
mstrName = Value
End Set

Get
MachinePart = mstrName
End Get
End Property


   12 错误处理:在VB.NET中连错误处理也改变了,你将使用一个 Try、Catch和Finally的结构。如果发生了错误,运行 Try区内的代码,Catch 区内的代码也被运行。不管发生什么,Finally区总是要运行的。这对于VB 程序员来说是个奇怪的概念,但是对于C和 Java程序员却很平常。我建议你使用VB.NET帮助索引来找到错误处理,浏览一下"意外处理介绍"。一定要找到 'Try...Catch...Finally statement'那部分,并测试提供的例子。

   13 默认 ByVal:在默认状态,现在所有的参数都是以值来传递,而不是以引用传递的。为了安全起见,要使所有的声明都很明确。

   No .Show:不再有一个简单的Form.Show方法。VB.NET中的一切都是对象,因此你需要实际的 'Dim FormName As New Form1',然后执行一个'FormName.Show'。

   14 Garbage Collection(垃圾回收):当操作系统(.NET 框架)认为该清除对象引用一类的东西时就会运行Garbage Collection程序。在VB6中,当你将一个对象设置为Nothing时,它就立刻从内存消失。但是在VB.NET中,这并不是马上发生的。在被垃圾回收器终止之前,你的对象还会存活几分钟,所以你总是不能特别肯定类的终止代码是什么时候运行的。虽然这看起来有点奇怪,但是这种非决定性的终结确实有其优势,例如自动地纠正循环引用。

  l5 Return关键字:在一个函数内部,你不向返回值或对象设置函数,而是简单地声明"Return MyData",这样就允许你不修改实际代码就可以改变函数名。

  注意:别忘了,大部分旧的VB6功能在VB.NET中还是可以使用的,只是通过Microsoft.VisualBasic.Compatibility.VB6名称空间引用就可以了。但是同往常一样,如果你用新的更通用的函数可以进行下去的话就更好了。

  结 论

  以上我们进行了一个令人愉快的VB.NET之旅。我们提到了Windows表单、新的控件、属性的变化、Anchoring和 Docking以及视觉的继承。然后我们进行到名称空间和VB.NET中各种代码的变化,同时继续学习了开发环境的更多内容。还有很多激动人心的内容,但是别忘了运行、运行、再运行,发现和探索,自己去找到奇迹!