国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
VB6?And?VB.NET
userphoto

2011.11.23

關注

VB6 And VB.NET

(2011-03-02 23:38:21)
標簽:

雜談

總覽:
    本文推薦給那些準備將自己的應用移植到Visual Basic.NET中的Visual Basic開發(fā)者。文章中包括
Visual Basic.NET升級工具的信息的介紹以及將Visual Basic 6結(jié)構(gòu)平滑升級到Visual Basic.NET 的指導
    在打開Visual Basic 6.0工程時Visual Basic.NET會自動升級,但是在絕大多數(shù)情況下你需要對在Visual
Basic.NET下打開的Visual Basic 6.0程序做一些改動。這篇文章的用途就是時你對原來的程序的改動盡可能的
少以及有效。
注:Visual Basic.NET仍然處于開發(fā)中,所以下面的一些細節(jié)可能還會有改動,下面的指導不保證在最終的產(chǎn)品出
來后代碼不需要改動。


什么是Visual Basic.NET?
    Visual Basic.NET是下一代的Visual Basic。而并不是簡單的在Visual Basic 6.0上在添加一些新特性而已,
微軟重新設計了產(chǎn)品以便使開發(fā)者能夠更加容易的開發(fā)分布式應用,例如基于WEB的程序以及多層系統(tǒng)。
    Visual Basic.NET中有兩種窗體包,Windows窗體以及Web窗體;一個新版的ADO用于接受離線數(shù)據(jù)源;新的語
言,移走了原來的關鍵字,提高Type數(shù)據(jù)的安全性以及提供低級別結(jié)構(gòu)以滿足高級別開發(fā)者的需求。
    這些新的特性為Visual Basic開發(fā)者提供了新的開發(fā)窗口:通過Web窗體以及ADO.NET,你可以快速開發(fā)可擴展
的Web站點;通過繼承,該語言實現(xiàn)了真正的支持面向?qū)ο缶幊蹋╫bject-oriented programming);Windows窗體
本身支持可視繼承;現(xiàn)在展開程序就象拷貝可執(zhí)行文件和控件到另一個目錄那樣簡單。
    Visual Basic.NET現(xiàn)在完全集成在其它的Microsoft Visual Studio .NET語言中,不僅可以通過不同的語言
開發(fā)組件,而且通過交叉語言繼承,你可以從用一種語言編寫的類中派生用另一種語言編寫的類。

為什么Visual Basic.NET不提供100%的繼承性?
    當在設計Visual Basic.NET時有兩個方向:翻新以及完全新建。為了體供給用戶盡可能多的新特性(例如繼
承以及線程),為了提供對新平臺的完全訪問,以及為了使Visual Basic能夠完全轉(zhuǎn)移到下一代的Web應用中。正
確的選擇是完全新建。

    例如,很多在Windows窗體中的新特性可以通過在現(xiàn)有的代碼中添加新控件以及屬性來實現(xiàn)。但是這樣就會犧
牲新的Windows窗體的很多內(nèi)在特性,例如安全以及可視繼承性。

    一個重要的目標是使Visual Basic代碼可以完全集成到用其它語言編寫的代碼中,例如Microsft C#(讀C Sharp)
或者Visual C++。以及讓Visual Basic開發(fā)者可以完全而且簡單利用.NET框架的功能,而不需要象原來那樣使用
Windows API調(diào)用。所有的Visual語言將與其它面向通用運行時語言(Common Language Runtime)的語言使用相同
的數(shù)據(jù)定義類型、數(shù)組、用戶自定義數(shù)組、類以及界面。不過這樣就要做一些犧牲,例如固定長度字符串以及以非
0數(shù)為下界的數(shù)組將不再被支持。

    Visual Basic現(xiàn)在已經(jīng)成為一個真正面向?qū)ο笳Z言,一些不一致的特性,例如 GoSub/Return語句以及DefInt
已經(jīng)從新語言中移走了。
    這樣的結(jié)果是使Visual Basic更加具有活力,使其成為一種開發(fā)基于Windows應用的最有效的工具之一,同時
也是開發(fā)下一代的Web站點的最佳工具。

升級到Visual Basic.NET
    Visual Basic.NET原則上可以使傳統(tǒng)的Windows開發(fā)者轉(zhuǎn)移到建立下一代Web以及多層應用中。所以,你的代碼
需要升級以適應Visual Basic.NET
    在你使用Visual Basic.NET打開Visual Basic 6.0工程后,通過自動升級工具可以一步步的升級并建立一個新
的基于Visual Basic.NET的工程。這個升級是單向的,既新的Visual Basic.NET工程無法再在Visual Basic 6.0中
打開。
    當工程升級后,Visual Basic.NET會修改語法的改變以及將Visual Basic 6.0窗體轉(zhuǎn)換為Windows窗體。在通
常情況下,你還需要手工做一些修改,因為自動升級工具不可能替你做所有的事情。
    為幫助改變原來代碼,當你的工程升級以后,Visual Basic.NET會在工程中添加“升級報告”列出所有的問題,
同時在代碼中添加注釋提示你需要做的改動,這些注釋會以“TO DO”列表形式列出在任務列表窗口中,所以你可
以很容易的需要改變的部分,要想瀏覽相關的代碼只需要雙擊任務列表中的相關項就可以了。每一個任務以及升級
報告中的列表項都有相關的在線幫助標題以給你更多的幫助。

讓Visual Basic 6.0和Visual Basic.NET同時工作
    Visual Basic.NET支持升級Visual Basic 6.0生成的工程,如果你的工程是在VB 1-5下編寫的,你需要首先升
