VB编程俱乐部

Author: 庞一鸣 Date: 2000年 第16期

  VB编程俱乐部的主力站点终于有了自己的域名和虚拟主机空间,为了方便网友们订阅邮件,开始启用新的在线订阅方式(由China.BuzzCity.com提供),如果你没有收到新的VB论坛电子杂志,请到 http://www.vbforums.net 重新在线订阅。提交问题或解答问题,既可以使用 VBForums@126.com 或 VBForums@bigfoot.com邮件地址,也可以通过访问网站 http://VBForums.yeah.net 在 BBS上讨论来达到。
  问题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调用。在此从略。