VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2003/05/17(Sat) 17:56
投稿者しんじ
Eメール
URL
タイトルRe^2: フォルダの参照ダイアログ

多分APIのコードだとおもいますのでそう予測して記載していますが、
APIだとかなり面倒くさいです。
引数を見れば分かりますが、BROWSEINFO構造体はオーナーフォームのハンドルしか渡せません。

   hwndOwner As Long        'ダイアログボックスの親ウィンドウのハンドル  ← コード内のこの部分

という事はオーナーフォームの中央に表示されるが規定値です。
どうしてもAPIでやるのであれば独自でコールバック関数を作る必要があると思います。

高機能が要らないのであれば花ちゃんさん紹介のページの方法をお勧めします。  → こちらは出来ます。
コードはそのページに記載されているので調べてみて下さい。
ちなみに私はオーナーフォームの中央っていうのが好きなのでAPI使っています。
APIだと設定もいろいろできますしね。

FORMにコマンドボタン一つつけてコード貼り付けて試してみて下さい。
どうやっても中央に表示されない事が分かります。

'-- サンプルコードはフォルダのパスを取得するということ前提にしてください。
'--BASに記載

Declare Function SHBrowseForFolder Lib "shell32.dll" _
    Alias "SHBrowseForFolderA" _
    (lpbi As BROWSEINFO) As Long


'ダイアログボックスを初期化する情報を格納した構造体
Type BROWSEINFO
   hwndOwner As Long        'ダイアログボックスの親ウィンドウのハンドル
   pidlRoot As Long         'ルートフォルダ
   pszDisplayName As String 'ユーザーが選択したフォルダ名
   lpszTitle As String      'ダイアログボックスに表示するメッセージ
   ulFlags As Long          '動作方法を指定する
   lpfn As Long             'コールバック関数へのポインタ
   lParam As Long           'コールバック関数へのパラメータ
   iImage As Long           'フォルダ用アイコンのシステムイメージリストのID
End Type

'ルートフォルダを指定する定数
Public Const CSIDL_DESKTOP = &H0&           'デスクトップ
Public Const CSIDL_PROGRAMS = &H2&          'Windows\プログラム
Public Const CSIDL_CONTROLS = &H3&          'コントロールパネル
Public Const CSIDL_PRINTERS = &H4&          'プリンタ
Public Const CSIDL_PERSONAL = &H5&          'My Documents
Public Const CSIDL_FAVORITES = &H6&         'Favorities
Public Const CSIDL_STARTUP = &H7&           'スタートアップ
Public Const CSIDL_RECENT = &H8&            '最近使ったファイル
Public Const CSIDL_SENDTO = &H9&            '送る
Public Const CSIDL_BITBUCKET = &HA&         'ごみ箱
Public Const CSIDL_STARTMENU = &HB&         'スタートメニュー
Public Const CSIDL_DESKTOPDIRECTORY = &H10& 'Windows\デスクトップ
Public Const CSIDL_DRIVES = &H11&           'マイコンピュータ
Public Const CSIDL_NETWORK = &H12&          'ネットワーク
Public Const CSIDL_NETHOO = &H13&           'Windows\NetHood
Public Const CSIDL_FONTS = &H14&            'Windows\Fonts
Public Const CSIDL_TEMPLATES = &H15&        'Windows\ShellNew

'動作方法を指定する定数
Public Const BIF_RETURNONLYFSDIRS = &H1&        'ディレクトリの選択のみ可能
Public Const BIF_DONTGOBELOWDOMAIN = &H2&       'ネットワークフォルダを含まない
Public Const BIF_STATUSTEXT = &H4&              'ダイアログボックスにステータス表示領域を追加する
Public Const BIF_RETURNFSANCESTORS = &H8&       '親ディレクトリのみを選択可能にする
Public Const BIF_EDITBOX = &H10&                'ダイアログボックス内にアイテム名入力用のテキストボックスを追加する
Public Const BIF_VALIDATE = &H20&               '無効なアイテム名が入力されたときBroeseCallbackProcコールバック関数を呼び出す
Public Const BIF_BROWSEFORCOMPUTER = &H1000&    'コンピュータフォルダのみ選択可能
Public Const BIF_BROWSEFORPRINTER = &H2000&     'プリンタフォルダのみ選択可能
Public Const BIF_BROWSEINCLUDEFILES = &H4000&   'ファイルも表示する

Public Const MAX_PATH = 260                 'フォルダ名の最大長

Declare Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" _
    (ByVal pidl As Long, _
    ByVal pszPath As String) As Long

Declare Function CoTaskMemFree Lib "OLE32.dll" _
    (ByVal pv As Long) As Long

'--どこかのイベントに記載
    Dim udtBROWSEINFO As BROWSEINFO
    Dim lngPidl As Long
    Dim strPath As String * MAX_PATH    '--フォルダ名格納
    Dim rc As Long
    
    Dim strClassName As String
    
    With udtBROWSEINFO
        .hwndOwner = Me.hwnd
        .pidlRoot = CSIDL_DESKTOP
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
    
    '--[フォルダ参照のダイアログを開く]
    lngPidl = SHBrowseForFolder(udtBROWSEINFO)
    
    rc = SHGetPathFromIDList(lngPidl, strPath)
    
    '--処理を記載

    Call CoTaskMemFree(lngPidl)


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -