来源:百度文库 编辑:神马文学网 时间:2024/04/30 06:32:28
(转)vb拾遗*2
(2009-11-10 19:50:01)转载 标签: vb
杂谈
19.VB制作OCX、DLL控件的问题
以前流行对象封装时,搞了很多的控件,什么都封,
结果后来给客户安装时,老是运行不了主程序,OCX总是出现问题,无论怎么重装,重新注册也还是运行不了,
即使重装windows,一些机子也还是运行不了程序,
OCX在注册方面存在缺陷,所以VB尽量避免制作OCX,否则调试够你头疼的,OCX可以使用用户控件代替,一些无界面的控件可以用模块和类库代替。
如果非要用OCX(比如为了保护源代码的产权),那避免频繁调整接口,调整之后一定要同步升级版本,需要说明的是,微软的COM里每个公开的接口(方法、属性),都有一个接口ID,所以调整方法都要更新接口ID,不更新则接口会维持旧的引用,所以尽量避免频繁修改方法,如果有修改,最好在原来的基础上扩展一个新的方法,而不是直接修改原来的方法,最好发布之后就不再调整控件。
ON ERROR GOTO 0 不同于 on error resume next
Private Sub Form_Load()
on error goto xx
k
exit sub
xx:
MsgBox "Form_Load()"
End Sub
Private Sub k()
On Error GoTo xx
On Error GoTo 0
Dim k As Collection
MsgBox k.Count
Exit Sub
xx:
MsgBox "k()"
End Sub
上面的代码,如果加上 On Error GoTo 0 ,那之前的 On Error GoTo xx 就不再起作用,出错后会继续冒泡的方式上传,
如果之前的是 on error resume next ,再调用 on error goto 0 也会一样,出错不会再继续执行,
所以,on error goto 0 只有当跟在 on error goto label 或者 on error resume next 之后才会起作用,意思是恢复默认的错误处理方式,让on error goto label 或者 on error resume next不起作用:
Private Sub Form_Load()
k
End Sub
Private Sub k()
On Error Resume Next
On Error GoTo 0
Dim k As Collection
MsgBox k.Count
MsgBox Err.Number
Exit Sub
xx:
MsgBox Err.Description
End Sub
ASP下没有
on error goto label 语句,只有 on error resume next,所以ASP下只用过 on erroro resume next
VB下支持 on error goto label ,所以VB里99%是使用 on error goto label,从不使用 on error goto 0,一些特殊情况使用 on error resume next,比如不需要处理错误,而且需要让程序执行完,不管出错与否时,就使用 on error resume next
来源:(http://blog.sina.com.cn/s/blog_4c0c94450100g301.html) - (转)vb拾遗*2_维以不永伤_新浪博客另外对于错误处理,特别是一些分层设计,比如将业务函数封装在类里,错误是在类里处理还是在外面处理,需要作好规定,
过去比较常用的方法就是类里处理完所有错误,然后外面通过返回值来判断是否执行成功,这个可以参考大多数的API以及COM的处理方式,大多遵守这种方式。但这种方式设计不是很好,外面调用需要频繁判断返回值,非常烦琐,忘记判断往往又会导致很多问题,
所以另一种比较好的方法就是类里需要处理错误,将错误预处理一下,处理完后,再将处理的结果继续以错误抛出来,
以前写的那三个错误处理函数就是这种方式,类里处理完错误后再调用 nextError ,将错误继续上传,外面调用的地方,最外层调用者,调用 EndError 结束错误上传,并显示错误。
在一些语言里,类里都没办法MSGBOX,必须得关联到主窗体才行,VB比较灵活一点,太灵活也不是好事,职责要分清
20.VB使用映射表
dim c as new collection
c.add Array("sx","数学"),"sx"
c.add Array("yw","语文"),"yw"
c.add Array("en","英语"),"en"
也可以用对象来代替数组,可读性更好:
Dim x As New Collection
Dim km1 As New CKeMu
km1.KeMuId = "sx"
km1.KeMuMC = "数学"
Call x.Add(km1, km1.KeMuId)
Dim km2 As New CKeMu
km2.KeMuId = "yw"
km2.KeMuMC = "语文"
Call x.Add(km2, km2.KeMuId)
Dim km3 As New CKeMu
km3.KeMuId = "en"
km3.KeMuMC = "英语"
Call x.Add(km3, km3.KeMuId)
类CKeMu就两个属性:
Public KeMuId As String
Public KeMuMC As String
20.VB用集合与数组模拟.NET里的哈希表类型
dim c as new collection
c.add Array("sx","数学"),"sx"
c.add Array("yw","语文"),"yw"
c.add Array("en","英语"),"en"
也可以用对象来代替数组,可读性更好:
Dim x As New Collection
Dim km1 As New CKeMu
km1.KeMuId = "sx"
km1.KeMuMC = "数学"
Call x.Add(km1, km1.KeMuId)
Dim km2 As New CKeMu
km2.KeMuId = "yw"
km2.KeMuMC = "语文"
Call x.Add(km2, km2.KeMuId)
Dim km3 As New CKeMu
km3.KeMuId = "en"
km3.KeMuMC = "英语"
Call x.Add(km3,