Visual Basic 管理信息开发案例 第5 7章 第7章 将VB60程序移植到VBnet课件_第1页
Visual Basic 管理信息开发案例 第5 7章 第7章 将VB60程序移植到VBnet课件_第2页
Visual Basic 管理信息开发案例 第5 7章 第7章 将VB60程序移植到VBnet课件_第3页
Visual Basic 管理信息开发案例 第5 7章 第7章 将VB60程序移植到VBnet课件_第4页
Visual Basic 管理信息开发案例 第5 7章 第7章 将VB60程序移植到VBnet课件_第5页
已阅读5页,还剩155页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章将VB6.0程序移植到VB.net7.1什么是VisualBasic.NET(VB.net)

7.2VB.net程序的基本结构7.3如何进行程序升级第7章将VB6.0程序移植到VB.net7.1什么在线教务辅导网:教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187或者直接输入下面地址:在线教务辅导网:http://www.shangfuwang7.1什么是VisualBasic.NET(VB.net)VisualBasic.NET是最新一代的VisualBasic语言。它并不是简单地在VisualBasic6.0上添加一些新特性而已,微软重新设计了产品以便使开发者能够更加容易地开发分布式应用,例如基于Web的程序以及多层系统。7.1什么是VisualBasic.NET(VB.neVisualBasic.NET中有两种窗体包:Windows窗体以及Web窗体。一个新版的ADO.NET用于接受离线数据源。新的语言,移走了原来的关键字,提高Type数据的安全性以及提供低级别结构以满足高级别开发者的需求。VisualBasic.NET中7.1.1为何VB.net不提供100%的继承性当在设计VisualBasic.NET时有两个方向:翻新以及完全新建。为了提供给用户尽可能多的新特性(例如继承以及线程特性),为了提供对新平台的完全访问,以及为了使VisualBasic能够完全转移到下一代的Web应用中,正确的选择是完全新建。7.1.1为何VB.net不提供100%的继承性一个重要的目标是使VisualBasic代码可以完全集成到用其他语言编写的代码中,例如MicrosftC#(读CSharp)或者VisualC++,以及让VisualBasic开发者可以完全而且简单地利用.NET框架的功能,而不需要像原来那样使用WindowsAPI调用。一个重要的目标是使VisualBa所有的Visual语言将与其他面向通用运行时的语言(CommonLanguageRuntime)使用相同的数据定义类型、数组、用户自定义数组、类以及界面。不过这样就要做出一些牺牲,例如固定长度字符串以及以非0数为下界的数组将不再被支持。VisualBasic现在已经成为一个真正面向对象的语言,一些不一致的特性,例如GoSub/Return语句以及DefInt语句已经从新语言中移走了。所有的Visual语言将与其他面向7.1.2如何将VB6.0程序升级到VB.netVisualBasic.NET原则上可以使传统的Windows开发者转移到建立下一代Web以及多层应用中。所以,用户的代码需要升级以适应VisualBasic.NET。在使用VisualBasic.NET打开VisualBasic6.0工程后,通过自动升级工具可以一步步地升级并建立一个新的基于VisualBasic.NET的工程。这个升级是单向的,即新的VisualBasic.NET工程无法再在VisualBasic6.0中打开。7.1.2如何将VB6.0程序升级到VB.net7.1.3让VB6.0和VB.net同时工作VisualBasic.NET支持升级VisualBasic6.0生成的工程,但如果该工程是在VisualBasic1~5版本下编写的,则需要首先升级到VisualBasic6.0工程,编译、保存后再升级到VisualBasic.NET中去。7.1.3让VB6.0和VB.net同时工作VisualBasic.NET和VisualBasic6.0可以安装在同一系统下并可以同时运行。同样,利用较早版本或者其他语言编写的COM组件也可以集成到VisualBasic.NET中。VisualBasic.NET编译的组件与VisualBasic6.0编译的组件相比有一点点的不同,VisualBasic.NET对象是通过垃圾收集方式释放的,所以在对象被删除到对象真正被从内存中释放之间或许会有一定的延迟。VisualBasic.NET和7.2VB.net程序的基本结构7.2.1基于浏览器的应用VisualBasic6.0和VisualStudio6提供了以下的技术用于建立基于浏览器的Internet和Intranet应用:Webclasses、DHTMLprojects、ActiveXDocuments、ActiveServerPages(ASP)。7.2VB.net程序的基本结构7.2.1基于VisualBasic.NET中引入了ASP.NET。ASP.NET是增强版的ASP,并加入到了Web窗体(WebForms)结构中。Web窗体是.NET架构中非常重要的一个组成部分。一个Web窗体包含两个部分:HTML文件和源程序文件。HTML文件用于描述页面;源程序文件用于响应、控制页面事件。建立一个Web窗体与现在建立一个VisualBasic窗体一样简单。它的Wysiwyg界面设计方式同现在的VisualBasic是一样的。VisualBasic.NET中引一些介绍以及结构方面的建议:(1)建议使用微软多层构架来开发自己的应用,利用ASP来开发界面,同时使用VisualBasic6.0或者VisualC++6.0开发的COM组件。(2)包含DHTML页面及客户端DLL的DHTML应用不能自动升级到VisualBasic.NET。建议用户在VisualBasic6.0下开发这些应用。(3)同DHTML工程一样,ActiveXDocuments不被VisualBasic.NET支持,不能自动升级。一些介绍以及结构方面的建议:(4)Web类(Webclasses)在VisualBasic.NET中将不再存在,Web类应用将升级到ASP.NET,但自动升级后用户还需要做一些更改。(4)Web类(Webclasse7.2.2用户控件VisualBasic.NET提供了新的窗体包:Windows窗体。相对于VisualBasic6.0的窗体,Windows窗体使用不同的对象模块,不过绝大部分是兼容的。当工程升级时,VisualBasic窗体自动升级到Windows窗体。7.2.2用户控件对于开发中间层的MTSandCOM+服务器组件,VisualBasic.NET提供了更强大的支持。使用统一的调试器,可以从客户端到MTS/COM+组件再到客户端进行步进调试,同时集成调试器也支持在MTS和COM+组件内部进行调试(组件需要以nativecode方式编译,包含符号调试信息以及不进行优化)。VisualBasic.NET同样也提供了新的中间层组件:WebServices(Web服务器)。Web服务器包含在ASP.NET中。对于开发中间层的MTSandC7.2.3单层应用VisualBasic6.0支持建立以下类型的单层应用程序:●单层数据库应用程序;●VisualBasic插件;●普通的应用程序以及游戏。7.2.3单层应用7.2.4数据库操作VisualBasic6.0提供了ADO、RDO和DAO三种类型的数据库访问方式,而VisualBasic.NET包含了增强版的ADO,称之为ADO.NET。ADO.NET的目标是操作离线数据。同时对于ADO的分布应用提供了更强大的支持。ADO.NET提供了绑定数据库到Windows窗体控件和Web窗体。7.2.4数据库操作7.2.5语言方面的改进我们在很多的编程论坛或者新闻组中可以看到C++的拥护者将VisualBasic称为一个玩具语言(ToyLanguage)。其中,VisualBasic最被人诟病的就是它不真正支持面向对象编程(OOP)。在新的VisualBasic中,这些都将成为过去。7.2.5语言方面的改进而VisualBasic.NET将真正支持OOP、继承(Inheritance)、多态(Polymorphism)以及重载(Overloading)。当然,还包括一些新的数据结构、结构性的错误控制(ErrorHanding)以及线程等,这些都将被新的VisualBasic.NET所支持。而VisualBasic.NET假设我们编写了一个只包含一个函数的名称为BaseClass的基本类:FunctionGetCustomerName()'DosomestuffEndFunction如果想建立一个新类,并使用BaseClass中的GetCustomerName函数,假设我们编写了一个只包含一个函数的但又不想重写代码,那么就可以通过继承来这样编写新类:InheritsBaseClassFunctionGetCustomerID()'DosomestuffEndFunction但又不想重写代码,那么就可以通过继承7.2.6为何还要在新版本中引进重载所谓重载,就是建立两个具有同样名称但是参数属性不同的函数的过程。假设有GetCustomID函数,根据输入输出用户的ID号码,那么该函数可能有以下两种类型:7.2.6为何还要在新版本中引进重载FunctionGetCustomerID(custnameasstring)AsInteger'通过用户名获得用户IDEndFunctionFunctionGetCustomerID(purchaslong)AsInteger'根据购物单号码获得用户IDEndFunctionFunctionGetCustomerID(custnam通过重载,用户就可以根据不同类型的输入调用同一个函数。实际上现在的VisualBasic在某种程度上提供了重载的功能。考虑下面的函数:FunctionGetCustomID(vINAsVariant)AsLongGetCustomID=vINEndFunction这时候,我们不妨可以试试下面两种调用方式:ID=GetCustomID("123")或者:ID=GetCustomID(123)通过重载,用户就可以根据不同类型的输7.2.7多态的概念多态是在一个类中重新定义一个函数的过程。例如:需要建立一个基于BaseClass类的子类,但是又需要重新编写GetCustomerName函数,在新版的VisualBasic中,就可以这样写:7.2.7多态的概念InheritsBaseClassFunctionGetOrders()OverridesFunctionGetOrders()...EndFunctionInheritsBaseClass7.2.8错误处理(ErrorHandling)VisualBasic.NET的另外一个大的改进就是错误处理。VisualBasic将提供try...catch...finally结构,就像Delphi中的那样。例如:SubSafeWrite()Try7.2.8错误处理(ErrorHandling)Open"Testfile"...Write#1CatchKill"Testfile"FinallyClose#1EndTryEndSubOpen"Testfile"7.2.9建立线程新的VisualBasic语言结构部分将包含建立多线程。一个线程建立的范例如下:sett=NewThread(NewThreadstart(AddressOf(BaseClass.Function1))从上面的范例还可以看到,VisualBasic.NET中的AddressOf函数将真正返回函数的指针。这在进行API调用,例如回调函数方面将是很有帮助的。7.2.9建立线程7.3如何进行程序升级如果想要将VisualBasic6.0的程序向VisualBasic.NET程序升级,则首先还需要在自己的系统中安装VisualBasic6.0,然后再安装VisualBasic.NET,安装好之后,直接运行VisualBasic.NET。7.3如何进行程序升级如果想要将具体操作步骤如下:(1)运行VisualS主程序,启动VisualS。此时首先会出现一个如图7-3-1所示的欢迎界面。(2)在程序进入【起始页】窗口后,就可以通过如图7-3-2所示的选项来调用VisualBasic.NET语言进行开发设计了。具体操作步骤如下:图7-3-1VisualS欢迎界面图7-3-1VisualS欢迎界面图7-3-2调用VisualBasic.NET语言图7-3-2调用VisualBasic.NET语言(3)如果需要新建项目,则直接单击【新建项目】按钮,在【新建项目】对话框中选择“VisualBasic项目”后单击【确定】按钮就可进入VisualBasic.NET编辑状态了。如果是已经用VisualBasic6.0开发好的程序,则可以单击【打开项目】按钮,选择好要打开的项目后,将其升级就可以了。如图7-3-3所示就是正在升级的VisualBasic程序。(3)如果需要新建项目,则直接单图7-3-3正在升级的VisualBasic程序图7-3-3正在升级的VisualBasic程序代码在完成升级后,VisualBasic.NET会建立一个新的升级工程,如图7-3-4所示,并且会在“任务列表”栏中列出无法在.NET中进行升级的任务。代码在完成升级后,VisualBa图7-3-4完成升级的VisualBasic程序图7-3-4完成升级的VisualBasic程序1.Variant类型到Object类型以前版本的VisualBasic支持Variant数据类型,该类型可以设定为除了固定程序字符串外的任何原始数据类型和Empty、Error、Nothing和Null。在VisualBasic、NET中,Object数据类型可以设定为任何原始数据类型和Empty、Error、Nothing、Null和对象指针。当工程升级到VisualBasic.NET后,任何Variant定义都会改变为Object。同样,当在编辑器中插入代码时,Variant关键字也会被替换为Object。1.Variant类型到Object2.Integer数据类型到Short数据类型在VisualBasic6.0中,16bit数称为Short。32bit数称为Integer(64bit数称为Long)。当工程升级后,数据定义会做如下改动:DimxAsIntegerdimyasLong更改为:DimxAsShortdimyasInteger2.Integer数据类型到Shor3.属性语法VisualBasic.NET对于自定义属性的语法做了更加直观的更改,将Get和Set合而为一。例如原来的属性如下:PropertyGetMyProperty()AsIntegerm_MyProperty=MyPropertyEndPropertyPropertyLetMyProperty(NewValueAsInteger)m_MyProperty=NewValueEndProperty3.属性语法PropertyGet升级后更改为:PropertyMyProperty()AsShortGetm_MyProperty=MyPropertyEndGetSetm_MyProperty=ValueEndSetEndProperty升级后更改为:4.VisualBasic窗体到Windows窗体VisualBasic.NET包含新的窗体包和Windows窗体,Windows窗体包含内含菜单编辑器,升级后的VisualBasic窗体会升级到Windows窗体。5.界面在先前的版本中,公用类界面对于用户总是隐藏的。在VisualBasic.NET中,公用类可以在代码窗口中浏览和编辑。4.VisualBasic窗体到W6.升级报告及注释当工程升级后,升级报告会添加到用户的工程中,其中详细列出所有升级后所需要对代码做的更改。6.升级报告及注释7.3.1使用先前绑定的对象VisualBasic6.0和VisualBasic.NET都支持对象的延迟绑定,该方法事先定义一个变量为Object的数据类型,然后在运行时将其设定为一个类。然而,在升级过程中,当访问延迟绑定对象的缺省属性时可能会产生错误。7.3.1使用先前绑定的对象7.3.2缺省属性的运用在VisualBasic6.0中,许多对象都有缺省属性,缺省属性在代码中可以省略。例如:MsgBoxForm1.Text1.Text就可以这样编写:MsgBoxForm1.Text17.3.2缺省属性的运用其缺省属性在代码编译时决定。同样,也可以在延迟绑定的对象中使用缺省属性,例如:DimobjAsObjectSetobj=Form1.Text1MsgBoxobj其缺省属性在代码编译时决定。同样,也DimobjAsObjectSetobj=Me.Text1MsgBoxobj '不好的代码,使用缺省属性MsgBoxMe.Text1 '不好的代码,使用缺省属性use:DimobjAsObjectSetobj=Me.Text1MsgBoxobj.Text '好的代码,写出了属性MsgBoxMe.Text1.Text '好的代码,写出了属性DimobjAsObject虽然缺省属性不被VisualBasic.NET支持,但是带参数的缺省属性是被支持的。要了解它们之间的区别,请看下面的范例:DimrsAsADODB.Recordsetrs("CompanyName")="SomeCompany"rs!CompanyName="SomeCompany"这实际上等于:DimrsAsADODB.Recordsetrs.Fields("CompanyName").Value="SomeCompany"rs.Fields!CompanyName.Value="SomeCompany"虽然缺省属性不被VisualBas对于第二种写法,VisualBasic.NET是支持的,然而第一种情况不被支持。那么正确的用法应该如下:DimrsAsADODB.Recordsetrs("CompanyName").Value="SomeCompany"rs!CompanyName.Value="SomeCompany"对于第二种写法,VisualBasic7.3.3对Boolean类型数据使用AND/OR/NOT操作And和Or关键字在VisualBasic.NET和VisualBasic6.0中的使用是不同的。在VisualBasic6.0中,AND运算既执行逻辑AND操作也执行逐位AND操作,这取决于操作数(如果是Boolean类型,执行逻辑AND操作;如果是数字,执行逐位AND操作)。在VisualBasic.NET中,AND运算只执行逻辑AND操作。7.3.3对Boolean类型数据使用AND/O对于逐位操作,在VisualBasic.NET提供了一组操作:BitAnd、BitOr、BitNot以及BitXor。下面是演示这些差异的范例程序:DimaAsIntegerDimbAsIntegerDimcAsBooleana=1b=2c=aAndbMsgBox("Theansweris"&c)对于逐位操作,在VisualBa当上面的代码在VisualBasic6.0下运行时,结果是False(执行逐位AND操作);然而在VisualBasic.NET下,结果是True(执行逻辑AND操作)。用户要确定自己的程序在升级后其运行结果同升级前一样。VisualBasic.NET包含了VB6.And、VB6.Or以及VB6.Not的兼容函数,这些函数执行的结果同VisualBasic6.0下的AND/OR/NOT操作的执行结果是一样的。当上面的代码在VisualBasi当代码升级后,结果会像下面这样:DimaAsShortDimbAsShortDimcAsBooleana=1b=2c=VB6.And(a,b)MsgBox("Theansweris"&c)当代码升级后,结果会像下面这样:升级后的代码会得出False的结果,这同在VisualBasic6.0下运行是一样的。如果不想自己的代码升级后使用兼容函数,就需要确保自己的AND/OR/NOT都使用在Boolean类型数据的操作中。升级后的代码会得出False的结果例如,如果上面的代码更改为下面的形式:DimaAsIntegerDimbAsIntegerDimcAsBooleana=1b=2c=a<>0Andb<>0MsgBox("Theansweris"&c)例如,如果上面的代码更改为下面的形式:则当升级后,代码同原来的几乎一样:DimaAsShortDimbAsShortDimcAsBooleana=1b=2c=a<>0Andb<>0MsgBox("Theansweris"&c)则当升级后,代码同原来的几乎一样:与前面不同的是,每一个操作都是在Boolean数据之间进行的,因此它们在VisualBasic6.0中使用的都是逻辑AND操作,所以在升级到VisualBasic.NET后不会发生改变。这样做的意义是你可以直接在VisualBasic.NET和VisualBasic6.0之间拷贝和粘贴代码,你的代码会运行的更快,因为使用的是本地的AND操作而不是兼容函数。另外一个需要考虑的问题是,对于函数结果的AND/OR/NOT操作的问题。如下面的范例:DimbAsBooleanb=Function1()AndFunction2()与前面不同的是,每一个操作都是在Bo在VisualBasic6.0中,Function1和Function2的结果都会执行,而后再将结果进行AND操作。在VisualBasic.NET中,只有当Function1的结果为True时才会计算Function2。因为VisualBasic.NET中的AND运算执行的是逻辑AND操作,如果Function1结果为False,AND结果肯定是False,为了加快速度就不再执行Function2了。在VisualBasic6.0中下面的代码说明了VisualBasic6.0和VisualBasic.NET之间的不同:DimiAsIntegeri=TrueIfi=?1ThenMsgBox("True")ElseMsgBox("False")EndIf下面的代码说明了VisualBas在VisualBasic6.0中,结果为True;而在VisualBasic.NET中结果为False。如果对代码做如下改动,程序在两种语言下运行都会显示True。DimiAsBooleani=TrueIfi=TrueThenMsgBox("True")ElseMsgBox("False")EndIf在VisualBasic6.0中通过上面的范例可以看出,在程序中需要注意两点:(1)使用常量True和False来判断是否而不要使用0和-1。(2)使用Boolean类型变量储存Boolean数值而不要使用Integer类型变量。通过上面的范例可以看出,在程序中需要注7.3.4使用VB常量而不使用它们所代表的值在写代码的时候,尽量使用VB常量而不要使用它们所代表的值。例如用户要在运行时将一个窗口最大化,使用:

