VB的“问与答”

Author: 小敏 Date: 1998年 第18期 13版

  作为一个VB爱好者,一个人在黑暗中摸索真是太累了。现将我摸索的一些心得贡献给大家,希望起抛砖引玉的作用(我用的是VISUAL BASIC 5.0中文版)。
  1.问题:有一程序含有两个Form,其中Form2的Picture属性为一张BMP位图,而以下是Form1显示Form2的程序:
  Form2.Show
  '延迟2秒
  Time1=Timer
  While Timer-Time1<2
  Wend
  以上程序的目的是希望显示Form2的图片两秒之后,Form1才继续执行,结果竟然是2秒之后,Form2的图片才显示出来。为什么图片会延迟显示呢?
  回答:一般而言,绘图会比一般的指令费时,因此,绘图指令的优先级较低,也就是说,直到其他指令都执行完毕之后,才会轮到绘图指令的执行,在以上的Form1程序中,由于Form2.Show之后,又执行了一个费时2秒的While循环,因此,Form2的图片必须等待2秒钟,才会被描绘出来。
  可按如下方法解决:
  在While循环中增加DoEvents,如下:
  Form2.Show
  '延迟2秒
  Time1=Timer
  While Timer-Time1<2
  DoEvents
  Wend
  DoEvents的作用是短暂地停止执行,使得优先级较低的绘图指令被执行,于是Form2的图片便可以在While循环执行的阶段就被显示出来。
  2.问题:在编数据库程序时,根据帮助来声明变量,如下:
  Dim    db    As    Database
  Dim    rs    As    Recordset
  结果程序编译时VB竟然说“用户定义类型未定义”,是何原因呢?
  回答:Database及Recordset属于DAO(Data Access Object)模块里的,不是VB内定的,因此必须将DAO的定义包含在“引用中”,VB才会认得Database及Recordset,操作方法是选取功能表的“工程(P)...”,待出现“引用(N)...”窗时,再选取Microsoft DAO 3.0 Object Library或Microsoft DAO 2.5/3.0 Compatibility Library(兼容Access 2.0以前的版本)。(如果使用的是16位版本的VB,则选取Microsoft DAO 2.5 Object Library)
  3.问题:我想控制I/O,VB是否有类似Quick    BASIC的INP、OUT指令可使用?
  回答:VB并无INP及OUT的指令可用,即使是Windows的API函数也没有类似的函数,原因是Windows不希望应用程序直接控制硬件。如果想控制RS232的通讯口,则VB专业版(或企业版)有现成的“MSComm”控件可用。
  4.问题:如何创建椭圆形的窗体?
  回答:当然是用Win32 API函数了,用VB5.0中文版的API文本查看器将下列API函数加入窗体的通用代码中,就可以做一个椭圆窗口。
  Private Declare Function CreateEllipticRgn Lib ″gdi32″(ByVal X1 As Long,ByVal Y1 As Long,ByVal X2 As Long,ByVal Y2 As Long)As Long
  Private Declare Function SetWindowRgn Lib ″user32″(ByVal hWnd As Long,ByVal hRgn As Long,ByVal bRedraw As Boolean)As Long
  在Form_Load()窗体中加入如下代码:
  Private Sub Form_Load()
  Show
  SetWindowRgn hWnd,CreateEllipticRgn(0,0,300,200),True
  End Sub
  上述代码可以创建一个椭圆形状的窗口。