VB6做项目如何做整体规划?旧项目如果维护、改进?

Rainee 2003-12-02 11:39:34
偶以前是搞VC的,近期接到一个任务维护一个旧的VB程序,是从VB4作起的,经历了VB4、VB5、VB6,可能是由于以前受限太多,所以现在有如下几点毛病(我认为是毛病,与VC做比较),请各位大侠指点:怎样做最正确、怎样做最适合我的情况

1、使用了很多、相当多的全局变量,并且很多是定义在Modules里面,生存期太长,并且容易发生命名冲突、交叉访问,没有保护级别,交叉使用了也难以发现;

2、变量命名不规范,很多如xpm、ypm、xpm0、ypm0一类的命名,难以记忆,同时VB6的辅助功能似乎也不够,鼠标指向某个变量时无变量类型、注释等信息显示;

3、辅助功能的另一个缺陷就是不支持鼠标中轴,上下翻页时托拽的好辛苦;

4、窗体和Modual命名也不规范,不知道能不能改名;

5、有个Main的入口和一个主Form,Mian调用Form后一直在后台循环,监视两个通讯口状态(据说是防止响应通讯事件的延迟),虽然使用DoEvents,但是CPU资源的占用一直是100%;在VC里常用的方法是使用一个辅助线程“等待”通讯事件,基本上不用担心响应延迟,这里似乎应该也可以这样做,不过水平有限,暂时还没查到相关资料;

6、需要兼容98与2K,不知道需要注意哪些方面?现在偶就知道Sleep在98下不能使用;

7、绘图控件似乎只能操作Interge,而我需要Double操作,最少也是long吧……有效位数不能太少;

8、界面挺难看,没有色彩没有动态窗体,有些Form里使用的背景色灰度还不同;

9、Project窗口里有太多Form,不知道如何把它们分门别类放置,Modules想来也会有类似情况;

10、只有个别几个结构类型,没有类,转换到类体系工作量似乎太大了,心里有点虚;


另外提几个问题:
1、不知道在FormP里定义的Private变量,如何给FormP调用的子FormS使用?

2、如果Form里定义了Public变量,Unload Form后哪些变量是否还存在?如果是其他类型呢?有的书上说Public和Static一样,不理解……

3、无论在哪里自定义一个类型(结构)后,其他地方都可以使用它定义变量么?不需要C++里的头文件或者声明么?

4、如果把这个项目移植到VC.net是否实际:工作量会增加么?兼容性会受影响么?看一些资料提到VC.net的许多新特性,和C++越来越相似了,如可以赋初值(可以使用时才定义)、可以继承类(而不是实现接口)等,感觉蛮亲切的。

5、据说VB调用API容易引发错误,而且On Error无法捕捉到,所以易死机,不知道是否确有其事?

先问这么多了,各位大佬给诊诊吧,谢了先!

...全文
83 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rainee 2003-12-15
  • 打赏
  • 举报
回复
早收到了,给你回复了邮件。

最近出差了一些天,一直没有来这里。
  • 打赏
  • 举报
回复
楼主邮件收到了吗?
Rainee 2003-12-06
  • 打赏
  • 举报
回复
up
firechun 2003-12-06
  • 打赏
  • 举报
回复
改别人的代码的确是个头痛的事,尤其是改不规范的代码,如果工作量太大,我宁愿重写

VB.net中,Main函数仍然可以做为程序的入口,不过在Main函数执行完后,程序也就终止了。
例如在VB6中我们常常这样写
sub main()
init()
frmMain.show
end sub
但是在vb.net中执行完from_load过程,程序就退出了,不是象VB那样继续运行。可以把main函数的代码移到启动窗体的load事件中去,也可以用application.run的方式作为程序的入口点。
firechun 2003-12-05
  • 打赏
  • 举报
回复
最后只有set nothing才能完全销毁,否则,你还是可以引用其公共变量

即使set form2=nothing后,你使用print form2.i仍然是可以的,这时form2被VB自动load了。
nik_Amis 2003-12-05
  • 打赏
  • 举报
