안녕하세요. 요즘 맨날 질문만 하는군요.
질문의 내용이 어려워서인지 답변을 구하기가 힘드네요.
아래 코드는 윈도우즈의 '폴더찾아보기' 대화상자를 표시하는 건데
대화상자가 표시는 잘 되는데 선택할 폴더를 에디트에 나타내고
싶은데 에러가 나네요. 도움 부탁드립니다.
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;
> 안녕하세요. 요즘 맨날 질문만 하는군요.
> 질문의 내용이 어려워서인지 답변을 구하기가 힘드네요.
>
> 아래 코드는 윈도우즈의 '폴더찾아보기' 대화상자를 표시하는 건데
> 대화상자가 표시는 잘 되는데 선택할 폴더를 에디트에 나타내고
> 싶은데 에러가 나네요. 도움 부탁드립니다.
>
> 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.