ホーム
| アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


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] を参考にしてください。



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.