回复
2、如果Form里定义了Public变量,Unload Form后哪些变量是否还存在?如果是其他类型呢?有的书上说Public和Static一样,不理解……

Unload From后,From里的变量自然就释放了。demo001说的问题,实际是当你调用print from2.i时,from2已经被load了。也就是说调用一个From中的变量时,如果这个FROM没有被Load,VB会自动先Load它,demo001不妨在From_Load中写一行代码来验证一下。

--------------------------------

楼主已经说了,Set nothing之后,才能完全被销毁,这个说法是对的

不管你
Set o=New Form2
o.show
还是
Form2.show

最后只有set nothing才能完全销毁,否则,你还是可以引用其公共变量






firechun 2003-12-05
  • 打赏
  • 举报
回复
1、使用了很多、相当多的全局变量,并且很多是定义在Modules里面,生存期太长,并且容易发生命名冲突、交叉访问,没有保护级别,交叉使用了也难以发现;

尽量不要在Modules中定义全局变量,对确实需要的,加上注释。对常量,使用Const声明。如果一个From中的变量需要在其它From中调用,可以在这个From中声明一个Public变量,用FromName.变量的方式调用,可以解决命名冲突、交叉访问以及生存期太长(占用内存)的问题

2、变量命名不规范,很多如xpm、ypm、xpm0、ypm0一类的命名,难以记忆,同时VB6的辅助功能似乎也不够,鼠标指向某个变量时无变量类型、注释等信息显示;

VB有自己的命名规范,和C不太一样,如Dim intPos as integer,dim strName as string ,dim blnFlag as boolean等,即范围前缀(m,g)+数组前缀(a)+类型前缀(int,str ...)+变量名,如模块级字符型数组变量:mastrID,全局级整型变量:gintYear,过程级长整型变量:lngX。良好的命名习惯可以减少很多不必要的失误,另外,在From或Modules的第一行加上option explicit(变量使用前必须声明)是一个非常好的习惯。变量、对象、控件的命名规范可以在MSDN中找到。

3、辅助功能的另一个缺陷就是不支持鼠标中轴,上下翻页时托拽的好辛苦;

这个有解决方法。

4、窗体和Modual命名也不规范,不知道能不能改名;

窗体以frm为前缀,模块以mdl为前缀,类模块以cls为前缀。工程建立后,可以改变窗体和模块的名称,但文件名不会改,想连文件名一起改过来,必须另存为。最好的办法是干脆新建一个窗体或模块,用规范的名字命名后把代码粘过来。

5、有个Main的入口和一个主Form,Mian调用Form后一直在后台循环,监视两个通讯口状态(据说是防止响应通讯事件的延迟),虽然使用DoEvents,但是CPU资源的占用一直是100%;在VC里常用的方法是使用一个辅助线程“等待”通讯事件,基本上不用担心响应延迟,这里似乎应该也可以这样做,不过水平有限,暂时还没查到相关资料;

涉及到具体代码,可以发上来大家讨论一下。

6、需要兼容98与2K,不知道需要注意哪些方面?现在偶就知道Sleep在98下不能使用;

VB里有Sleep这个函数吗?

7、绘图控件似乎只能操作Interge,而我需要Double操作,最少也是long吧……有效位数不能太少;

不知道你说的哪个绘图控件,大家讨论一下。

8、界面挺难看,没有色彩没有动态窗体,有些Form里使用的背景色灰度还不同;

VB界面可以做得非常好看,而且也不会比VC麻烦。

9、Project窗口里有太多Form,不知道如何把它们分门别类放置,Modules想来也会有类似情况;

好象没有别的方法吧,呵呵

10、只有个别几个结构类型,没有类,转换到类体系工作量似乎太大了,心里有点虚;

VB支持类,只不过不完全,比如不能重写构造函数,不能继承。

另外提几个问题:
1、不知道在FormP里定义的Private变量,如何给FormP调用的子FormS使用?

Private变量不能在别的窗体中调用

