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. |