zoukankan      html  css  js  c++  java
  • CommonDialog中同时打开多个文件实现(转)

     在Visual Basic中,通常用CommonDialog公共对话框来选择磁盘上的文件,在其Flags属性中加上cdlOFNAllowMultiselect风 格后,就允许选择多个文件。当只选择一个文件时,其文件名(包含路径)直接返回Filename属性,那么选择多个文件时呢?
    如果选择了多个文件,则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字符串进行分离。
    分离的思路大致如下:先得到所选择文件的路径,然后将其从Filename字符串中去除,这样就只剩下了文件名。而这些文件名又有字符Chr$(0)分隔,剩下的就很好办了,即便文件名中有空格(Chr$(32)),也能正确的实现分离。
    所以,现在关键的问题是如何获取所选择文件的路径。VB中有一个内建的函数CurDir(),它能返回当前的路径。在CommonDialog中改变路径 会产生PathChange事件,这也将同时改变CurDir()函数的值,使其始终指向被选择的路径。因此,我们使用CruDir()函数就能正确得到 所选择文件的路径。但要注意,这个操作必须在下次PathChange事件发生之前调用,否则其值会随之而改变。建议在CommonDialog的 ShowOpen方法之后立即调用。
    同时需要注意的是,用CurDir()函数获取路径时,如果是根目录,则最后一个字符为“/”,不是根目录时则没有。例如,如果当前的路径为C:/,那么 CurDir()=”C:/”;而当前路径为C:/Pwin95时,CurDir()=”C:/Pwin95”,这就需要在程序中加以区别。
    下面就是实现的过程。
    1. 先新建一个工程
    2. 从菜单“工程/添加模块”中添加一个新模块Moudle1,并在模块中输入如下代码:
    Option Explicit

    Type DlgFileInfo
        iCount As Long
        sPath As String
        sFile() As String
    End Type

    '功能:     返回CommonDialog所选择的文件数量、路径和文件名
    '参数说明:   strFileName为CommonDialog的Filename属性
    '函数类型:   DlgFileInfo。这是一个自定义类型,其中iCount返回所选择文件的个数,sPath返回所选
    ‘ 择文件的路径,sFile()返回所选择文件的文件名(不包括路径)
    '注意事项:   该函数应在CommonDialog.ShowOpen方法后立即使用,以免当前路径被更改

    Public Function GetDlgFileInfo(strFilename As String) As DlgFileInfo
        
        Dim sPath, tmpStr As String
        Dim sFile() As String
        Dim iCount As Integer
        Dim I As Integer
    On Error GoTo ErrHandle
        
        sPath = CurDir()  
        tmpStr = Right$(strFilename, Len(strFilename) - Len(sPath)) '将文件名与路径分离
        
        If Left$(tmpStr, 1) = Chr$(0) Then
            '选择了多个文件(分离后第一个字符为Chr$(0))
            For I = 1 To Len(tmpStr)
                If Mid$(tmpStr, I, 1) = Chr$(0) Then
                    iCount = iCount + 1
                    ReDim Preserve sFile(iCount)
                Else
                    sFile(iCount) = sFile(iCount) & Mid$(tmpStr, I, 1)
                End If
            Next I
        Else
            '只选择了一个文件(注意:根目录下的文件名除去路径后左边没有"/")
            iCount = 1
            ReDim Preserve sFile(iCount)
            If Left$(tmpStr, 1) = "/" Then tmpStr = Right$(tmpStr, Len(tmpStr) - 1)
            sFile(iCount) = tmpStr
        End If
        
        GetDlgFileInfo.iCount = iCount
        ReDim GetDlgFileInfo.sFile(iCount)
        
        If Right$(sPath, 1) <> "/" Then sPath = sPath & "/"
        GetDlgFileInfo.sPath = sPath
        
        For I = 1 To iCount
            GetDlgFileInfo.sFile(I) = sFile(I)
        Next I
        
        Exit Function
    
    ErrHandle:
        MsgBox "GetDlgFileInfo函数执行错误!", vbOKOnly + vbCritical, "自定义函数错误"
    
    End Function



    这样,我们就生成了一个能实现获取CommonDialog所选择文件信息的函数GetDlgFileInfo,可以在程序中方便的调用。
    3.在窗体上放置一个列表框List1,一个个按钮Command1,一个标示框Label1和一个公共对话框CommonDialog1(这需要先在菜单“工程/部件”中标记“Microsoft Common Dialog Control 5.0”控件),并设置如下属性:Label1.AutoSize=True、Label1.Caption=”选择的文件:”、Command1.Caption=”选择文件”。具体布局如图:


    在Command1_Click事件中添加代码:

    Private Sub Command1_Click()
        
        Dim DlgInfo As DlgFileInfo
    Dim I As Integer
    
        '清除List1中的项
        List1.Clear
        
        '选择文件
        With CommonDialog1
            .CancelError = True
            .MaxFileSize = 32767 '被打开的文件名尺寸设置为最大,即32K
            .Flags = cdlOFNHideReadOnly Or cdlOFNAllowMultiselect Or cdlOFNExplorer
            .DialogTitle = "选择文件"
            .Filter = "所有类型的文件(*.*)|*.*"
            .ShowOpen
            DlgInfo = GetDlgFileInfo(.filename)
        End With
        
        For I = 1 To DlgInfo.iCount
            List1.AddItem DlgInfo.sPath & DlgInfo.sFile(I)
        Next I
    Exit Sub
    
    ErrHandle:
        ' 按了“取消”按钮
    
    End Sub



    好了,运行工程试一试,效果怎么样?
    你也可以将模块文件(*.bas)添加到你自己的工程中,这样你也能在你自己的程序中调用GetDlgFileInfo函数来实现用CommonDialog选取多个文件的功能了!

  • 相关阅读:
    将centos_yum源更换为阿里云(官方文档)
    JIRA 破解文件研究(Win 7环境)
    告别拖延症,你也可以轻松做到
    VS2015 + EF6连接MYSQL
    start-stop-daemon
    stm32开发板无法正常写入的问题或者写入后无法正常运行的问题
    进制转换
    回文判断程序
    C语言结构体指针的引用问题
    升级/安装主题插件提示权限不足 输入FTP解决办法
  • 原文地址:https://www.cnblogs.com/tianshuilv/p/4001411.html
Copyright © 2011-2022 走看看