7.3.4使用VB常量而不使用它们所代表的值Me.WindowState=vbMaximized'Good:Constantname而不要使用:Me.WindowStyle=2'Bad:UnderlyingvalueMe.WindowStyle=X'Bad:VariableMe.WindowState=vbMaximized7.3.5避免Null传播(Propagation)先前版本的VisualBasic支持Null传播。Null传播的前提是Null值使用在表达式中,表达式的结果将是Null。例如下面的范例,结果V都将是Null。DimVV=1+NullV=Null+Right$("SomeText",1)V=Right("SomeText",0)7.3.5避免Null传播(Propagatio在VisualBasic.NET中,下面的函数将不再返回Null值:ChrMidCommandOctCurDirRightDateRTrimEnvironSpaceErrorStrHexTimeLCaseTrimLTrimUCase在VisualBasic.NET中,下面的函数将不再返回N7.3.6窗体与控件VisualBasic.NET包含了一个新的窗体包:Windows窗体。Windows窗体与VisualBasic6.0窗体间保持了最大的兼容性。然而,还是有一些需要提出的关键差异:●Windows窗体不支持OLEcontainer控件。●需要在VisualBasic6.0应用中避免使用该控件。7.3.6窗体与控件7.3.7使用以0为下界的数组VisualBasic6.0允许使用任何整数数字作为一个数组的上界和下界,同样也可以通过ReDim将一个Variant重新定义为数组。为了能够与.NET平台下的其他语言协同工作,VisualBasic.NET数组必须以0作为下界,而且只有一个变量事先定义为数组后才可以使用ReDim函数重新定义。虽然这样限制了数组定义的灵活性,但这样可以在VisualBasic.NET和.NET下的其他语言之间传递数组。7.3.7使用以0为下界的数组下面的范例说明了新的定义数组的约束:Dima(1To10)AsInteger '错误:下界必须为0DimvReDimv(10)'错误,在没有定义v为数组前不能使用ReDimDimb(10)AsInteger '正确ReDimb(5)AsInteger '正确下面的范例说明了新的定义数组的约束:7.3.8用户自定义数据类型中的数组和固定长度字符串为了使VisualBasic.NET数组和数据结构完全兼容VisualStudio.NET,固定长度字符串在新语言中不再被支持。在大多数情况下这不是问题,因为VisualBasic.NET提供了兼容固定长度字符串定义的类,那么代码:DimMyFixedLengthStringAsString*100升级后会变成这样:DimMyFixedLengthStringAsNewVB6.FixedLengthString(100)7.3.8用户自定义数据类型中的数组和固定长度字例如:PrivateTypeMyTypeMyArray(5)AsIntegerMyFixedStringAsString*100EndTypeSubBar()DimMyVariableAsMyTypeEndSub升级后会变为:PrivateTypeMyTypeMyArray()AsInteger例如:MyFixedStringAsStringEndTypeSubBar()DimMyVariableAsMyTypeReDimMyVariable.MyArray(5)AsIntegerMyVariable.MyFixedString=String$(100,"")EndSubAvoidLegacyFeaturesMyFixedStringAsString为避免使用从原始Basic继承的特性,如下的关键字在新版本语言中将不再出现:DefComputedGoTo/GoSubGoSub/ReturnOptionBase0|1VarPtr,ObjPtr,StrPtrLSetWindowsAPIs为避免使用从原始Basic继承的特性大多数的API调用可以像在VisualBasic6.0中一样使用,因为数据类型发生了改变。在VisualBasic6.0中的Long类型在VisualBasic.NET中定义为Integer类型。在升级过程中这些定义会自动改变,例如:PrivateDeclareFunctionGetVersionLib"kernel32"()AsLongFunctionGetVer()DimVerAsLongVer=GetVersion()MsgBox("SystemVersionis"&Ver)EndFunction大多数的API调用可以像在Visua改变为:PrivateDeclareFunctionGetVersionLib"kernel32"()AsIntegerFunctionGetVer()DimVerAsIntegerVer=GetVersion()MsgBox("SystemVersionis"&Ver)EndFunction改变为:除了数字类型的升级外,VisualBasic6.0还支持固定长度字符串类型,该类型升级到VisualBasic.NET后会定义为固定长度字符串兼容类。所以在VisualBasic6.0代码中最好使用通用字符串定义,例如:PrivateDeclareFunctionGetUserNameLib"advapi32.dll"Alias"GetUserNameA"(ByVallpBufferAsString,ByRefnSizeAsLong)AsLong除了数字类型的升级外,VisualFunctionGetUser()DimRetAsLongDimUserNameAsStringDimBufferAsString*25Ret=GetUserName(Buffer,25)UserName=Left$(Buffer,InStr(Buffer,Chr(0))-1)MsgBox(UserName)EndFunctionFunctionGetUser()上面的代码出现了固定长度字符串,最好更改为:DimBufferAsStringBuffer=String$(25,"")升级到VisualBasic.NET后会成为下面的样子:DeclareFunctionGetUserNameLib"advapi32.dll"Alias"GetUserNameA"(ByVallpBufferAsString,ByRefnSizeAsInteger)AsInteger上面的代码出现了固定长度字符串,最好更改为:FunctionGetUser()DimRetAsIntegerDimUserNameAsStringDimBufferAsStringBuffer=NewString(CChar(""),25)Ret=GetUserName(Buffer,25)UserName=Left(Buffer,InStr(Buffer,Chr(0))?1)MsgBox(UserName)EndFunctionFunctionGetUser()有三种情况需要对代码进行手工改进:(1)在传递给API函数的自定义数据类型定义中包含固定长度字符串和数组。在VisualBasic.NET中用户需要对自定义数据类型定义中的每一个固定长度字符串和数组添加MarshallAs属性。(2)在定义中使用AsAny声明。这种声明不再被VisualBasic.NET支持,变量定义为AsAny通常是为了传递一个既可能是字符串也可能是Null的变量。有三种情况需要对代码进行手工改进:第7章将VB6.0程序移植到VB.net7.1什么是VisualBasic.NET(VB.net)