級道Visual Basic 6.0工程,編譯、保存后再升級到Visual Basic.NET。
    Visual Basic.NET和Visual Basic 6.0可以安裝在同一系統(tǒng)下并可以同時運行。同樣的,利用較早版本或者其
它語言編寫的COM組件也可以集成到Visual Basic.NET中。例如你可以拖-放一個Visual Basic 6.0編寫的ActiveX
控件到Visual Basic.NET的Windows窗體中,在Visual Basic.NET的類中使用Visual Basic 6.0的COM組件。
    Visual Basic.NET編譯的組件同Visual Basic 6.0編譯的組件有一點點的不同,Visual Basic.NET對象是通過
垃圾收集方式釋放的,所以在對象被刪除到對象真正被從內(nèi)存中釋放之間或許會有一定的延遲。
    另外,Visual Basic.NET提供了Visual Basic.NET組件同Visual Basic 6.0之間的二進制兼容性?,F(xiàn)在展開一
個組件變的比以往更加容易,配置一個組件文件只需要簡單的拷貝文件到目錄就可以了(不需要regsvr32)。將組
件升級到新版本之需要以新文件覆蓋就文件就可以了。你所要做的只是確定新組件的類同方法同舊組件兼容。


結(jié)構(gòu)介紹
    .NET平臺提升了上一個版本平臺的結(jié)構(gòu),對于應用的可伸縮性和分布特性提供了更好的支持。例如離線數(shù)據(jù)訪
問、基于HTTP的消息傳遞文件配置。要獲得以上特性,你需要使用Visual Basic.NET。


基于瀏覽器的應用
Visual Basic 6.0和Visual Studio 6提供了以下的技術(shù)用于建立基于瀏覽器的Internet和Intranet應用:
Webclasses
DHTML projects
ActiveX documents
Active Server Pages (ASP)

    Visual Basic.NET中引入了ASP.NET,ASP.NET是增強版的ASP,并加入到了Web窗體(Web Forms)結(jié)構(gòu)中,Web
窗體是.NET架構(gòu)中非常重要的一個組成部分。一個Web窗體包含兩個部分:HTML文件和源程序文件。HTML文件用于
描述頁面;源程序文件用于響應、控制頁面事件。建立一個Web窗體同現(xiàn)在建立一個VisualBasic窗體一樣簡單。
它的WYSIWYG 界面設計方式同現(xiàn)在的Visual Basic是一樣的。下面的圖片演示了一個Web窗體的設計:

    Web窗體運行于服務器上,產(chǎn)生基于HTML3.2標準的HTML頁面發(fā)送到客戶端。這一點同ASP相同,但是由于Web程
序是編譯執(zhí)行的,同解釋執(zhí)行的ASP比較起來速度要快很多。

    下面是對將Visual Basic 6.0開發(fā)的基于瀏覽器的應用無縫轉(zhuǎn)移到Visual Basic.NET上的一些介紹以及結(jié)構(gòu)方
面的建議。

    我們建議你使用微軟多層構(gòu)架來開發(fā)你的應用,利用ASP來開發(fā)界面,同時使用Visual Basic 6.0或者Visual
C++ 6.0開發(fā)的COM組件,Visual Basic.NET完全支持ASP,你可以同時使用ASP、ASP.NET、Web窗體來擴展你的應用。
同時Visual Basic 6.0或者VC6商用組件可以不經(jīng)升級獲修改直接在Visual Basic.NET中使用。

    包含DHTML頁面以及客戶端DLL的DHTML 應用不能自動升級到Visual Basic.NET。我們建議你在Visual Basic
6.0下開發(fā)這些應用。同DHTML工程一樣,ActiveX Documents不被Visual Basic.NET支持。不能自動升級。我們建
議:或者在Visual Basic 6.0下開發(fā)ActiveX Documents或者將ActiveX Documents轉(zhuǎn)換為用戶自定義控件。不過
ActiveX documents 和 DHTML應用程序可以集成到Visual Basic.NET技術(shù)中。

    Web類(Webclasses)在Visual Basic.NET中將不再存在。Web類應用將升級到ASP.NET;不過,在自動升級后
你還需要做一些更改?,F(xiàn)存的Web類應用可以集成到Visual Basic.NET的Web窗體和ASP應用中,但是在新工程中,
我們建議在新工程中使用ASP的Windows DNA平臺。關于更多的關于Windows DNA的信息,請訪問微軟DNA站點:
http://msdn.microsoft.com/isapi/gomscom.as...sp?Target=/dna/

客戶/服務器工程
Visual Basic 6.0提供以下技術(shù)用于建立客戶端/服務器應用:
Visual Basic窗體
Microsoft Transaction Server (MTS)/COM+中間層對象
用戶控件

    Visual Basic.NET提供了新的窗體包:Windows窗體。相對于Visual Basic 6.0的窗體,Windows窗體使用不同
的對象模塊,不過絕大部分是兼容的。當你的工程升級時,Visual Basic窗體自動升級到Windows窗體。下面是
Windows窗體的示例:

    對于開發(fā)中間層的MTS and COM+ 服務器組件,Visual Basic.NET提供了更強大的支持。使用統(tǒng)一的調(diào)試器,
你可以從 客戶端到MTS/COM+組件再到客戶端進行步進調(diào)試。同時集成調(diào)試器也支持在MTS 和 COM+ 組件內(nèi)部進行
調(diào)試(組件需要以native code方式編譯,包含符號調(diào)試信息以及不進行優(yōu)化)。

    Visual Basic.NET同樣也提供了新的中間層組件:Web Services(Web服務器)。Web服務器包含在ASP.NET中,
其結(jié)構(gòu)如下圖所示:

    通過使用HTTP傳遞允許方法請求可以通過防火墻傳遞。數(shù)據(jù)的傳遞使用基于工業(yè)標準的XML,允許其它語言以
