首頁 | 社區 | 博客 | 招聘 | 文章 | 新聞 | 下載 | 讀書 | 代碼
親,您未登錄哦! 登錄 | 注冊

老生常談:從VB6遷移到VB.net

打印文章

分享到:
Visual Basic相信是很多程序員接觸的第一個開發環境,當然多年后想遷移到Visual Basic.NET還是需要一定的處理工作的。本文將為大家介紹遷移的過程。

  在工作中,可能會碰到需要將VB編寫的代碼遷移到 VB.NET的情況,有好多細節需要處理。好在互聯網發展了這么多年,好多問題在互聯網上都有答案,所以需要的時候搜索一下就能解決。

  本人也碰到了從VB遷移到VB.NET的情況,現將碰到的問題及其解決方法或替代方法做一個總結,方便后來人。

  首先,建議看一下這篇英文文章《Converting VB6 to VB.NET》http://dotnet.sys-con.com/node/46335,講述了一般的遷移步驟。

  其次,下載 Microsoft Visual Basic Power Packs 并安裝,這樣在使用向導將VB6的代碼遷移到VB.NET之后,能“消滅”不少編譯錯誤。

  VB Power Packs 2.0 對應VS2005,本人沒有找到下載地址。

  VB Power Packs 3.0 對應VS2008,下載地址:http://download.microsoft.com/download/1/2/A /12AA9B28-4F67-42C3-9319-684E8AD6F0AE/VisualBasicPowerPacks3Setup.exe

  據說VB Power Packs 10.0 已經發布了,感興趣的讀者請自行搜索。

  之后就是各種瑣碎的問題,只能碰到一個,解決一個。

  問題:NewIndex 不是“System.Windows.Forms.ListBox”的成員

  方法一:

   
Dim x As Integer x = ListBox.Items.Add(rsDates.Fields("fd").Value) ListBox.SelectedIndex = x

        方法二:
ListBox.Items.Add(rsDates.Fields("fd").Value) ListBox.SelectedIndex=ListBox.Items.Count-1

        問題:If App.PrevInstance Then ' 程序已經運行

  方法
 If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length > 1 Then 問題:Unload()

        方法:從理論上來講,VB.NET有垃圾收集機制,所以不用主動的注銷對象,直接注釋掉就行(沒有經過嚴格驗證)

  問題:需要對程序集“mscomctl, Version=10.0.4504.0, Culture=neutral, PublicKeyToken……

  原因:引用了 office控件

  方法:安裝VS的“visual studio tools for Office”,安裝Office200*的“.net可編程支持”

  更詳細的資料:http://saber5d.blog.163.com/blog/static/12799877820098164556798/

  問題:PictureBox.cls()

  方法:PictureBox.Refresh()

  問題:DateTime.dateDiff()

  方法:DateAndTime.DateDiff()

  問題:在狀態欄動態添加panel
Dim x As Integer x = StatusBar.Panels.Count StatusBar.Panels.Add x, string1, string2 StatusBar.Panels.Add x + 1, string1, string2

        升級向導將代碼變為:

    方法一:
StatusBar.Items.Add(New System.Windows.Forms.ToolStripStatusLabel(Integer, string1, string2)) 方法:手工修改為

  StatusBar.Items.Add(New System.Windows.Forms.ToolStripStatusLabel(string)) StatusBar.Items.Item(StatusBar.Items.Count - 1).Text = string 問題:“PaintPicture”不是“System.Windows.Forms.PictureBox”的成員。

 Dim g As Graphics = Picture1.CreateGraphics() g.DrawImage(pic, x, y)

        這種方法,每次PictureBox重繪的時候,圖片會消失

  方法二:
Private blankBitmap As Bitmap blankBitmap = New Bitmap(70 * 12, maxRow * 12) Picture1.Image = blankBitmap Dim g As Graphics g = Graphics.FromImage(Picture1.Image) g.DrawImage(pic, x, y)

這種方法,每次PictureBox重繪的時候,圖片不會消失

  問題:LenB()

  方法一:
Public Function LenB(ByVal oString As String) As Integer Dim strArray() As Byte Dim Strlen As Integer Dim MyEncoder As System.Text.Encoding = System.Text.Encoding.Default strArray = MyEncoder.GetBytes(oString) Strlen = strArray.Length Return Strlen End Function

        方法二:
System.Text.Encoding.GetEncoding("GB2312").GetByteCount(strMsg)

  問題:VB6.LoadResPicture("pictureName", VB6.LoadResConstants.ResBitmap)

  方法:Me.BackgroundImage = My.Resources.bmpBCSSTART

  問題:on error ***

  建議:盡量替換成try catch

  問題:背景色

  如果某個按鈕設置了背景色,尤其是在 enter或leave事件中設置背景色,從VB6轉到VB.NET之后,原來沒有設置背景色的按鈕,也會自動添加背景色

  方法:手動搜索代碼,關鍵字“backgroundColor”,然后一一修改

  問題:同樣的字體和字號,在VB6和VB.NET的界面上占的空間大小有細微差別

  方法:把所有界面都檢查一遍

  問題:TAB頁使用了ActiveX控件xxx

  解決:替換成.net中的TAB頁

  問題:Base64編碼與解碼

  方法:

  編碼
Dim x As Byte() x = System.Text.Encoding.ASCII.GetBytes(s) Encrypt = Convert.ToBase64String(x) 解碼

  Dim x As Byte() x = Convert.FromBase64String(s) Decrypt = System.Text.Encoding.ASCII.GetString(x)

        問題:某個對話框框一閃而過

  方法:將Form_Activated中的代碼轉移到Form_load中,將 Form_Activated注釋掉

  問題:將ICO轉為bmp
VB6.ImageToIPictureDisp(VB6.LoadResPicture("ico", 1))

        方法:My.Resources.ico***.ToBitmap()

  問題:窗體居中

  方法:設置窗體的屬性即可

  問題:訪問數據庫時,IsNull()

  方法:isDBNull()

  問題: data report

  方法: 替換成crystal report、RDLC及其他報表控件,需要重寫代碼

  鏈接:http://www.cnblogs.com/ols/archive/2010/03/23/1692297.html

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。( Pfan.cn )

編程愛好者論壇

本欄最新文章

北京快三开奖结果走势图一定牛