2、如果Form里定义了Public变量,Unload Form后哪些变量是否还存在?如果是其他类型呢?有的书上说Public和Static一样,不理解……

Unload From后,From里的变量自然就释放了。demo001说的问题,实际是当你调用print from2.i时,from2已经被load了。也就是说调用一个From中的变量时,如果这个FROM没有被Load,VB会自动先Load它,demo001不妨在From_Load中写一行代码来验证一下。

3、无论在哪里自定义一个类型(结构)后,其他地方都可以使用它定义变量么?不需要C++里的头文件或者声明么?

必须在模块中声明为public

4、如果把这个项目移植到VC.net是否实际:工作量会增加么?兼容性会受影响么?看一些资料提到VC.net的许多新特性,和C++越来越相似了,如可以赋初值(可以使用时才定义)、可以继承类(而不是实现接口)等,感觉蛮亲切的。

楼主应该说的是VB.net吧?VB.net实际上和VB已经有很大区别了。不知道楼主的这个软件主要是做什么用的,如果包含较多的图形处理的话,还是用vb.net重写吧。VB.net在图形处理上与VB有本质上的区别。除此之外,VB大部分的语句和函数都可以在VB.net中使用,只不过感觉有点不伦不类,你可以用VB.net的VB6升级向导试试,不过估计自己还是要做很多工作。

5、据说VB调用API容易引发错误,而且On Error无法捕捉到,所以易死机,不知道是否确有其事?
on error无法捕捉到API错误。VB调用API只要注意到变量类型的转换、内存的释放等几个地方就行了,没那么可怕的。

本人的一点经验,大家有兴趣共同讨论一下。
demo001 2003-12-05
  • 打赏
  • 举报
回复
另外请教楼主一下

窗体级:

允许定义Dim、Private、Public三种方式,Dim = Private;
生存期从窗体产生到窗体Unload并且窗体名Set nothing为止,仅Unload而未设置Set Form = nothing不能释放变量内存

但是我做了一个测试

form2中一个public变量i

form1中print i

但是在Unload form2并且set form2=nothing 之后仍然可以在form1中pring i

这是为何?

请指教。
yyuj 2003-12-05
  • 打赏
  • 举报
回复
呵呵!有待进步哦!其实很多问题都可以解决!看你怎么做罢了!
demo001 2003-12-05
  • 打赏
  • 举报
回复
而且终日就困扰再这种问题之上,郁闷啊

几乎没什么做正事的时间。
demo001 2003-12-05
  • 打赏
  • 举报
回复
楼主讲的问题正是困扰在下的问题,

与楼主不同的是,在下是今年才毕业学生,没有太多经验

而我的项目负责人,比我早一年毕业,很喜欢“修修补补”,

想在哪加变量就在哪加变量,想起什么名字就起什么名字,没有注释,也没有文档。

程序构架也从不与我商量,甚至不告知。丝毫不考虑我的感受。

很多东西都要靠我自己读源代码来消化体会。

经常会出现楼主讲的第一种错误:
1、使用了很多、相当多的全局变量,并且很多是定义在Modules里面,生存期太长,并且容易发生命名冲突、交叉访问,没有保护级别,交叉使用了也难以发现;


很多时候,讲起来我这种做维护的是比较卑贱的,但是我觉得如果我和他换个位子,

他未必能做得比我更好。



demo001 2003-12-05
  • 打赏
  • 举报
回复
关于鼠标下拉

使用双飞燕的快活林驱动可以解决
featherfly 2003-12-05
  • 打赏
  • 举报
回复
好贴,收藏
Rainee 2003-12-05
  • 打赏
  • 举报
回复
passer_wave(路人) 我的邮箱:rainee@21cn.com

nik_Amis(Azrael)非常感谢,我一直都想不同Global和Public既然作用是一样的,为什么不取其一个呢,原来是为了兼容:)

再次感谢大家的支持!
Rainee 2003-12-05
  • 打赏
  • 举报
回复
安装了鼠标驱动,还是不行:(
Rainee 2003-12-05
  • 打赏
  • 举报
回复
又学到了不少东西:)

