我以前都是用C#來(lái)寫,這次搞這個(gè)VB.NET項(xiàng)目,有點(diǎn)突然。還好語(yǔ)言都是相通的。1.雖說(shuō)以前的Microsoft Visual Basic和.NET都是微軟自己的東西,可有很多功能的實(shí)現(xiàn)方式還不一樣,特別是那些控件。2.每個(gè)程序都會(huì)有自己的業(yè)務(wù)邏輯,有些可能會(huì)很復(fù)雜,甚至讀別人的代碼時(shí)你可能對(duì)業(yè)務(wù)邏輯那部分會(huì)完全一頭霧水。開始也打算在.NET環(huán)境下重做,可在做了一些嘗試后發(fā)現(xiàn)根本沒(méi)法了解那個(gè)VB6.0程序的業(yè)務(wù)邏輯,以致于從VB6.0轉(zhuǎn)換到.NET下后,那些老的graph控件沒(méi)法工作。和項(xiàng)目經(jīng)理做了很多研究后,還是決定先讓Microsoft Visual Studio替我們先把VB6.0項(xiàng)目轉(zhuǎn)換生成一個(gè)VB.NET項(xiàng)目,然后在這基礎(chǔ)上改。事實(shí)證明,這種做法很明智,因?yàn)橄啾仍?NET環(huán)境下重做會(huì)少寫很多代碼,而且你幾乎不用去管那個(gè)項(xiàng)目的業(yè)務(wù)邏輯。廢話少說(shuō),下面介紹升級(jí)過(guò)程。1.在機(jī)子上安裝Microsoft Visual Basic,我用的是Microsoft Visual Basic 6.0中文企業(yè)版。作用有兩個(gè):(1)確保以前的VB項(xiàng)目能正常工作.(2)方便以后能回到這個(gè)老項(xiàng)目中進(jìn)行一些調(diào)試。2.打開你的Microsoft Visual Studio,接著執(zhí)行File-Open-Project/Solution,在彈出的對(duì)話框找到將被轉(zhuǎn)換的.vbp工程文件,選中并打開它。此時(shí)會(huì)彈出Visual Basic Upgrade Wizard。在這個(gè)過(guò)程你需要指定被轉(zhuǎn)換過(guò)來(lái)的項(xiàng)目的位置以及項(xiàng)目類型。因?yàn)槲疫@個(gè)是桌面程序,所以我選擇了.exe類型。參數(shù)準(zhǔn)備完后,IDE會(huì)需要比較長(zhǎng)的時(shí)間來(lái)完成升級(jí)過(guò)程。3.轉(zhuǎn)換完成后,你會(huì)發(fā)現(xiàn)IDE提示了很多代碼的錯(cuò)誤。其實(shí)很多VB6.0里面的老控件都已經(jīng)被Visual Studio轉(zhuǎn)換過(guò)來(lái)了,或者Visual Studio里已經(jīng)以其它相似的名字內(nèi)置了對(duì)VB6.0老控件的支持。有一點(diǎn)VB6.0里的DBGrid控件會(huì)被轉(zhuǎn)化成.NET下的AxMSDBGrid.AxDBGrid類型的控件,這種控件在VB6.0里需要Data控件作為數(shù)據(jù)源。.NET已完全拋棄了Data控件,不再提供對(duì)它的直接支持,而選用了性能更高的ADO.NET組件。開始我們本打算原封不動(dòng)的用轉(zhuǎn)換過(guò)來(lái)的控件,后來(lái)發(fā)現(xiàn)這個(gè)AXDBGrid控件的DataSource屬性必須要是一個(gè)ICursor,而當(dāng)今現(xiàn)存的數(shù)據(jù)源控件除了Data控件都無(wú)法提供這個(gè)ICursor接口屬性,但這個(gè)Data控件在.NET中是無(wú)法使用的。最后不得已選用了.NET下標(biāo)準(zhǔn)的數(shù)據(jù)顯示控件DataGridView,并用以下代碼模擬出Data控件。
1 Public Solar As DAO.Recordset
2 ModelData = DAODBEngine_definst.Workspaces(0).OpenDatabase(Application.StartupPath + "\Cmpnents.mdb", False, False, "MS Access;PWD=" & pssss)
3 Solar = ModelData.OpenRecordset("SELECT * From SMake", DAO.RecordsetTypeEnum.dbOpenDynaset) 對(duì)上面的代碼我得說(shuō)明下:1.DAODBEngine_definst是.VB文件中一個(gè)Module里聲明的對(duì)象。代碼如下:Module UpgradeSupport
Friend DAODBEngine_definst As New DAO.DBEngine
End Module
2.其中DAO命名空間在dao360.dll中(你需要用regsvr32.exe注冊(cè)該DLL,然后把它以COM組件的形式引入到自己的項(xiàng)目中),而VB中只能使用DAO350.DLL。3.這里選用DAO.Recordset而不選用其它數(shù)據(jù)源是因?yàn)樵搶?duì)象本身提供了幾乎Data控件所具有的所有方法,像MoveFirst(),MoveLast(),MoveNext()等方法,這樣就可以減少對(duì)升級(jí)后的代碼修改。4.Recordset對(duì)象是無(wú)法直接作為DataGridView的數(shù)據(jù)源的,必須先把轉(zhuǎn)化為DataTable對(duì)象,再把它作為DGV的數(shù)據(jù)源,轉(zhuǎn)換代碼如下:
1 Function RecordsetToDataTable(ByVal adoRS As DAO.Recordset, ByVal strTable As String) As DataTable
2
3 adoRS.MoveFirst()
4 Dim dt As DataTable
5 dt = New DataTable(strTable)
6 Dim i As Integer
7 Dim strcolname As String
8 Dim t As Type
9 Dim dr As DataRow
10
11 For i = 0 To adoRS.Fields.Count - 1
12 strcolname = adoRS.Fields(i).Name
13 t = adoRS.Fields(i).Value.GetType()
14 dt.Columns.Add(strcolname, t)
15 Next
16 While (Not adoRS.EOF)
17 dr = dt.NewRow()
18 For i = 0 To adoRS.Fields.Count - 1
19 dr(i) = adoRS.Fields(i).Value
20 Next
21 dt.Rows.Add(dr)
22 adoRS.MoveNext()
23 End While
24
25 Return dt
26 除了這個(gè)麻煩的Data控件,對(duì)VB6.0里的Printer對(duì)象我也得說(shuō)說(shuō)。這個(gè)Printer對(duì)象提供了很多.NET里的PrintDocument組件無(wú)法直接實(shí)現(xiàn)的功能,像對(duì)窗口,圖片的縮放打印。于是我期盼著能直接使用這個(gè)Printer對(duì)象。查了下MSDN,它告訴我:這個(gè)對(duì)象在.NET也有內(nèi)置的支持,于是我按照它說(shuō)的安裝了VisualBasicPowerPacksRedist.msi并引入相關(guān)的DLL組件(相關(guān)的說(shuō)明及操作,請(qǐng)參考MSDN:http://msdn.microsoft.com/zh-cn/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.aspx),并引入了 Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6命名空間,這時(shí)與VB6.0中Printer對(duì)象有關(guān)的方法可以用了,可在執(zhí)行打印時(shí)完全沒(méi)任何紙從打印機(jī)出來(lái),如此weird,呵呵,除了這個(gè)詞我實(shí)在不知道還有哪種語(yǔ)言哪個(gè)形容詞能描述它。最后我不得不用PrintDocument組件實(shí)現(xiàn)它。對(duì)于這個(gè)問(wèn)題,歡迎大家和我交流。
2009-10-09 13:12 | CoolCode
N久之前我也做過(guò)類似事情,但不管怎樣簡(jiǎn)單,始終是件苦差事。把舊的東西毫不吝嗇地丟掉才是明智選擇。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。