|
|
||||
Tips > |
|||||
フォルダ選択ダイアログ(SHBrowseForFolder) |
更新 : 2010/06/04 |
||||
|
|
||
解説: ファイルを開きたいときは、OpenDialog を使いますが、フォルダを指定したい時はどうすればいいでしょう? VCL には該当する関数がありません(※)ので、Win32API の SHBrowseForFolder 関数を使います。この関数は、フォルダが選べるダイアログを表示してくれます(拡張したい方はこちらを参照)。 表示時、初期のフォルダを指定したり、メッセージを変えたりできますので、やり方を覚えておくと大変役に立ちます。 ※実は VCL にも SelectDirectory という関数があります。ちょっと使い勝手は悪いのですが、ヘルプにも出ています。調べてみてください。 使用例: 単純に、フォルダ選択ダイアログを表示するコードです。 コンポーネントは、 Button と Label を適当に配置して終わりです。 プロパティの設定は特にありません。 コードも OnClick に記述するだけです。 流れとしては、構造体 info に各情報を代入して、それを元に SHBrowseForFolder 関数でフォルダ選択ダイアログを表示しています。 フォルダ選択ダイアログから取得したフォルダ名は、Label に代入しています。 ちょっと寄り道: 今回使っている構造体の変数には、以下の値を代入します。 hwndOwner // フォルダ選択ダイアログのオーナーウィンドウ。 pszDisplayName // 選択されたアイテムの表示名を格納するバッファのアドレス。 lpszTitle // ツリービューコントロールの上部に表示される文字列のアドレス。 ulFlags // オプションフラグ。 オプションフラグを変更して動きを見ておいてください。 #include <windowsx.h> #include <shlobj.h> //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // SHBrowseForFolder 関数で使用されるパラメータを格納 BROWSEINFO info; char path[MAX_PATH]; char folder[MAX_PATH]; // ルートにする ITEMIDLIST のポインタ LPITEMIDLIST item; // 構造体クリア memset(&info, 0, sizeof(BROWSEINFO)); info.hwndOwner = Handle; info.pszDisplayName = folder; info.lpszTitle = "フォルダを選択してください"; info.ulFlags = BIF_RETURNONLYFSDIRS; // フォルダ選択ダイアログ表示 item = SHBrowseForFolder(&info); if (item) { // アイテム ID リストをファイルシステムのパス名に変換します。 SHGetPathFromIDList(item, path); // アイテム ID リスト領域開放 GlobalFreePtr(item); Label1->Caption = path; } } //------------------------------------------------------------------- ※再構築が失敗する場合は、掲示板 16 の [149]-[150] を参考にしてください。 |