7.2VB.net程序的基本结构7.3如何进行程序升级第7章将VB6.0程序移植到VB.net7.1什么在线教务辅导网:教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187或者直接输入下面地址:在线教务辅导网:http://www.shangfuwang7.1什么是VisualBasic.NET(VB.net)VisualBasic.NET是最新一代的VisualBasic语言。它并不是简单地在VisualBasic6.0上添加一些新特性而已,微软重新设计了产品以便使开发者能够更加容易地开发分布式应用,例如基于Web的程序以及多层系统。7.1什么是VisualBasic.NET(VB.neVisualBasic.NET中有两种窗体包:Windows窗体以及Web窗体。一个新版的ADO.NET用于接受离线数据源。新的语言,移走了原来的关键字,提高Type数据的安全性以及提供低级别结构以满足高级别开发者的需求。VisualBasic.NET中7.1.1为何VB.net不提供100%的继承性当在设计VisualBasic.NET时有两个方向:翻新以及完全新建。为了提供给用户尽可能多的新特性(例如继承以及线程特性),为了提供对新平台的完全访问,以及为了使VisualBasic能够完全转移到下一代的Web应用中,正确的选择是完全新建。7.1.1为何VB.net不提供100%的继承性一个重要的目标是使VisualBasic代码可以完全集成到用其他语言编写的代码中,例如MicrosftC#(读CSharp)或者VisualC++,以及让VisualBasic开发者可以完全而且简单地利用.NET框架的功能,而不需要像原来那样使用WindowsAPI调用。一个重要的目标是使VisualBa所有的Visual语言将与其他面向通用运行时的语言(CommonLanguageRuntime)使用相同的数据定义类型、数组、用户自定义数组、类以及界面。不过这样就要做出一些牺牲,例如固定长度字符串以及以非0数为下界的数组将不再被支持。VisualBasic现在已经成为一个真正面向对象的语言,一些不一致的特性,例如GoSub/Return语句以及DefInt语句已经从新语言中移走了。所有的Visual语言将与其他面向7.1.2如何将VB6.0程序升级到VB.netVisualBasic.NET原则上可以使传统的Windows开发者转移到建立下一代Web以及多层应用中。所以,用户的代码需要升级以适应VisualBasic.NET。在使用VisualBasic.NET打开VisualBasic6.0工程后,通过自动升级工具可以一步步地升级并建立一个新的基于VisualBasic.NET的工程。这个升级是单向的,即新的VisualBasic.NET工程无法再在VisualBasic6.0中打开。7.1.2如何将VB6.0程序升级到VB.net7.1.3让VB6.0和VB.net同时工作VisualBasic.NET支持升级VisualBasic6.0生成的工程,但如果该工程是在VisualBasic1~5版本下编写的,则需要首先升级到VisualBasic6.0工程,编译、保存后再升级到VisualBasic.NET中去。7.1.3让VB6.0和VB.net同时工作VisualBasic.NET和VisualBasic6.0可以安装在同一系统下并可以同时运行。同样,利用较早版本或者其他语言编写的COM组件也可以集成到VisualBasic.NET中。VisualBasic.NET编译的组件与VisualBasic6.0编译的组件相比有一点点的不同,VisualBasic.NET对象是通过垃圾收集方式释放的,所以在对象被删除到对象真正被从内存中释放之间或许会有一定的延迟。VisualBasic.NET和7.2VB.net程序的基本结构7.2.1基于浏览器的应用VisualBasic6.0和VisualStudio6提供了以下的技术用于建立基于浏览器的Internet和Intranet应用:Webclasses、DHTMLprojects、ActiveXDocuments、ActiveServerPages(ASP)。7.2VB.net程序的基本结构7.2.1基于VisualBasic.NET中引入了ASP.NET。ASP.NET是增强版的ASP,并加入到了Web窗体(WebForms)结构中。Web窗体是.NET架构中非常重要的一个组成部分。一个Web窗体包含两个部分:HTML文件和源程序文件。HTML文件用于描述页面;源程序文件用于响应、控制页面事件。建立一个Web窗体与现在建立一个VisualBasic窗体一样简单。它的Wysiwyg界面设计方式同现在的VisualBasic是一样的。VisualBasic.NET中引一些介绍以及结构方面的建议:(1)建议使用微软多层构架来开发自己的应用,利用ASP来开发界面,同时使用VisualBasic6.0或者VisualC++6.0开发的COM组件。(2)包含DHTML页面及客户端DLL的DHTML应用不能自动升级到VisualBasic.NET。建议用户在VisualBasic6.0下开发这些应用。(3)同DHTML工程一样,ActiveXDocuments不被VisualBasic.NET支持,不能自动升级。一些介绍以及结构方面的建议:(4)Web类(Webclasses)在VisualBasic.NET中将不再存在,Web类应用将升级到ASP.NET,但自动升级后用户还需要做一些更改。(4)Web类(Webclasse7.2.2用户控件VisualBasic.NET提供了新的窗体包:Windows窗体。相对于VisualBasic6.0的窗体,Windows窗体使用不同的对象模块,不过绝大部分是兼容的。当工程升级时,VisualBasic窗体自动升级到Windows窗体。7.2.2用户控件对于开发中间层的MTSandCOM+服务器组件,VisualBasic.NET提供了更强大的支持。使用统一的调试器,可以从客户端到MTS/COM+组件再到客户端进行步进调试,同时集成调试器也支持在MTS和COM+组件内部进行调试(组件需要以nativecode方式编译,包含符号调试信息以及不进行优化)。VisualBasic.NET同样也提供了新的中间层组件:WebServices(Web服务器)。Web服务器包含在ASP.NET中。对于开发中间层的MTSandC7.2.3单层应用VisualBasic6.0支持建立以下类型的单层应用程序:●单层数据库应用程序;●VisualBasic插件;●普通的应用程序以及游戏。7.2.3单层应用7.2.4数据库操作VisualBasic6.0提供了ADO、RDO和DAO三种类型的数据库访问方式,而VisualBasic.NET包含了增强版的ADO,称之为ADO.NET。ADO.NET的目标是操作离线数据。同时对于ADO的分布应用提供了更强大的支持。ADO.NET提供了绑定数据库到Windows窗体控件和Web窗体。7.2.4数据库操作7.2.5语言方面的改进我们在很多的编程论坛或者新闻组中可以看到C++的拥护者将VisualBasic称为一个玩具语言(ToyLanguage)。其中,VisualBasic最被人诟病的就是它不真正支持面向对象编程(OOP)。在新的VisualBasic中,这些都将成为过去。7.2.5语言方面的改进而VisualBasic.NET将真正支持OOP、继承(Inheritance)、多态(Polymorphism)以及重载(Overloading)。当然,还包括一些新的数据结构、结构性的错误控制(ErrorHanding)以及线程等,这些都将被新的VisualBasic.NET所支持。而VisualBasic.NET假设我们编写了一个只包含一个函数的名称为BaseClass的基本类:FunctionGetCustomerName()'DosomestuffEndFunction如果想建立一个新类,并使用BaseClass中的GetCustomerName函数,假设我们编写了一个只包含一个函数的但又不想重写代码,那么就可以通过继承来这样编写新类:InheritsBaseClassFunctionGetCustomerID()'DosomestuffEndFunction但又不想重写代码,那么就可以通过继承7.2.6为何还要在新版本中引进重载所谓重载,就是建立两个具有同样名称但是参数属性不同的函数的过程。假设有GetCustomID函数,根据输入输出用户的ID号码,那么该函数可能有以下两种类型:7.2.6为何还要在新版本中引进重载FunctionGetCustomerID(custnameasstring)AsInteger'通过用户名获得用户IDEndFunctionFunctionGetCustomerID(purchaslong)AsInteger'根据购物单号码获得用户IDEndFunctionFunctionGetCustomerID(custnam通过重载,用户就可以根据不同类型的输入调用同一个函数。实际上现在的VisualBasic在某种程度上提供了重载的功能。考虑下面的函数:FunctionGetCustomID(vINAsVariant)AsLongGetCustomID=vINEndFunction这时候,我们不妨可以试试下面两种调用方式:ID=GetCustomID("123")或者:ID=GetCustomID(123)通过重载,用户就可以根据不同类型的输7.2.7多态的概念多态是在一个类中重新定义一个函数的过程。例如:需要建立一个基于BaseClass类的子类,但是又需要重新编写GetCustomerName函数,在新版的VisualBasic中,就可以这样写:7.2.7多态的概念InheritsBaseClassFunctionGetOrders()OverridesFunctionGetOrders()...EndFunctionInheritsBaseClass7.2.8错误处理(ErrorHandling)VisualBasic.NET的另外一个大的改进就是错误处理。VisualBasic将提供try...catch...finally结构,就像Delphi中的那样。例如:SubSafeWrite()Try7.2.8错误处理(ErrorHandling)Open"Testfile"...Write#1CatchKill"Testfile"FinallyClose#1EndTryEndSubOpen"Testfile"7.2.9建立线程新的VisualBasic语言结构部分将包含建立多线程。一个线程建立的范例如下:sett=NewThread(NewThreadstart(AddressOf(BaseClass.Function1))从上面的范例还可以看到,VisualBasic.NET中的AddressOf函数将真正返回函数的指针。这在进行API调用,例如回调函数方面将是很有帮助的。7.2.9建立线程7.3如何进行程序升级如果想要将VisualBasic6.0的程序向VisualBasic.NET程序升级,则首先还需要在自己的系统中安装VisualBasic6.0,然后再安装VisualBasic.NET,安装好之后,直接运行VisualBasic.NET。7.3如何进行程序升级如果想要将具体操作步骤如下:(1)运行VisualS主程序,启动VisualS。此时首先会出现一个如图7-3-1所示的欢迎界面。(2)在程序进入【起始页】窗口后,就可以通过如图7-3-2所示的选项来调用VisualBasic.NET语言进行开发设计了。具体操作步骤如下:图7-3-1VisualS欢迎界面图7-3-1VisualS欢迎界面图7-3-2调用VisualBasic.NET语言图7-3-2调用VisualBasic.NET语言(3)如果需要新建项目,则直接单击【新建项目】按钮,在【新建项目】对话框中选择“VisualBasic项目”后单击【确定】按钮就可进入VisualBasic.NET编辑状态了。如果是已经用VisualBasic6.0开发好的程序,则可以单击【打开项目】按钮,选择好要打开的项目后,将其升级就可以了。如图7-3-3所示就是正在升级的VisualBasic程序。(3)如果需要新建项目,则直接单图7-3-3正在升级的VisualBasic程序图7-3-3正在升级的VisualBasic程序代码在完成升级后,VisualBasic.NET会建立一个新的升级工程,如图7-3-4所示,并且会在“任务列表”栏中列出无法在.NET中进行升级的任务。代码在完成升级后,VisualBa图7-3-4完成升级的VisualBasic程序图7-3-4完成升级的VisualBasic程序1.Variant类型到Object类型以前版本的VisualBasic支持Variant数据类型,该类型可以设定为除了固定程序字符串外的任何原始数据类型和Empty、Error、Nothing和Null。在VisualBasic、NET中,Object数据类型可以设定为任何原始数据类型和Empty、Error、Nothing、Null和对象指针。当工程升级到VisualBasic.NET后,任何Variant定义都会改变为Object。同样,当在编辑器中插入代码时,Variant关键字也会被替换为Object。1.Variant类型到Object2.Integer数据类型到Short数据类型在VisualBasic6.0中,16bit数称为Short。32bit数称为Integer(64bit数称为Long)。当工程升级后,数据定义会做如下改动:DimxAsIntegerdimyasLong更改为:DimxAsShortdimyasInteger2.Integer数据类型到Shor3.属性语法VisualBasic.NET对于自定义属性的语法做了更加直观的更改,将Get和Set合而为一。例如原来的属性如下:PropertyGetMyProperty()AsIntegerm_MyProperty=MyPropertyEndPropertyPropertyLetMyProperty(NewValueAsInteger)m_MyProperty=NewValueEndProperty3.属性语法PropertyGet升级后更改为:PropertyMyProperty()AsShortGetm_MyProperty=MyPropertyEndGetSetm_MyProperty=ValueEndSetEndProperty升级后更改为:4.VisualBasic窗体到Windows窗体VisualBasic.NET包含新的窗体包和Windows窗体,Windows窗体包含内含菜单编辑器,升级后的VisualBasic窗体会升级到Windows窗体。5.界面在先前的版本中,公用类界面对于用户总是隐藏的。在VisualBasic.NET中,公用类可以在代码窗口中浏览和编辑。4.VisualBasic窗体到W6.升级报告及注释当工程升级后,升级报告会添加到用户的工程中,其中详细列出所有升级后所需要对代码做的更改。6.升级报告及注释7.3.1使用先前绑定的对象VisualBasic6.0和VisualBasic.NET都支持对象的延迟绑定,该方法事先定义一个变量为Object的数据类型,然后在运行时将其设定为一个类。然而,在升级过程中,当访问延迟绑定对象的缺省属性时可能会产生错误。7.3.1使用先前绑定的对象7.3.2缺省属性的运用在VisualBasic6.0中,许多对象都有缺省属性,缺省属性在代码中可以省略。例如:MsgBoxForm1.Text1.Text就可以这样编写:MsgBoxForm1.Text17.3.2缺省属性的运用其缺省属性在代码编译时决定。同样,也可以在延迟绑定的对象中使用缺省属性,例如:DimobjAsObjectSetobj=Form1.Text1MsgBoxobj其缺省属性在代码编译时决定。同样,也DimobjAsObjectSetobj=Me.Text1MsgBoxobj '不好的代码,使用缺省属性MsgBoxMe.Text1 '不好的代码,使用缺省属性use:DimobjAsObjectSetobj=Me.Text1MsgBoxobj.Text '好的代码,写出了属性MsgBoxMe.Text1.Text '好的代码,写出了属性DimobjAsObject虽然缺省属性不被VisualBasic.NET支持,但是带参数的缺省属性是被支持的。要了解它们之间的区别,请看下面的范例:DimrsAsADODB.Recordsetrs("CompanyName")="SomeCompany"rs!CompanyName="SomeCompany"这实际上等于:DimrsAsADODB.Recordsetrs.Fields("CompanyName").Value="SomeCompany"rs.Fields!CompanyName.Value="SomeCompany"虽然缺省属性不被VisualBas对于第二种写法,VisualBasic.NET是支持的,然而第一种情况不被支持。那么正确的用法应该如下:DimrsAsADODB.Recordsetrs("CompanyName").Value="SomeCompany"rs!CompanyName.Value="SomeCompany"对于第二种写法,VisualBasic7.3.3对Boolean类型数据使用AND/OR/NOT操作And和Or关键字在VisualBasic.NET和VisualBasic6.0中的使用是不同的。在VisualBasic6.0中,AND运算既执行逻辑AND操作也执行逐位AND操作,这取决于操作数(如果是Boolean类型,执行逻辑AND操作;如果是数字,执行逐位AND操作)。在VisualBasic.NET中,AND运算只执行逻辑AND操作。7.3.3对Boolean类型数据使用AND/O对于逐位操作,在VisualBasic.NET提供了一组操作:BitAnd、BitOr、BitNot以及BitXor。下面是演示这些差异的范例程序:DimaAsIntegerDimbAsIntegerDimcAsBooleana=1b=2c=aAndbMsgBox("Theansweris"&c)对于逐位操作,在VisualBa当上面的代码在VisualBasic6.0下运行时,结果是False(执行逐位AND操作);然而在VisualBasic.NET下,结果是True(执行逻辑AND操作)。用户要确定自己的程序在升级后其运行结果同升级前一样。VisualBasic.NET包含了VB6.And、VB6.Or以及VB6.Not的兼容函数,这些函数执行的结果同VisualBasic6.0下的AND/OR/NOT操作的执行结果是一样的。当上面的代码在VisualBasi当代码升级后,结果会像下面这样:DimaAsShortDimbAsShortDimcAsBooleana=1b=2c=VB6.And(a,b)MsgBox("Theansweris"&c)当代码升级后,结果会像下面这样:升级后的代码会得出False的结果,这同在VisualBasic6.0下运行是一样的。如果不想自己的代码升级后使用兼容函数,就需要确保自己的AND/OR/NOT都使用在Boolean类型数据的操作中。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论