首页 | 社区 | 博客 | 招聘 | 文章 | bet365足球场 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

老生常谈:从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 )

编程爱好者论坛

本栏最新文章