如果选择了多个文件,则Filename属性返回值格式为”路径_文件名1_文件名2_…”(_为字符Chr$(0))。举一个例子,如果我们选择C:\1.txt文件,那么Filename=”C:\1.txt”;而同时选择了C:\1.txt和C:\2.txt两个文件后,则Filename=”C:\ 1.txt 2.txt”。我们要获取所选择文件的文件名,就必须对Filename字符串进行分离。@H_403_2@
分离的思路大致如下:先得到所选择文件的路径,然后将其从Filename字符串中去除,这样就只剩下了文件名。而这些文件名又有字符Chr$(0)分隔,剩下的就很好办了,即便文件名中有空格(Chr$(32)),也能正确的实现分离。@H_403_2@
所以,现在关键的问题是如何获取所选择文件的路径。VB中有一个内建的函数CurDir(),它能返回当前的路径。在CommonDialog中改变路径会产生PathChange事件,这也将同时改变CurDir()函数的值,使其始终指向被选择的路径。因此,我们使用CruDir()函数就能正确得到所选择文件的路径。但要注意,这个操作必须在下次PathChange事件发生之前调用,否则其值会随之而改变。建议在CommonDialog的ShowOpen方法之后立即调用。@H_403_2@
同时需要注意的是,用CurDir()函数获取路径时,如果是根目录,则最后一个字符为“\”,不是根目录时则没有。例如,如果当前的路径为C:\,那么CurDir()=”C:\”;而当前路径为C:\Pwin95时,CurDir()=”C:\Pwin95”,这就需要在程序中加以区别。@H_403_2@
下面就是实现的过程。@H_403_2@
1. 先新建一个工程@H_403_2@
2. 从菜单“工程/添加模块”中添加一个新模块Moudle1,并在模块中输入如下代码:@H_403_2@
Option Explicit@H_403_2@
Type DlgFileInfo@H_403_2@
@H_403_2@
sPath As String@H_403_2@
sFile() As String@H_403_2@
End Type@H_403_2@
'功能:@H_403_2@
'参数说明:@H_403_2@
'函数类型:@H_403_2@
‘ 择文件的路径,sFile()返回所选择文件的文件名(不包括路径)@H_403_2@
'注意事项:@H_403_2@
Public Function GetDlgFileInfo(strFilename As String) As DlgFileInfo@H_403_2@
Dim sPath,tmpStr As String@H_403_2@
Dim sFile() As String@H_403_2@
Dim iCount As Integer@H_403_2@
@H_403_2@
Dim I As Integer@H_403_2@@H_403_2@
On Error GoTo ErrHandle@H_403_2@
@H_403_2@
sPath = CurDir()@H_403_2@
If Left$(tmpStr,1) = Chr$(0) Then@H_403_2@
'选择了多个文件(分离后第一个字符为Chr$(0))@H_403_2@
For I = 1 To Len(tmpStr)@H_403_2@
If Mid$(tmpStr,I,123)">iCount = iCount + 1@H_403_2@
ReDim Preserve sFile(iCount)@H_403_2@
Else@H_403_2@
sFile(iCount) = sFile(iCount) & Mid$(tmpStr,1)@H_403_2@
End If@H_403_2@
Next I@H_403_2@
'只选择了一个文件(注意:根目录下的文件名除去路径后左边没有"\")@H_403_2@
iCount = 1@H_403_2@
403_2@
sFile(iCount) = tmpStr@H_403_2@
GetDlgFileInfo.iCount = iCount@H_403_2@
ReDim GetDlgFileInfo.sFile(iCount)@H_403_2@
If Right$(sPath,1) <> "\" Then sPath = sPath & "\"@H_403_2@
GetDlgFileInfo.sPath = sPath@H_403_2@
For I = 1 To iCount@H_403_2@
GetDlgFileInfo.sFile(I) = sFile(I)@H_403_2@
Exit Function@H_403_2@
ErrHandle:@H_403_2@
MsgBox "GetDlgFileInfo函数执行错误!",vbOKOnly + vbCritical,"自定义函数错误"@H_403_2@
End Function@H_403_2@
这样,我们就生成了一个能实现获取CommonDialog所选择文件信息的函数GetDlgFileInfo,可以在程序中方便的调用。@H_403_2@
3.在窗体上放置一个列表框List1,一个个按钮Command1,一个标示框Label1和一个公共对话框CommonDialog1(这需要先在菜单“工程/部件”中标记“Microsoft Common Dialog Control 5.0”控件),并设置如下属性:Label1.AutoSize=True、Label1.Caption=”选择的文件:”、Command1.Caption=”选择文件”。具体布局如图:@H_403_2@
在Command1_Click事件中添加代码:@H_403_2@
Private Sub Command1_Click()@H_403_2@
Dim DlgInfo As DlgFileInfo@H_403_2@
Dim I As Integer@H_403_2@
'清除List1中的项@H_403_2@
List1.Clear@H_403_2@
'选择文件@H_403_2@
With CommonDialog1@H_403_2@
.CancelError = True@H_403_2@
.MaxFileSize = 32767 '被打开的文件名尺寸设置为最大,即32K@H_403_2@
.Flags = cdlOFNHideReadOnly Or cdlOFNAllowMultiselect Or cdlOFNExplorer@H_403_2@
.DialogTitle = "选择文件"@H_403_2@
.Filter = "所有类型的文件(*.*)|*.*"@H_403_2@
.ShowOpen@H_403_2@
DlgInfo = GetDlgFileInfo(.filename)@H_403_2@
End With@H_403_2@
For I = 1 To DlgInfo.iCount@H_403_2@
List1.AddItem DlgInfo.sPath & DlgInfo.sFile(I)@H_403_2@
Exit Sub@H_403_2@
' 按了“取消”按钮@H_403_2@
End Sub@H_403_2@
好了,运行工程试一试,效果怎么样?@H_403_2@
你也可以将模块文件(*.bas)添加到你自己的工程中,这样你也能在你自己的程序中调用GetDlgFileInfo函数来实现用CommonDialog选取多个文件的功能了!@H_403_2@
(以上的程序均在P133+64M+Pwin95 OSR2+VB5简体中文专业版中调试通过。@H_403_2@@H_403_2@ @H_403_2@