及平臺訪問它們的功能。盡管不再支持MTS事務,但是你還是有理由將你的應用升級到Web Server,如果你不僅需
要分布式事務處理而且需要跨平臺操作。通過Visual Basic.NET你可以通過簡單的拖-放操作來完成。

    當你的工程升級后,用戶控件會升級到Windows控件;然而,自定義屬性標記設置以及加速鍵設定不會升級。


單層應用
Visual Basic 6.0支持建立以下類型的單層應用程序:
單層數(shù)據(jù)庫應用程序
Visual Basic插件
普通的應用程序以及游戲。

    單層數(shù)據(jù)庫程序的代表就是使用Visual Basic訪問微軟Access數(shù)據(jù)庫。這些應用可以有限制的升級到Visual
Basic.NET
    現(xiàn)在Visual Basic.NET集成開發(fā)環(huán)境(IDE)已經(jīng)完全集成為Visual Studio.NET IDE的一部分,Visual Basic.NET
包含新的中性語言(language-neutral)的擴展模塊Visual Basic.NET的插件現(xiàn)在就等同于Visual Studio.NET
add-ins,你可以利用Visual Studio.NET中的任何語言來開發(fā)插件。例如,你可以編寫一個Visual Basic.NET插件
來繪制Visual C#窗體的顏色或者為VB類添加注釋。為了支持這些新的功能,Visual Basic.NET已經(jīng)不再支持舊的
擴展模塊,你需要更改原來程序中的擴展對象。

    很多程序被規(guī)于應用程序(Utility programs)。應用程序需要操作文件、設置注冊表。對此,Visual Basic.NET
也提供了新特性。例如意外句柄可以捕捉文件系統(tǒng)錯誤,使用注冊表類可以勇于操控注冊表。需要注意的是,一些
依賴于系統(tǒng)性能特征(performance characteristics)的程序,例如游戲需要做改進,因為Visual Basic.NET提
供了新的系統(tǒng)性能特征,對于Visual Basic.NET下的游戲開發(fā),你可以使用微軟DirectX7,或者使用新的GDI:GDI+,
GDI+包含了很多新特性,對簡單的2-D游戲提供了Alpha混合、反鋸齒支持以及更多的圖像文件格式的支持。

數(shù)據(jù)庫操作
Visual Basic 6.0提供了以下類型的數(shù)據(jù)庫訪問方式:
ActiveX Data Objects (ADO)
Remote Data Objects (RDO)
Data Access Objects (DAO)

    Visual Basic.NET包含了增強版的ADO,稱之為ADO.NET。ADO.NET的目標是操作離線數(shù)據(jù)。同時對于ADO的分布
應用提供了更強大的支持。ADO.NET提供了綁定數(shù)據(jù)庫到Windows窗體控件和Web窗體。
    通過做一些小的更改,DAO,RDO,ADO仍然可以在Visual Basic.NET中使用。然而,Visual Basic.NET不支持DAO
和RDO數(shù)據(jù)庫到控件、數(shù)據(jù)庫控件或者RDO用戶連接的綁定。我們建議在應用中包含DAO和RDO的應用或者仍然使用
Visual Basic 6.0開發(fā)或者再升級到Visual Basic.NET前將它們更改為ADO數(shù)據(jù)綁定。
語言方面的改進
    我們在很多的編程論壇或者新聞組中可以看到C++的擁護者將VB稱為一個玩具語言(Toy Language)。其中VB最
被人詬病的是它不真正支持面向?qū)ο缶幊?oop)。
在新的Visual Basic中,這些都將成為過去。Visual Basic.NET將真正支持oop。繼承(inheritance)、多態(tài)
(polymorphism)以及重載(overloading)。當然還不止這些。包括一些新的數(shù)據(jù)結(jié)構(gòu)、結(jié)構(gòu)性的錯誤控制(Error
Handing)以及線程。這些都將被新的VB所支持。

繼承
    假設你編寫了一個只包含一個函數(shù)的名稱為BaseClass的基本類:
   
    Function GetCustomerName()
    ' Do some stuff
    End Function

    如果你想建立一個新類,并使用BaseClass中的GetCustomerName函數(shù)。但有不想重寫一編代碼。那么通過繼承,
你可以這樣編寫新類:

    Inherits BaseClass

    Function GetCustomerID()
    ' Do some stuff
    End Function

重載
    重載就是建立兩個具有同樣你名稱但是參數(shù)屬性不同的函數(shù)的過程。假設有GetCustomID函數(shù)根據(jù)輸入輸出用
戶的ID號碼。那么該函數(shù)可能有以下兩種類型:

Function GetCustomerID(custname as string) As Integer
' 通過用戶名獲得用戶ID
End Function

Function GetCustomerID(purch as long) As Integer
' 根據(jù)購物單號碼獲得用戶ID
End Function

通過重載,你就可以根據(jù)不同類型的輸入調(diào)用同一個函數(shù)。
實際上現(xiàn)在的VB在某種程度上提供了重載的功能,考慮下面的函數(shù):

Function GetCustomID(vIN As Variant) As Long
    GetCustomID = vIN
End Function

你可以以下面兩種方式調(diào)用

ID = GetCustomID("123")
或者
ID = GetCustomID(123)

    那么為什么還要在新版本中引進重載呢?這是因為新的Visual Basic引進了新的特性:類型安全(default
type safety)。在Visual Basic.NET中,Variant類型將不復存在,詳細的介紹看下面關于升級部分的內(nèi)容。

