VB编程俱乐部
问题1:我的VB6有许多乱码,应该是VB选择的显示字库有误,我试着寻找VB的配置文件和注册表相应内容,想从中找到默认字库,但一无所获。请问怎么解决?
答:这是VB6的一个Bug,如果安装了VB6然后又安装了IE5的繁体字支持,就会出现这种问题,解决的办法很简单,就是到微软站点下载 VisualStudio6的SP3补丁并安装即可。
问题2:我在VB6中不知怎样发布一个应用程序。VB5中有一个应用程序发布向导,但VB6中没有这个工具。
答:VB6中的发布工具称为“Package & Deployment 向导”,它驻留在VB6建立的程序组中,也可以作为一个 Add Ins 来访问。通过这个打包工具,不但可以发布应用程序,也可以发布COM组件,功能非常强大。
问题3:这段时间我一直在学习DAO及SQL,其间遇到一个问题,产生错误的代码如下:
Set dbRcd2 = db.OpenRecordset(″Select * From [Sygb] Where [bm]=″ & ″′″ & _Dep(Cpoint) & ″′″)
NumTotal = NumTotal + Val(dbRcd2.RecordCount)
Select Case Len(dbRcd1.Fields(0))
Case 2
MsgTitle = MsgTitle & ″部门:″ & dbRcd1.Fields(0) & Space(8) & _
″人数:″ & dbRcd2.RecordCount & vbCrLf
Case 3
...
Case 4
...
End Select
其思路是:希望分部门统计System库中的总人数,并最后予以汇总。上述代码的错误产生在dbRcd2.RecordCount处,dbRcd2.RecordCount总是为1,无论记录集中有多少条记录都是如此。请问计算记录集中记录总数是用.RecordCount方法吗?
答:DAO和ADO的RecordCount 属性与Foxpro中的记录数概念基本一致,但是除非将记录指针移动到记录集的尾部,否则得到的总是错误的记录数。解决的办法有两种:
1.移动指针到记录集的尾部,然后读取 RecordCount 值(这种方法效率较低)
Dbrcd2.MoveLast
NumTotal = NumTotal + Val(dbRcd2.RecordCount)
2.直接采用 Select 命令求出记录数(这种方法效率较高)
Set dbRcd2 = db.OpenRecordset(″Select Count(*) As Num From [Sygb] Where [bm]=″ & ″′″ & _Dep(Cpoint) & ″′″)
NumTotal = NumTotal + dbRcd2(Num)
请在不同的情况下,选择最合适的方法。
问题4:我是一个刚刚开始学 VB 的电脑爱好者,我想问两个问题:
1.怎样让我的程序在没有结束前禁止启动其它程序?
2.怎样让我的程序在Windows启动时自动运行?
答:1.使用App.PrevInstance 来判断程序是否启动了多个实例,代码如下:
If App. PrevInstance <> 0 Then
Msgbox ″这是第二次启动程序,立刻退出″
End
Else
′这是第一次启动程序
End If
2.将你的程序加到Windows的“启动”组中就可以做到。
问题5:如何在Web服务器上用ASP实现普通的绘图功能。简单的画点、画线、画圆、添色、写字?
答:一种方法是选择第三方的ASP绘图组件,另一种方法是自己设计ASP组件来绘图。设计的大致思路是:
1.建立一个 ActiveX DLL,在这个 DLL 中建立一个不可见的Form,在Form上建立一个 PictureBox,你可以在这个PictureBox上画点、线、圆、写字等;
2.调用 WIN API,通过PictureBox 的 HDC 属性,将其上的内容写入文件,然后将这个文件返回给Web浏览者。根据需要,可以将文件保存为JPG一类的格式,不过这需要大量的超过VB能力的编程知识。
3.要点:PictureBox 的 AutoRedraw 和 HasHdc属性一定要设置为 True。根据需要,ActiveX DLL 中的类应该提供画线、点等的方法并使之暴露。
4.在ASP中建立这个组件的实例并调用相应的方法即可,例如:
set obj = Server.CreatObject(″MyCanvas.Canvas″)
Obj.DrawLine ....
Obj.DrawText ...
Obj.SavePictueToFile ″AAAA.BMP″
Set Obj = Nothing
将 BMP 压缩后即可返回给浏览者。
虽然这个方法比较粗糙,效率也低,不过可作为一个实现的思路。
问题6:请问DateEnvironment如何用代码刷新?
答:如果你指的是怎样不刷新数据连接,可以关闭、再打开。例如:
DataEnv.DataConn.Close
DataEnv.DataConn.Open 即可。
问题7:我正在编写一个程序,用户只要按下一个按键就开始处理数据,执行很多代码,包括循环,但如何中途中止代码运行呢 ?
答:如何中断代码是一个看似简单,其实很复杂的问题,如果牵涉到“原子”性的操作更要慎重。可以设置一个全局Boolean变量,例如 bContiue,用于表示是否允许操作继续,在代码运行前为 True,随后打开一个Form,提供一个按钮,在按钮的Click事件中将 bContinue赋值为False,用于中止操作。然后在运行中经常检查该变量是否变为False即可。不过在大量代码的运行中要不断地加入几条 DoEvents 语句,不然按钮就无法接受事件了。
还有第二种方法,就是将这些大量的计算工作放到一个新的线程中运行,由于VB天生的单线程,要实现这个方法需要大量的代码和API调用。在此从略。