フォルダ選択ダイアログ

Button1のクリックイベントに下記をコーディングします。
下記を実行するとEdit1にフォルダのパスが表示されます。


使用コンポーネント
 
TButton TEdit


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
  Edit1: TEdit;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);

 private
  { Private 宣言 }
 public
  { Public 宣言 }
 end;

 {フォルダの参照ダイアログ用コールバック関数}
 function BrowseCallback(hWnd: HWND; uMsg: UINT; lParam: LPARAM;
  lpData: LPARAM): integer; stdcall; export;
 function OpenFolderDialog(var FolderPath: string):Boolean;

var
 Form1: TForm1;

implementation

{$R *.DFM}

{======================フォルダ選択ダイアログ表示用==================}

{フォルダの参照ダイアログ用コールバック関数}
function BrowseCallback(hWnd: HWND; uMsg: UINT; lParam,
 lpData: LPARAM):integer;
var
 PathName: array[0..MAX_PATH] of Char;
begin
 Result := 0;
 case uMsg of
  {最初に表示するフォルダ}
  BFFM_INITIALIZED:
  begin
   SendMessage(hWnd, BFFM_SETSELECTION,1,LongInt(lpData));
  end;
  {フォルダ参照時にパスを表示}
  BFFM_SELCHANGED:
  begin
   SHGetPathFromIDList(PItemIDList(lParam), PathName);
   SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, LongInt(@PathName));
  end;
 end;
end;


{フォルダ参照ダイアログを開く}
function OpenFolderDialog(var FolderPath: string): Boolean;
var
 Malloc: IMalloc;
 BrowseInfo: TBrowseInfo;
 DisplayPath: array[0..MAX_PATH] of Char;
 IDList: PItemIdList;
 Buffer,pFolderPath: PChar;
begin
 Result := False;
 if Succeeded(SHGetMalloc(Malloc)) then
 begin //IMallocのポインタを取得できたら
  pFolderPath := pChar(FolderPath); //初期フォルダ指定用
  
  {BrowseInfo構造体を初期化}
  with BrowseInfo do
  begin
   hwndOwner := GetForegroundWindow();
   pidlRoot := nil;
   pszDisplayName := DisplayPath;   //表示名用バッファ
   lpszTitle := 'フォルダを選択して下さい。';
   //通常のフォルダのみ参照可能(特殊フォルダは参照できない)
   ulFlags := BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT;
   lpfn := @BrowseCallback; //コールバック関数指定
   lParam := LongInt(pFolderPath); //初期フォルダ指定
   iImage := 0;
  end;

  IDList := SHBrowseForFolder(BrowseInfo);//フォルダ参照ダイアログを表示
  if IDList<>nil then //値が返ってきたら
  begin
   Buffer := Malloc.Alloc(MAX_PATH); //フォルダパス取得用バッファ
   try
    SHGetPathFromIDList(IDList, Buffer);//フォルダパスを取得
    FolderPath := String(Buffer);
   finally
    Malloc.Free(Buffer);
   end;
   Malloc.Free(IDList);
   Result := True;
  end;
 end;
end;
{=======================フォルダ選択ダイアログ表示用====ここまで===}


//参照ボタンクリック
procedure TForm1.Button1Click(Sender: TObject);
var
 Dir: String;
begin
 Dir := 'c:';
 if OpenFolderDialog(Dir) then
  Edit1.Text := Dir;
end;

end.