多態(tài)
    多態(tài)是在一個類中重新定義一個函數(shù)的過程。例如你需要建立一個基于BaseClass類的子類,但是又需要重新
編寫GetCustomerName函數(shù),在新版的VB中,你就可以這樣寫:

Inherits BaseClass

Function GetOrders()
Overrides Function GetOrders()
...
End Function

線程
    新的Visual Basic語言結(jié)構(gòu)部分將包含建立多線程,一個線程建立的范例如下:

set t = New Thread(New Threadstart
                  (AddressOf(BaseClass.Function1))

    從上面的范例還可以看到,Visual Basic.NET中的AddressOf函數(shù)將真正返回函數(shù)的指針。這在進行API調(diào)用,
例如回調(diào)函數(shù)方面將是很有幫助的。

錯誤處理(Error Handling)
    Visual Basic.NET的另外一個大的改進就是錯誤處理。Visual Basic將提供try…catch…finally結(jié)構(gòu),就象
Delphi中的那樣(微軟的原文是:just like those "respectable" languages :-))。例如:

Sub SafeWrite()
Try
  Open "Testfile"
  ...
  Write #1
Catch
   Kill "Testfile"
Finally
   Close #1
End Try
End Sub


升級
    當代碼升級后,Visual Basic.NET會建立一個新的升級工程。下面通過幾個例子來說明你的代碼做了那些升級

Variant類型到Object類型
    以前版本的Visual Basic支持Variant數(shù)據(jù)類型,該類型可以設定為除了固定程度字符串外的任何原始數(shù)據(jù)類
型和Empty,Error,Nothing和Null。在Visual Basic.NET中,Object數(shù)據(jù)類型可以設定為任何原始數(shù)據(jù)類型和Empty,
Error,Nothing,Null和對象指針。當你的工程升級到Visual Basic.NET后,任何Variant定義都會改變?yōu)镺bject。
同樣,當你在編輯器中插入代碼時,Variant關鍵字也會被替換為Object。

Integer數(shù)據(jù)類型到Short數(shù)據(jù)類型
    在Visual Basic 6.0中,16bit數(shù)現(xiàn)在稱為Short。32bit數(shù)稱為Integer(64bit數(shù)稱為Long)。當工程升級后,
數(shù)據(jù)定義會做如下改動:

Dim x As Integer
dim y as Long
更改為:

Dim x As Short
dim y as Integer

屬性語法
    Visual Basic.NET對于自定義屬性的語法作樂更加直觀的更改,將Get和Set合而為一。例如原來的屬性如下:

Property Get MyProperty() As Integer
    m_MyProperty = MyProperty
End Property
Property Let MyProperty(NewValue As Integer)
    m_MyProperty = NewValue
End Property

升級后更改為:

Property MyProperty() As Short
    Get
        m_MyProperty = MyProperty
    End Get
    Set
        m_MyProperty = Value
    End Set   
End Property

VB窗體到Windows窗體
    Visual Basic.NET包含新的窗體包,Windows窗體,Windows窗體包含內(nèi)含菜單編輯器。你的VB窗體會升級到
Windows窗體。

界面
在先前的版本中,公用類界面對于用戶總是隱藏的。在Visual Basic.NET中,公用類可以在代碼窗口中瀏覽和編輯。

升級報告及注釋
    當工程升級后,升級報告會添加到你的工程中,詳細列出所有升級后的你所需要對代碼做的更改。同時代碼中
會加入注釋提示你注意任何潛在的問題。這些注釋自動出現(xiàn)在Visual Basic.NET的任務列表中。

編程介紹

使用先前綁定
    Visual Basic 6.0和Visual Basic.NET都支持對象的延遲綁定,該方法事先定義一個變量為Object數(shù)據(jù)類型,
然后在運行時將其設定為一個類。然而,在升級過程中,當訪問延遲綁定對象的缺省屬性時可能會產(chǎn)生錯誤。例
如假設工程中包含F(xiàn)orm1,F(xiàn)orm1中有一個Label對象,名稱為Label1,下面的Visual Basic 6.0代碼將Label的標題
設定
為"SomeText"

Dim o As Object
Set o = Me.Label1
o.Caption = "SomeText"

    在Visual Basic.NET的Windows窗體中,Label控件的Caption屬性被稱為Text屬性。當你的代碼升級后,所有
實例中的Caption屬性都會轉(zhuǎn)換為Text屬性,但是延遲綁定對象是無類型(type-less)的,VB無法檢測到對象的
類型并做更改,在這種情況下,你需要手工對代碼做改動。當你使用先前綁定對象時,對象可以自動升級,如下:

Dim o As Label
Set o = Me.Label1
o.Caption = "SomeText"

    所以在程序中你需要將對象定義為適當?shù)膶ο箢愋投皇呛唵蔚亩x為Object對象類型。

    同Visual C++類似。Visual Basic.NET支持函數(shù)的重載,例如下面的一個函數(shù)具有兩個形態(tài)

    Environ( Expression As Integer) As String
    Environ( Expression As String ) As String

    Visual Basic.NET會自動檢測該使用那個參數(shù)的函數(shù)。如果你傳遞一個正數(shù)值到Environ(),那么正數(shù)調(diào)用版
本會被調(diào)用;如果傳遞一個字符串,String版本會被調(diào)用。如果傳遞Object或者Variant數(shù)據(jù)類型到一個重載函數(shù)
將產(chǎn)生運行時錯誤。如果要想產(chǎn)生正確的結(jié)果就需要通過數(shù)據(jù)類型的強制轉(zhuǎn)換,例如:

Dim a As String
Dim v As Variant
v = "Path"
a = Environ(CStr(v))   '正確

    對于延遲綁定的對象使用強制類型轉(zhuǎn)換是一個很好的編程習慣。這就使得代碼可讀性更好,同時也可以非常輕
