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

ここでは、下記の図のように「フォルダの参照」ダイアログを表示します。


■使用するコンポーネント

■使用するAPI関数

■BrowseInfo構造体で使用する定数の説明

ulFlagsの定数

定数
説明
BIF_RETURNONLYFSDIRS 特殊フォルダを表示しない
BIF_DONTGOBELOWDOMAIN 特殊フォルダを表示する
BIF_STATUSTEXT 選択されたフォルダをテキストに表示
BIF_BROWSEINCLUDEFILES 全てのファイルを表示す


pidlRootの定数

定数
フォルダ
CSIDL_DESKTOP デスクトップ
CSIDL_PROGRAMS プログラム
CSIDL_CONTROLS コントロールパネル
CSIDL_PRINTERS プリンタ
CSIDL_PERSONAL My Documents
CSIDL_FAVORITES お気に入り
CSIDL_STARTUP スタートアップ
CSIDL_RECENT Recent
CSIDL_SENDTO SendTo
CSIDL_BITBUCKET ゴミ箱
CSIDL_STARTMENU スタートメニュー
CSIDL_DRIVES マイコンピュータ
CSIDL_NETWORK ネットワークコンピュータ
CSIDL_NETHOOD NetHood
CSIDL_FONTS Fonts
CSIDL_TEMPLATES ShellNew

*必要がないと判断した定数は載せていません。

■その他

■ソースは下記のようになります。追加している所は青色です。

「フォルダの参照」ダイアログを表示する処理
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,ShlObj,ActiveX;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

function BrowseCallbackProc(hWnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer stdCall;

var
Form1: TForm1;
BI : TBrowseInfo;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var

 Memory  : IMalloc;
 Buffer  : PChar;
 Ret, Root : PItemIDList;

begin

  SHGetMalloc(Memory);

  Buffer := Memory.Alloc(MAX_PATH);


//「マイコンピュータ」フォルダの位置を取得する
  SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DRIVES, Root);

//BrowseInfo構造体の初期設定
  BI.hwndOwner    := Form1.Handle;    //親ウインドウのハンドル
  BI.pidlRoot     := Root;        //ルートフォルダ(CSIDL_××)
  BI.ulFlags     := BIF_STATUSTEXT ;   //フォルダのタイプを示すフラグ゙(BIF_××)
  BI.lpszTitle    := 'フォルダの選択';   //タイトル(解説文)
  BI.pszDisplayName := Buffer;       //(戻り値)フォルダ名
  BI.lpfn       := BrowseCallbackProc;
//コールバック関数のエントリポイント

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

  Ret := SHBrowseForFolder(BI);

//ITEMIDLIST構造体からパス名を取り出す

  if SHGetPathFromIDList(Ret, Buffer) then ShowMessage(Buffer);

//メモリの解放
  Memory.Free(Ret);
  Memory.Free(Root);
  Memory.Free(Buffer);


end;

function BrowseCallbackProc(hWnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer;

var
 Path: array[0..65536] of Char;

begin

//BIF_STATUSTEXT以外は何もしない。
 if BI.ulFlags=BIF_STATUSTEXT then
 
begin

  //ユーザーがフォルダを変更した時
   if uMsg = BFFM_SELCHANGED then
   begin

    //ITEMIDLIST構造体からパス名を取り出す
     SHGetPathFromIDList(PItemIDList(lParam), Path);

    //変更されたフォルダのパスを表示する
     SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, LongInt(String(Path)));

   end;

 end;

 Result:= 0;


end;

end.





Win32APIのページへ



ホーム PV ランキング