VB6「フォルダの参照」ダイアログを表示する

スポンサーリンク

VB6 では、CommonDialog に FolderBrowserDialog がないので、Win32API の SHBrowseForFolder 関数を使用します。以下のような、クラス モジュールを書きましょう。

サンプルコード

以下にサンプルコードを示します。

VB6.0 以前
'/* FolderBrowserDialog クラス モジュール */
Option Explicit

' SHBrowseForFolder 関数
Private Declare Function SHBrowseForFolder Lib "SHELL32.DLL" Alias "SHBrowseForFolderA" ( _
    ByRef lpBrowseInfo As TypeBrowseInfo _
) As Long

' SHGetPathFromIDList 関数
Private Declare Function SHGetPathFromIDList Lib "SHELL32.DLL" Alias "SHGetPathFromIDListA" ( _
    ByVal pidl    As Long,  _
    ByVal pszPath As String _
) As Long

' CoTaskMemFree 関数
Private Declare Sub CoTaskMemFree Lib "OLE32.DLL" (ByVal pv As Long)

' BrowseInfo 構造体
Private Type TypeBrowseInfo
    OwnerHandle As Long
    Root        As Long
    DisplayName As String
    Description As String
    Flags       As BifOptions
    lpfn        As Long
    lParam      As String
    iImage      As Long
End Type

' FolderBrowseDialog 設定用の列挙体
Private Enum BifOptions
    ReturnOnlyFileSystemDirectories = &H1     ' コントロールパネル・プリンタ・ブリーフケース内は選択不可
    HideNetworkResource             = &H2     ' ネットワーク内のリソースを非表示
    StatusText                      = &H4     ' テキスト文字列を表示 (設定は Callback 関数で行う)
    OnlyNetworkResource             = &H8     ' ネットワーク内のリソースのみ選択可能
    ShowEditBox                     = &H10    ' フォルダ名を編集する TextBox を表示
    Validate                        = &H20    ' 検証を実行する
    NewDialogStyle                  = &H40    ' 新しいフォルダの作成を表示 (Winodws 2000 以降から有効)
    BrowseForComputer               = &H1000  ' ネットワークコンピュータ内のリソースのみ選択可
    BrowseForPrinter                = &H2000  ' ネットワークプリンタのみ選択可
    BrowseIncludeFiles              = &H4000  ' フォルダ内のファイル名も表示 (Windows 98 以降)
End Enum

' プロパティ 変数
Private m_SelectedPath As String
Private BrowseInfo     As TypeBrowseInfo

' SelectedPath - Get
Public Property Get SelectedPath() As String
    SelectedPath = m_SelectedPath
End Property

' SelectedPath - Let
Public Property Let SelectedPath(ByVal value As String)
    m_SelectedPath = value
End Property

' Description - Get
Public Property Get Description() As String
    Description = BrowseInfo.Description
End Property

' Description - Let
Public Property Let Description(ByVal value As String)
    BrowseInfo.Description = value
End Property

' ShowNewFolderButton - Get
Public Property Get ShowNewFolderButton() As Boolean
    ShowNewFolderButton = ((BrowseInfo.Flags And NewDialogStyle) > 0)
End Property

' ShowNewFolderButton - Let
Public Property Let ShowNewFolderButton(ByVal value As Boolean)
    If value Then
        BrowseInfo.Flags = BrowseInfo.Flags Or NewDialogStyle
    Else
        BrowseInfo.Flags = BrowseInfo.Flags And Not NewDialogStyle
    End If
End Property

' コンストラクタ
Private Sub Class_Initialize()
    BrowseInfo.Flags = BrowseInfo.Flags Or NewDialogStyle
End Sub

'「フォルダの参照」ダイアログを表示する
Public Function ShowDialog(Optional ByVal hOwnerHandle As Long = 0&) As Boolean
    Dim lReturn As Long

    ' 親ハンドルを設定する
    BrowseInfo.OwnerHandle = hOwnerHandle

    '「フォルダの参照」ダイアログを呼び出す
    lReturn = SHBrowseForFolder(BrowseInfo)

    ' OK が押下された場合
    If lReturn <> 0 Then
        Dim stPath As String

        stPath = String$(65536, vbNullChar)

        Call SHGetPathFromIDList(lReturn, stPath)
        Call CoTaskMemFree(lReturn)

        Me.SelectedPath = Left$(stPath, InStr(stPath, vbNullChar) - 1)
        ShowDialog = True
    End If
End Function

使用例は以下のようになります。

VB6.0 以前
    ' FolderBrowserDialog クラスの新しいインスタンスを生成する
    Dim cFolderBrowserDialog As FolderBrowserDialog
    Set cFolderBrowserDialog = New FolderBrowserDialog

    ' ダイアログの説明を設定する
    cFolderBrowserDialog.Description = "ここに説明を書いてください"

    ' [新しいフォルダ] ボタンを表示する (初期値 True)
    'cFolderBrowserDialog.ShowNewFolderButton = True

    ' ダイアログを表示し、戻り値が [OK] の場合は、選択したディレクトリを表示する
    If cFolderBrowserDialog.ShowDialog(Me.hWnd) Then
        Call MsgBox(cFolderBrowserDialog.SelectedPath)
    End If

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFolderBrowserDialog = Nothing

関連するリファレンス

準備中です。

スポンサーリンク