松的移植到Visual Basic.NET使用Date存儲日期/時間較早版本的VB支持使用Double數(shù)據(jù)類型來存儲和改變時間。
在Visual Basic.NET中,這個特性將不再支持,因為在計算機內(nèi)部日期并不是以Double方式存儲的,例如下面的代
碼可以在Visual Basic 6.0中運行,但是在Visual Basic.NET中會產(chǎn)生錯誤。

Dim dbl As Double
Dim dat As Date
dat = Now
dbl = dat      '錯誤,不能將一個Date變量賦予一個Double變量
dbl = DateAdd("d", 1, dbl)   '錯誤,Double變量不能用于日期函數(shù)
dat = CDate(dbl)   '錯誤 CDate函數(shù)不能將Double變量轉(zhuǎn)換到Date

    .NET架構(gòu)提供了ToOADate與FromOADate函數(shù)用于在double變量以及Date變量之間轉(zhuǎn)換。然而這需要在升級后手
工修改,所以在存儲日期時應該使用Date數(shù)據(jù)類型。

缺省屬性
    在Visual Basic 6.0中,許多對象都有缺省屬性,缺省屬性在代碼中可以省略。例如:

MsgBox Form1.Text1.Text

可以這樣編寫:

MsgBox Form1.Text1   

缺省屬性在代碼編譯是決定。同樣,你也可以在延遲綁定的對象中使用缺省屬性,例如:

Dim obj As Object
Set obj = Form1.Text1
MsgBox obj

對于延遲綁定的對象,缺省屬性在程序運行時決定。

    Visual Basic.NET不支持缺省屬性,當你的工程升級后,Visual Basic.NET會自動決定缺省屬性,但是對于延
遲綁定的對象無法自動解決決定缺省屬性的問題。在這種情況下,你需要自己來修改代碼。更加復雜的是,很多庫
是通過 _Default屬性來實現(xiàn)缺省屬性的。_Default象是一個代理,它將調(diào)用傳遞給真正的缺省屬性。所以當你的
工程升級后,一些屬性會被更改為 _Default。代碼還是象往常那樣工作,只是代碼不如原來的實際屬性易讀。

Dim obj As Object
Set obj = Me.Text1
MsgBox obj   '不好的代碼,使用缺省屬性
MsgBox Me.Text1   '不好的代碼,使用缺省屬性

use:

Dim obj As Object
Set obj = Me.Text1
MsgBox obj.Text   '好的代碼,寫出了屬性
MsgBox Me.Text1.Text   '好的代碼,寫出了屬性

    雖然缺省屬性不被Visual Basic.NET支持,但是帶參數(shù)的缺省屬性是被支持的,要了解它們之間的區(qū)別,下面
是范例:

Dim rs As ADODB.Recordset
rs("CompanyName") = "SomeCompany"
rs!CompanyName = "SomeCompany"

實際上等于:

Dim rs As ADODB.Recordset
rs.Fields("CompanyName").Value = "SomeCompany"
rs.Fields!CompanyName.Value = "SomeCompany"

因為Value是Fields的缺省屬性
對于第二種寫法,Visual Basic.NET是支持的;然而第一種情況不被支持,那么正確的用法如下:

Dim rs As ADODB.Recordset
rs("CompanyName").Value = "SomeCompany"
rs!CompanyName.Value = "SomeCompany"

    象上面的范例和其它的大多數(shù)情況可以在工程升級時解決,但是你還是要避免在Visual Basic 6.0中在Object
和Variant數(shù)據(jù)類型使用缺省屬性。因為升級程序無法發(fā)現(xiàn)并解決這些錯誤。

對Boolean類型數(shù)據(jù)使用AND/OR/NOT操作
    And和Or關鍵字在Visual Basic.NET和Visual Basic 6.0中的使用是不同的,在Visual Basic 6.0中,AND運算
既執(zhí)行邏輯AND操作也執(zhí)行逐位AND操作,取決于操作數(shù)(如果是Boolean類型,執(zhí)行邏輯AND操作,如果是數(shù)字,執(zhí)
行逐位AND操作)。在Visual Basic.NET中,AND運算只執(zhí)行邏輯AND操作。對于逐位操作,在Visual Basic.NET提供
了一組操作:BitAnd, BitOr, BitNot以及BitXor 。

下面是演示這些差異的范例程序

Dim a As Integer
Dim b As Integer
Dim c As Boolean
a = 1
b = 2
c = a And b
MsgBox ("The answer is " & c)

    當上面的代碼在Visual Basic 6.0下運行時,結(jié)果是False(執(zhí)行逐位AND操作);然而在Visual Basic.NET下,
結(jié)果是True(執(zhí)行邏輯AND操作)。
    要確定你的程序在升級后也運行結(jié)果同升級前一樣,Visual Basic.NET包含了兼容函數(shù)VB6.And, VB6.Or以及
VB6.Not,這些函數(shù)執(zhí)行的結(jié)果同Visual Basic 6.0下的AND/OR/NOT操作的執(zhí)行結(jié)果是一樣的。當代碼升級后,結(jié)
果會象下面這樣:

Dim a As Short
Dim b As Short
Dim c As Boolean
a = 1
b = 2
c = VB6.And(a, b)
MsgBox ("The answer is " & c)

升級后的代碼會得出False的結(jié)果,同Visual Basic 6.0下運行一樣

    如果不想你的代碼升級后使用兼容函數(shù),就需要確保你的AND/OR/NOT都使用在Boolean類型數(shù)據(jù)的操作中,例
如,如果上面的代碼更改為下面的方式:

