VB编程俱乐部
大家好,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查得。(杨光宏 提供解答)