VB编程俱乐部

Author: 庞一鸣 Date: 1999年 第42期 13版


  大家好,VB编程俱乐部又与大家见面了,欢迎大家积极参与进来。提交问题或解答问题,既可使用 VBForums@126.com 或 VBForums@bigfoot.com邮件地址,也可以通过访问网站 http://VBForums.yeah.net 在 BBS板上讨论来达到。订阅VBForums请向 sub-vbforums@e-lists.lawton.com.cn 发送一封空白信即可。
  问题1:制作一个帮助文件如wangqr.hlp并采用帮助菜单来访问,如何在vb程序中实现?
  答:在窗体上放一CommonDialog控件,在菜单 Click 代码中写入:
  CommonDialog1.HelpFile = ″路径和帮助文件名称″
  CommonDialog1.HelpCommand = cdlHelpContents 
  ′列出帮助主题,若为cdlHelpPartialKey则为列出搜索项目列表。
  CommonDialog1.ShowHelp
  问题2:我原来的程序是在VB5中作的,用了DBGRID控件,但在VB6中没有这个控件,我想把程序从VB5升级到VB6,我先把DBGRID32.OCX,DBGRID32.DEF拷到Windows/System32/下,然后注册,当用到这个控件时,提示“该部件的许可信息没有找到,在设计环境中,没有合适的许可证使用该功能”。为什么?请问该怎么做?
  答:解决方法有两种,其一、可以先安装VB5,再安装VB6即可;其二、也可以将VB5下的dbgrid32.reg和dbgrid32.ocx等文件复制到Windows\System下,运行dbgrid32.reg进行注册,最后在VB6下引用即可。
  问题3: 如何用Dir()函数列出C:\下所有*.TMP文件,并且用文本框输出?
  答:下面是一个列出指定目录下所有符合要求的文件名的函数:
  Public Function AutoListFiles(ByVal sDirName As String,ByVal FileFilter As String ) As Boolean
  On Error GoTo RF_ERROR
  Dim sName As String, sFile As String, sExt As String
  Dim sDirList() As String, iDirNum As Integer, i As Integer
  ′首先枚举所有文件
  sFile = Dir(sDirName + FileFilter, vbNormal + vbArchive + vbHidden)
  Do While Len(sFile) >0
  sFile = UCase(Trim(sFile))
  ′在此处可以将 sFile 加入到一个 Text 控件...
  sFile = Dir  ′下一个文件
  Loop
  iDirNum = 0
  sName = Dir(sDirName + ″*.*″, vbDirectory + vbNormal)
  Do While Len(sName) >0
  If sName <> ″.″ And sName <> ″..″ Then
  iDirNum = iDirNum + 1
  ReDim Preserve sDirList(1 To iDirNum)
  sDirList(iDirNum) = sDirName + sName + ″\″
  End If
  sName = Dir  ′下一个目录
  Loop
  For i = 1 To iDirNum
  AutoListFiles sDirList(i) ′递归调用
  Next
  End If
  RF_EXIT:
  AutoListFiles = True
  Exit Function
  RF_ERROR:
  MsgBox Err.Description, vbCritical, ″″
  Resume RF_EXIT
  End Function
  调用上述函数的示例:
  AutoListFiles(″C:\″,″*.TMP″)
  之所以采用上述先处理文件,再处理子目录,一是思路较清晰,另外也有模仿 Prolog 语言中的“尾递归”的想法,当然,VB中是不支持尾递归的。
  问题4:请问怎样才能实现重启系统?是用shell″rundll32.exe user.exe,restartwindows″吗?为什么会提示user.exe出错,restartwindows项目丢失?
  答:请首先在模块中增加以下说明:
  Public Const EWX_LOGOFF = 0 
  Public Const EWX_SHUTDOWN = 1 
  Public Const EWX_REBOOT = 2 
  Public Const EWX_FORCE = 4 
  Declare Function ExitWindowsEx Lib ″user32″ Alias ″ExitWindowsEx″ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long 
  ′如果想强制重新启动计算机,函数应该这样使用:
  t& = ExitWindowsEx(EWX_FORCE OR EWX_REBOOT, 0)
  (魏霄鹏 提供解答)
  问题5:怎样在软件中设定热键呢?就像抓图软件一样,无论窗体活不活动只要按下热键就可执行一定功能。
  答:可以用API,在Form中加入
  Private Declare Function GetAsyncKeyState Lib ″user32″ Alias ″GetAsyncKeyState″ (Byval vkey as Long) as integer
  Private Function MyHotKey(vKeyCode) As Boolean
  MyHotKey=((GetAsyncKeyState(vKeyCode)<0)
  End Function
  然后在循环中或Timer的Timer事件中检测:
  If myHotKey(vbkeyA) then .....
  其中vbkeyA是键盘″A″的常数,其他键可按F1查得。(杨光宏 提供解答)