Dim a As Integer
Dim b As Integer
Dim c As Boolean
a = 1
b = 2
c = a <> 0 And b <> 0
MsgBox ("The answer is " & c)

當升級后,代碼同原來的幾乎一樣:

Dim a As Short
Dim b As Short
Dim c As Boolean
a = 1
b = 2
c = a <> 0 And b <> 0
MsgBox ("The answer is " & c)

    同前面不同的是每一個操作都是在Boolean數(shù)據(jù)之間進行的,因此它們在Visual Basic 6.0中使用的都是邏輯
AND操作。所以在升級到Visual Basic.NET后不會發(fā)生改變。這樣做的意義是你可以直接在Visual Basic.NET和
Visual Basic 6.0之間拷貝和粘貼代碼,你的代碼會運行的更快因為使用的是本地的AND操作而不是兼容函數(shù)。

    另外一個需要考慮的問題是對于函數(shù)結(jié)果的AND/OR/NOT 操作的問題,例如下面的范例:

Dim b As Boolean
b = Function1() And Function2()

    在Visual Basic 6.0中,F(xiàn)unction1和Function2的結(jié)果都會執(zhí)行后再將結(jié)果進行AND操作。在Visual Basic.NET
中,只有當Function1的結(jié)果為True時才會計算Function2。因為Visual Basic.NET中的AND運算執(zhí)行的是邏輯AND操
作,如果Function1結(jié)果為False,AND結(jié)果肯定是False,為了加快速度就不再執(zhí)行Function2的了。但是如果
Function2另有目的,例如用于避免某些錯誤,那么就會出現(xiàn)不可預知的錯誤,那么上面的代碼升級后就會象下面
的樣子:

Dim b As Boolean
b = VB6.AND(Function1(), Function2())

為了不在升級代碼中出現(xiàn)兼容函數(shù),原來的代碼需要做如下的改動:

Dim b As Boolean
Dim c As Boolean
Dim d As Boolean
c = Function1()
d = Function2()
b = c And d

    另一個需要注意的是在Visual Basic.NET中,True值將不再是-1而是1。做這個改變是為了使Visual Basic.NET
能集成在 .NET語言中。因為有這個改變,你需要再你的Visual Basic 6.0工程中使用常量True而不是-1來表示真
值,使用Boolean類型而不是整數(shù)類型變量保存Boolean數(shù)據(jù)。下面的代碼說明了Visual Basic 6.0和Visual Basic.NET
之間的不同:

Dim i As Integer
i = True
If i = -1 Then
    MsgBox ("True")
Else
    MsgBox ("False")
End If
在Visual Basic 6.0中,結(jié)果為True,而在Visual Basic.NET中結(jié)果為False。

如果對代碼做如下改動,程序在兩種語言下運行都會顯示True

Dim i As Boolean
i = True
If i = True Then
    MsgBox ("True")
Else
    MsgBox ("False")
End If

通過上面的范例可以看出在程序中需要注意兩點:
1、使用常量True和False來判斷是否而不要使用0和-1
2、使用Boolean類型變量儲存Boolean數(shù)值而不要使用Integer類型變量
如果在你的程序中沒有這么做的話,在升級后你還需要做大量的手工改動

避免Null傳播(Propagation)
    先前版本的VB支持Null傳播。Null傳播的前提是null值使用在表達式中,表達式的結(jié)果將是Null,例如下面
的范例,結(jié)果V都將是Null

Dim V
V = 1 + Null
V = Null + Right$("SomeText", 1)
V = Right("SomeText", 0)

    Null傳播在Visual Basic.NET中將不再被支持。象上面的語句1+Null會產(chǎn)生一個類型錯誤。另外在Visual
Basic 6.0中有兩個求左值的函數(shù):Left和Left$前者返回值為Variant類型并且可以為空,Left$函數(shù)返回值為String
類型。在Visual Basic.NET中,只有一個Left函數(shù),該函數(shù)總是返回String類型值

    為了使程序兼容Visual Basic 6.0以及Visual Basic.NET,你需要在代碼中加入對Null檢測的代碼,在Visual
Basic.NET中,下面的函數(shù)將不再返回Null值:

Chr Mid
Command Oct
CurDir Right
Date RTrim
Environ Space
Error Str
Hex Time
LCase Trim
LTrim UCase

由于數(shù)據(jù)庫中的數(shù)據(jù)可以包含Null值,所以你需要在程序中對獲得的數(shù)據(jù)加入代碼檢測其值是否為Null。

使用以0為下界的數(shù)組
    Visual Basic 6.0允許你使用任何整數(shù)數(shù)字作為一個數(shù)組的上界和下界。同樣你也可以通過ReDim將一個Variant
重新定義為數(shù)組。為了能夠同.NET平臺下的其它語言協(xié)同工作,Visual Basic.NET數(shù)組必須以0作為下界,而且只
有一個變量事先定義為數(shù)組后才可以使用ReDim函數(shù)重新定義。雖然這樣限制了數(shù)組定義的靈活性,但是這樣可以
在Visual Basic.NET和.NET下的其它語言之間傳遞數(shù)組。下面的范例說明了新的定義數(shù)組的約束:

Dim a(1 To 10) As Integer   '錯誤:下界必須為0
Dim v
ReDim v(10)   '錯誤,在沒有定義v為數(shù)組前不能使用ReDim
Dim b(10) As Integer   '正確
ReDim b(5) As Integer   '正確

    另外,在Visual Basic 6.0中, Dim (0 to 10) As Integer定義了包含11各整數(shù)的數(shù)組,索引從0到10。同樣