to nik_Amis(Azrael)

关于Byref我有了点感觉了,确实大部分情况下都应该使用传值方式,可以防止函数体内意外的内存操作影响原值,只需要在自定义类或结构(体积比较大)和字符串(个人感觉应该是)两种情况下使用。而且VB.net也把函数参数默认的Byref方式变成了默认Byval了。

to firechun(天火)

手误,是准备移植到VB.net的,不过昨天尝试了一下,在项目升级后除了一大堆的未声明变量以外,连Mian入口的Modual都被遗失了,估计会有办法解决的,不过暂时不知道从何处下手,只好在VB6中先完成一些规范化的工作。

你对Form运作的阐述很精辟,受益匪浅。

今天加入了Option Explicit声明,结果一整天都在做定义变量的工作,到现在还没有结束,汗啊……

那个Main里面的循环极度简单,就是DoEvent、判断串口(两个)写缓冲的状态并做处理、Loop,至于是否如上面说的会有延迟,等我完成了“规范”的工作之后实际测试一下吧;

Sleep是指调用API函数,抱歉没有说明;我的意思是如何处理98、2K甚至XP的兼容性,各位有什么经验,前车之辙,后车之鉴嘛;

绘图控件就是那个PictureBox,不过不是Integer,而是Single;主要用它做一些平面的绘图,如果让我重做,可能我会选择使用OpenGL了,不过我可不是OpenGL高手,就想借个项目学习一下罢了:)

to demo001

辛好我的鼠标就是双飞燕,呆会儿试试去。

听你说起你的项目负责人似乎挺有怨气,其实很多地方都会有这种情况,毕竟安排和管理人是很复杂的事情,先做好你手头的工作,有空多学习,早晚有一天你会有机会施展拳脚的。

nik_Amis 2003-12-05
  • 打赏
  • 举报
回复
Rainee(补天)

不过看起来两个函数都应该加上by ref才好,效率比较高。

--------------------------------------------
这个怎么说,你是说按地址方式引用比较快,是这个意思吧
可是通常考虑到封装的概念,对接口的要求会比较严格
我们规范的写法,在不是特殊情况下都要求使用ByVal
nik_Amis 2003-12-05
  • 打赏
  • 举报
回复
firechun(天火)

据我分析,Form2的对象实例和其全局变量不是在一起的
这也就是为什么,你Unload,仍然可以引用Form2.i
要想完全切地地销毁Form2
正确的写法:
Unload Form2
Set Form2=Nothing
这样首先卸载Form2对象,然后销毁Form2数据区

至于你说的Debug.Print Form2.i 仍然是可以的
不错,那是因为Form2重新被实例化,i是重新分配的内存,数值是空的
会自动Initialize,而不是Load
Load事件应该只有再Load Form,Form.Show的时候才触发

所以如果你不Set Nothing仅仅是Unload, 那么全局变量是不被销毁的
你仍然可以引用到Form2里的全局变量(数值不会变的)


说的不对的地方,各位斧正

feilong215 2003-12-04
  • 打赏
  • 举报
回复
收藏
nik_Amis 2003-12-04
  • 打赏
  • 举报
回复
Form也应该看作一个特殊一点的class

至于private ,public ,global,dim ,我是这样理解的

global完全是用于兼容以前的vb4而保留的
我在写程序的时候从来不用的
模块级的边两都用private ,public,而不用dim

至于管理,一般都是

Project Folder
|
+--Form(Folder)
+--Class(Folder)
+--Module(Folder)
+--Projects Relation Files(Like .vbp,.vbg)
+--_Resource(Folder)
| |
| +--Cursor(Folder)
| +--Icon(Folder)
| | +--16x16(Folder)
| | +--32x32(Folder)
| +--Images(Folder)
|
+--_Documents(Folder)
|
+--_History(Folder)
+--_Release(Folder)
|
|


以上仅供参考,一般都会吧_Document等放到上一层的Folder中,在此简单写了


加载更多回复(12)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