投稿時間: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)
|