的定義在Visual Basic.NET下建立一個包含10個整數(shù)的數(shù)組,索引從0到9。

    基于上面的改變,Option Base 0|1已經(jīng)從Visual Basic.NET中刪除了。

    當你的代碼升級到Visual Basic.NET后,以0為下界的數(shù)組不會改變。如果數(shù)組下界非0的話,數(shù)組會升級到一
個兼容類,如下:

Dim a(1 To 10) As Integer
改變?yōu)?

Dim a As Object = New VB6.Array(GetType(Short), 1,10)

    兼容數(shù)組類比本地數(shù)組操作起來要慢很多,同時在程序中使用它也有限制。例如你不能將一個兼容數(shù)組類作為
參數(shù)傳遞到一個以數(shù)組作為參數(shù)的函數(shù),你也不能傳遞一個兼容類到Visual C#或者Visual C++類中。

    基于以上原因,你需要在你的Visual Basic 6.0代碼中使用以0為下界的數(shù)組,避免使用ReDim定義數(shù)組,避免
使用Option Base 1語句。

使用VB常量而不要使用它們所代表的值
在寫代碼的時候,盡量使用VB常量而不要使用它們所代表的值。例如你要在運行時將一個窗口最大化,使用:

Me.WindowState = vbMaximized   'Good: Constant name

而不要使用:

Me.WindowStyle = 2   'Bad: Underlying value
Me.WindowStyle = X   'Bad: Variable

    在Visual Basic.NET中,一些屬性和常量的數(shù)值發(fā)生了改變;例如True的值由-1變?yōu)榱?。在你的代碼升級到
Visual Basic.NET后,大部分的常量會自動更改;然而如果你使用的是常量代表的數(shù)值而不是常量名,那么你就要
做大量的手工更改工作。

用戶自定義數(shù)據(jù)類型中的數(shù)組和固定長度字符串
    為了使Visual Basic.NET數(shù)組和數(shù)據(jù)結(jié)構(gòu)完全兼容Visual Studio.NET,固定長度字符串在新語言中不再被支
持。在大多數(shù)情況下者不是問題,因為Visual Basic.NET提供了兼容固定長度字符串定義的類,那么代碼:

Dim MyFixedLengthString As String * 100

升級后會變成這樣:

Dim MyFixedLengthString As New VB6.FixedLengthString(100)

    然而,在數(shù)據(jù)結(jié)構(gòu)(例如用戶自定義數(shù)據(jù))中使用固定長度字符串類可能產(chǎn)生錯誤。因為在用戶自定義數(shù)據(jù)結(jié)
構(gòu)建立時類不會被建立。用戶自定義數(shù)據(jù)中的固定長度數(shù)組也會產(chǎn)生同樣的問題。

    當你的代碼升級后,在代碼中的用戶自定義數(shù)據(jù)類型中如果有固定長度的數(shù)組和字符串的話,在定義位置會添
加注釋提醒你在使用用戶自定義數(shù)據(jù)類型前首先對字符串或者數(shù)組進行初始化。然而,你可以在你的Visual Basic
6.0的用戶自定義類型中將固定長度的字符串定義改變?yōu)樽址x,將固定長度數(shù)組定義改變?yōu)槲闯跏蓟瘮?shù)組來
避免升級產(chǎn)生后產(chǎn)生上面的問題。例如:

Private Type MyType
    MyArray(5) As Integer
    MyFixedString As String * 100
End Type
Sub Bar()
    Dim MyVariable As MyType
End Sub

升級后會變?yōu)椋?br>
Private Type MyType
    MyArray() As Integer
    MyFixedString As String
End Type
Sub Bar()
    Dim MyVariable As MyType
    ReDim MyVariable.MyArray(5) As Integer
    MyVariable.MyFixedString = String$(100, " ")
End Sub   

Avoid Legacy Features
避免使用從原始Basic繼承的特性,如下的關鍵字在新版本語言中將不再出現(xiàn):

Def
Computed GoTo/GoSub
GoSub/Return
Option Base 0|1
VarPtr, ObjPtr, StrPtr
LSet

Windows APIs
    大多數(shù)的API調(diào)用可以象在Visual Basic 6.0中一樣使用,因為數(shù)據(jù)類型發(fā)生了改變。在Visual Basic 6.0中
的Long類型在Visual Basic.NET中定義為Integer類型。在升級過程中這些定義會自動改變,例如:

Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
    Dim Ver As Long
    Ver = GetVersion()
    MsgBox ("System Version is " & Ver)
End Function

改變?yōu)椋?br>
Private Declare Function GetVersion Lib "kernel32" () As Integer        
Function GetVer()
    Dim Ver As Integer
    Ver = GetVersion()
    MsgBox("System Version is " & Ver)
End Function

    除了數(shù)字類型的升級外,Visual Basic 6.0還支持固定長度字符串類型,該類型升級到Visual Basic.NET后
會定義為固定長度字符串兼容類。

所以在Visual Basic 6.0代碼中最好使用通用字符串定義,例如:

Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Long) As Long
Function GetUser()
    Dim Ret As Long
    Dim UserName As String
    Dim Buffer As String * 25
    Ret = GetUserName(Buffer, 25)
    UserName = Left$(Buffer, InStr(Buffer, Chr(0)) - 1)
    MsgBox (UserName)
End Function

上面的代碼出現(xiàn)了固定長度字符串,最好更改為:

    Dim Buffer As String
    Buffer = String$(25, " ")

升級到Visual Basic.NET后會稱為下面的樣子:

Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Function GetUser()
    Dim Ret As Integer
    Dim UserName As String
    Dim Buffer As String
    Buffer = New String(CChar(" "), 25)
    Ret = GetUserName(Buffer, 25)
    UserName = Left(Buffer, InStr(Buffer, Chr(0)) - 1)
    MsgBox(UserName)
