VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(23)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10643, 日期:2002-01-28
VB问题全功略(23)

111、您认识 VB 的扩展名吗?
112、完全模拟【开始】中的【运行...】功能
113、模拟【网路上的芳邻】及【我的电脑】中的【连线 / 中断网路磁盘】
114、自制 Round 函数 (取小数点几位)
115、如何找出 Windows 目录的正确路径?
111、您认识 VB 的扩展名吗?

我不知道您已经使用 VB 多久时间了,但是今天当您面对一堆乱七八糟的文件时,您能由扩展名来判断那一个文件是属於 VB 的文件吗?恐怕不是每一个人都可以?

您知道以下这些扩展名都是 VB 指定给【设计阶段文件】的扩展名吗?

扩展名 用於
VB6 VB5 VB4-32 VB4-16 VB3
.bas Basic 模组
* * * * *
.cls 物件类别模组
* * * *  
.ctl 使用者控制项文件
* *      
.ctx 使用者控制项二进位文件
* *      
.dca 现用设计师快取文件
* *      
.dep 安装精灵附属文件
* *      
.dob 使用者文件表单
* *      
.dox 使用者文件二进位表单文件
* *      
.dsr 现用设计师文件
* *      
.dsx 现用设计师二进位文件
* *      
.frm 表单文件
* * * * *
.frx 二进位表单文件
* * * * *
.log 载入错误的记录档
* * * * *
.oca 控制项 Typelib 文件
* * * *  
.pag 属性页文件
* *      
.pgx 二进位属性页文件
* *      
.res 资源档
* * * *  
.swt Visual Basic 安装精灵范本文件
* *      
.tlb Remote Automation Typelib 文件
* *      
.vbg Visual Basic 群组专案
* *      
.vbl 使用者控制项授权文件
* *      
.vbp Visual Basic 专案
* * * *  
.vbr Remote Automation 注册文件
* * * *  
.vbw Visual Basic 专案工作区
* *      
.vbz 精灵启动文件
* * * * *
.wct Webclass 范本文件
*        
.ocx 控制项文件 * * * *  
.vbx 控制项文件       * *
.mak Visual Basic 专案 * * * * *

112、完全模拟【开始】中的【运行...】功能

请您现在按下【开始】中的【运行...】,看看【运行...】问话框中的说明,是不是如下:

请输入程序、资料夹、文件或 Internet 资源的名称,Windows 会自动开启。

如果说您我也可以做到这种功能,只要是可开启的、可执行的,通通可以做到,您相信吗?不要怀疑!不但可以做到,而且更让您惊讶的,是程序竟然这么短,只要一行就可以了!

您一定认为要用 API,喔!不是!先别乱猜,这次不用声明 API!直接来看一个例子:

在 Form 中放一个 TextBox,名称为 Text1

Private Sub Command1_Click()
Call Shell("rundll32.exe url.dll,FileProtocolHandler " & Text1, 1)
End Sub

而其中的 Text1 可以输入程序、资料夹、文件或 Internet 资源的名称,也可以输入快捷方式 (shortcut file),都可以正确执行!

113、模拟【网路上的芳邻】及【我的电脑】中的【连线 / 中断网路磁盘】

在【网路上的芳邻】及【我的电脑】中都有提供【连线网路磁盘】及【中断网路磁盘】的功能,在 VB 的程序中我们一样可以轻易做到。

注释:请在声明区中加入以下声明及模组:

Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long

Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" _
(ByVal lpszName As String, ByVal bForce As Long) As Long

Function AddConnection(MyShareName As String, MyPWD As String, UseLetter As String) As Integer
On Local Error GoTo AddConnection1_Err
AddConnection = WNetAddConnection(MyShareName, MyPWD, UseLetter)

AddConnection_End:
Exit Function

AddConnection1_Err:
AddConnection = Err
MsgBox Error$
Resume AddConnection_End
End Function


Function CancelConnection(DriveLetter As String, Force As Integer) As Integer
On Local Error GoTo CancelConnection_Err
CancelConnection = WNetCancelConnection(DriveLetter, Force)

CancelConnection_End:
Exit Function

CancelConnection_Err:
CancelConnection = Err
MsgBox Error$
Resume CancelConnection_End
End Function

呼叫的方法如下:

连线网路磁盘:传回值 = AddConnection(<共享的路径>, <密码>, <磁盘代号>)

中断网路磁盘:传回值 = CancelConnection(<磁盘代号>, <强迫中断?>)

呼叫实例:

连线网路磁盘:X = AddConnection("\\IO\io_c", "", "H:")

中断网路磁盘:X = CancelConnection("H:", True)

注:这个范例实际执行,连线时,NT 及 Novell 之速度相若,但是,在中断时,Novell 之速度明显较慢!

注:以上的方式乃是由程序中直接指定,另外的一个方法是显示问话框由使用者自行设定,这个方法我们在以后将再说明!

114、自制 Round 函数 (取小数点几位)

这一个问题,有网友反应在某些情形下,会造成误差 ( 连 VB6.0 提供的 Round 函数都会造成误差 ),我针对多种情形实际测试,结果很令人惊讶,让人怀疑如何做才会百分之百完全正确,根据测试结果,我原本想拿掉这个单元,但後来我重新写了一个比较笨,但是在有限小数位数内仍然会正确的式子,可是这个功能只支援小数点,不再支援整数以上的 Round 功能,如下:

注释:传入的参数和之前相同,第一个是要判断的数字,第二个是要取小数几位。

Public Function round(num As Double, pos As Integer) As Double
注释:整数以上不处理
If pos <= 0 Then
round = Format(num, "#")
Exit Function
End If

Dim i As Integer
Dim formatstr As String
注释:拼凑 Format 的格式
formatstr = "#."
For i = 1 To pos
formatstr = formatstr & "0"
Next
round = Format(num, formatstr)
End Function

115、如何找出 Windows 目录的正确路径?

有时候我们在程序中必须用到 Windows 的目录,以存取 Windows 目录下的文件,照理说,这应该是最简单的功能,前提是每个人在 Setup Windows 必须采用 Windows 的预设目录名称,也就是 C:\Windows,但是常常不是这样,有时候由於要使新旧版本共存,或者其他原因,有人会将 Windows 目录改成 c:\win95、c:\win98、Windows95 或 Windows98......

若是程序中必须用到 Windows 目录,要找到正确的路径,做法如下:

注释:在声明区中加入以下声明:

Const MAX_PATH = 260

Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Function GetWinPath()
Dim strFolder As String
Dim lngResult As Long
strFolder = String(MAX_PATH, 0)
lngResult = GetWindowsDirectory(strFolder, MAX_PATH)
If lngResult <> 0 Then
GetWinPath = Left(strFolder, InStr(strFolder, Chr(0)) - 1)
Else
GetWinPath = ""
End If
End Function

注释:在程序中使用方法如下:

Private Sub Command1_Click()
Call MsgBox("您电脑中 Windows 目录的正确路径是: " & GetWinPath, vbInformation)
End Sub