Q&A

  • SHBrowseForFolder에 대해
안녕하세요. 요즘 맨날 질문만 하는군요.

질문의 내용이 어려워서인지 답변을 구하기가 힘드네요.



아래 코드는 윈도우즈의 '폴더찾아보기' 대화상자를 표시하는 건데

대화상자가 표시는 잘 되는데 선택할 폴더를 에디트에 나타내고

싶은데 에러가 나네요. 도움 부탁드립니다.



uses

Shlobj, ShellAPI, .....;





procedure TMainForm.ToolButton3Click(Sender: TObject);

var

BrowseInfo: TBrowseInfo;

DisplayName: array[0..MAX_PATH] of char;

idBrowse : PItemIDList;

tmp : PChar;

begin

with BrowseInfo do begin

hWndOwner:=MainForm.Handle;

pidlRoot:=nil;

pszDisplayName:= DisplayName;

lpszTitle:='스캔할 폴더를 고르세요';

ulFlags:=BIF_RETURNONLYFSDIRS;

lpfn:=nil;

lParam:=0;

end;

idBrowse:=SHBrowseForFolder(@BrowseInfo);

// 이부분이 문제인거 같은데....

if assigned(idBrowse) then

Begin

SHGetPathFromIDList(idBrowse,tmp);

// 이부분하구...

EditPath.Text:=StrPas(tmp);

end;

end;

1  COMMENTS
  • Profile
    김영대 1999.07.28 01:52
    박홍석 께서 말씀하시기를...

    > 안녕하세요. 요즘 맨날 질문만 하는군요.

    > 질문의 내용이 어려워서인지 답변을 구하기가 힘드네요.

    >

    > 아래 코드는 윈도우즈의 '폴더찾아보기' 대화상자를 표시하는 건데

    > 대화상자가 표시는 잘 되는데 선택할 폴더를 에디트에 나타내고

    > 싶은데 에러가 나네요. 도움 부탁드립니다.

    >

    > uses

    > Shlobj, ShellAPI, .....;

    >

    >

    > procedure TMainForm.ToolButton3Click(Sender: TObject);

    > var

    > BrowseInfo: TBrowseInfo;

    > DisplayName: array[0..MAX_PATH] of char;

    > idBrowse : PItemIDList;

    > tmp : PChar;

    > begin

    > with BrowseInfo do begin

    > hWndOwner:=MainForm.Handle;

    > pidlRoot:=nil;

    > pszDisplayName:= DisplayName;

    > lpszTitle:='스캔할 폴더를 고르세요';

    > ulFlags:=BIF_RETURNONLYFSDIRS;

    > lpfn:=nil;

    > lParam:=0;

    > end;

    > idBrowse:=SHBrowseForFolder(@BrowseInfo);

    > // 이부분이 문제인거 같은데....

    > if assigned(idBrowse) then

    > Begin

    > SHGetPathFromIDList(idBrowse,tmp);

    > // 이부분하구...

    > EditPath.Text:=StrPas(tmp);

    > end;

    > end;



    아래 소스를 참고해 보세요



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ShlObj;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    procedure TForm1.Button1Click(Sender: TObject);

    var

    inf : TBrowseInfo;

    hsl : PItemIDList;

    buff : array[0..255] of char;

    buff2: array[0..255] of char;

    FDisplayName, FActualPath: String;

    begin

    inf.hwndOwner := 0;

    inf.lpfn := nil;

    inf.pidlRoot := nil; // always point to Desktop

    inf.pszDisplayName := buff;

    inf.lpszTitle := '폴더를 선택하세요';

    inf.ulFlags := inf.ulFlags or BIF_BROWSEFORCOMPUTER;

    hsl :=SHBrowseForFolder(inf);

    if hsl <> nil then

    FDisplayName := string(buff)

    else

    FActualPath :='';



    if SHGetPathFromIDList(hsl,buff2) then

    FActualPath := string(buff2)

    else

    FActualPath :='';



    showmessage(FDisplayName);

    showmessage(FActualPath);

    end;



    end.