End Function

    在有些情況下,Visual Basic.NET能夠更好的控制傳遞字符串到API調(diào)用,因為你可以通過ANSI 和UNICODE
關鍵字定義字符串傳遞的方式。

有三種情況需要對代碼最手工改進。
1、在傳遞給API函數(shù)的自定義數(shù)據(jù)類型定義中包含固定長度字符串和數(shù)組。在Visual Basic.NET中你需要對自定
義數(shù)據(jù)類型定義中的每一個固定長度
字符串和數(shù)組添加MarshallAs 屬性。
2、在定義中使用As Any聲明。該種聲明不再被Visual Basic.NET支持,變量定義為As Any通常是為了傳遞一個既
可能是字符串也可能是Null的變量,在Visual Basic.NET中,你可以定義兩個不同類型的API,一個為Long類型,
一個為String類型,以API函數(shù)GetPrivateProfileString 為例:

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias
   "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
      lpKeyName As Any, ByVal lpDefault As String, ByVal
         lpReturnedString As String, ByVal nSize As Long, ByVal
            lpFileName As String) As Long

你可以刪除As Any而代之以定義兩個不同的函數(shù);一個接受Long數(shù)值,一個接收String樹脂:

Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias
   "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal
      lpKeyName As String, ByVal lpDefault As String, ByVal
         lpReturnedString As String, ByVal nSize As Long, ByVal
            lpFileName As String) As Long
Private Declare Function GetPrivateProfileStringNullKey Lib "kernel32"
   Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String,
      ByVal lpKeyName As Long, ByVal lpDefault As String, ByVal
         lpReturnedString As String, ByVal nSize As Long, ByVal
            lpFileName As String) As Long

當你希望傳遞Null數(shù)值時,使用GetPrivateProfileStringNullKey。

3、如果你的程序中有諸如建立線程、Windows子類(subclassing),消息鉤子等API調(diào)用時,這些函數(shù)在
Visual Basic.NET下可能會產(chǎn)生運行時錯誤。很多這些API在Visual Basic.NET或者.NET架構(gòu)中有等價的函數(shù)。

窗體與控件
    Visual Basic.NET包含了一個新的窗體包:Windows窗體。Windows窗體與Visual Basic 6.0窗體間保持了最
大的兼容性;然而,還是有一些需要提出的關鍵差異:
    Windows窗體不支持OLE container控件;你需要在Visual Basic 6.0應用中避免使用該控件。
    在Windows窗體中沒有Shape控件。矩形和圓角形狀控件會升級為Label控件,橢圓和圓形無法升級。你需要在
Visual Basic 6.0應用中避免使用該控件。
    在Windows窗體中沒有Line控件。橫線條和豎線條控件會升級為Label控件,斜線條無法升級。你需要在Visual
Basic 6.0應用中避免使用該控件。

    Windows窗體提供了新的圖形命令取代Circle, CLS, PSet, Line以及Point。因為新的對象模塊同Visual Basic
6.0是不同的,這些方法無法被升級

    對于Timer控件,將Interval屬性設置為0不能使Timer控件停止運行而是將時間間隔設定為1。所以在Visual
Basic 6.0中,需要通過設置Enabled屬性為False而不是將Interval屬性設置為0來停止Timer運行。

    Windows窗體包含兩種菜單控件,MainMenu(窗口菜單)和ContenxtMenu(彈出菜單)。而Visual Basic 6.0只包
含一種菜單控件:Menu。Menu可以以窗口菜單方式也可以以彈出菜單方式打開。工程升級后Menu會升級到MainMenu。
但是你不能以彈出方式打開MainMenu;你需要手工建立彈出菜單。

Windows窗體不支持動態(tài)數(shù)據(jù)交換(DDE)。
Windows窗體不支持Form.PrintForm方法

    雖然Windows窗體在功能上支持拖-放但是對象模塊同Visual Basic 6.0有很大的不同,所以Visual Basic 6.0
中的拖-放屬性以及方法無法升級。

    .NET架構(gòu)對Clipboard對象進行了升級,對剪貼版的操作比Visual Basic 6.0的Clipboard對象提供了更多的函
數(shù)和支持。因為對象模塊的不同,Clipboard聲明無法自動升級


    Windows窗體不支持在運行時對窗體和控件的Name屬性進行訪問,這樣你就不能通過Name屬性訪問控件集合中
的控件(這個功能在.Net的System.Reflection類中提供)

    為了保證你的窗體在升級后保持正確的尺寸,你要確保在程序中將缺省的縮放比例(ScaleMode)設定為Twips。
當升級后,Visual Basic.NET將度量單位從Twips轉(zhuǎn)換為pixels

    上面就是關于Visual Basic.NET的說明,從上面的介紹可以看到,相對于以前的版本,這一次的的Visual Basic
可以說是有了重大的革新(而且似乎有一些方面在向Delphi看齊)。它提供了以前版本從來沒有的面向?qū)ο缶幊蹋?br>強大的錯誤處理,同VC++ C Sharp更緊密的集成。但是也犧牲了很多原來Basic一直都有的特性。不過總的來看,還是
值得升級到Visual Basic.NET的。如果最終的版本能夠?qū)崿F(xiàn)他們所說的那樣,我會給Visual Basic.NET打4顆星。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
從VB 6.0到VB.NET的轉(zhuǎn)換
從 eMbedded Visual Basic 遷移到 Visual Basic .NET
VB.NET Sub過程簡單分析
vb.net初相識
2016年4月TIOBE編程語言排行榜Visual Basic正漸行漸遠
全國計算機等級考試二級VB考試大綱
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服