Q&A

  • [다시질문]Select Directory Dialog 에서 기본 디렉토리는 설정...


아래 소스는 '팁모아'란의 심동훈(SHIMDH@hitel.net)님께서 올리신

3가지 Select Directory Dialog 입니다.



그런데 루트 폴더는 선택 할 수 있지만

원하는 폴더를 미리 선택해 놓을 수 없어요 (제 실력으론...도무지)

창을 뛰울때마다 마우스로 처음부터 다시 선택할려니 정말 귀찮네요.



좋은 방법이 있으면 좀 알려 주십시요...





//-----------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);

var

Dir : String;

begin

SelectDirectory(Dir,[],0);

ShowMessage(Dir);

end;



//============================================================



procedure TForm1.Button1Click(Sender: TObject);

var

BrowseInfo : TBrowseInfo;

PIDL : PItemIDList;

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

begin

FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);

BrowseInfo.hwndOwner := Handle;

BrowseInfo.pszDisplayName := @DisplayName[0];

BrowseInfo.lpszTitle := 'Select Directory';

BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;

PIDL := SHBrowseForFolder(BrowseInfo);

if Assigned(PIDL) then

if SHGetPathFromIDList(PIDL, DisplayName) then

ShowMessage(DisplayName);

end;



//======================================================================



procedure TForm1.Button1Click(Sender: TObject);

var

BrowseInfo : TBrowseInfo;

PIDL : PItemIDList;

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

begin

FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);

BrowseInfo.hwndOwner := Handle;

BrowseInfo.pszDisplayName := @DisplayName[0];

BrowseInfo.lpszTitle := 'Select Directory';



BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or BIF_EDITBOX or $40;





CoInitialize(NIL);



PIDL := SHBrowseForFolder(BrowseInfo);

if Assigned(PIDL) then

if SHGetPathFromIDList(PIDL, DisplayName) then

ShowMessage(DisplayName);

end;



//==========================================================================





2  COMMENTS
  • Profile
    최용일 2001.03.15 04:44
    안녕하세요. 최용일입니다.



    강좌란에 답변드렸습니다.



    ^^ 항상 즐코하세요...



    김광수 wrote:

    >

    > 아래 소스는 '팁모아'란의 심동훈(SHIMDH@hitel.net)님께서 올리신

    > 3가지 Select Directory Dialog 입니다.

    >

    > 그런데 루트 폴더는 선택 할 수 있지만

    > 원하는 폴더를 미리 선택해 놓을 수 없어요 (제 실력으론...도무지)

    > 창을 뛰울때마다 마우스로 처음부터 다시 선택할려니 정말 귀찮네요.

    >

    > 좋은 방법이 있으면 좀 알려 주십시요...

    >

    >

    > //-----------------------------------------------------------------------

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > Dir : String;

    > begin

    > SelectDirectory(Dir,[],0);

    > ShowMessage(Dir);

    > end;

    >

    > //============================================================

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > BrowseInfo : TBrowseInfo;

    > PIDL : PItemIDList;

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

    > begin

    > FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);

    > BrowseInfo.hwndOwner := Handle;

    > BrowseInfo.pszDisplayName := @DisplayName[0];

    > BrowseInfo.lpszTitle := 'Select Directory';

    > BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;

    > PIDL := SHBrowseForFolder(BrowseInfo);

    > if Assigned(PIDL) then

    > if SHGetPathFromIDList(PIDL, DisplayName) then

    > ShowMessage(DisplayName);

    > end;

    >

    > //======================================================================

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > BrowseInfo : TBrowseInfo;

    > PIDL : PItemIDList;

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

    > begin

    > FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);

    > BrowseInfo.hwndOwner := Handle;

    > BrowseInfo.pszDisplayName := @DisplayName[0];

    > BrowseInfo.lpszTitle := 'Select Directory';

    >

    > BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or BIF_EDITBOX or $40;

    >

    >

    > CoInitialize(NIL);

    >

    > PIDL := SHBrowseForFolder(BrowseInfo);

    > if Assigned(PIDL) then

    > if SHGetPathFromIDList(PIDL, DisplayName) then

    > ShowMessage(DisplayName);

    > end;

    >

    > //==========================================================================

    >

    >

  • Profile
    묻지마다쳐 2001.03.15 04:19
    {이거 한다고 별짓다 했읍니다

    평생안보던 MSDN도 뒤져보고..

    처음 파일 선택 박스에서 선택한 디렉토리의 ItemIDList를 저장하고 있다가

    다음에 띄울때, 사용합니다

    왜 그렇게 했냐고하면

    SHGetPathFromIDList(~~);라는 함수는 ItemIDList에서 디렉토리를 string으로 뽑아오는데

    이거 반대함수를 암만 찾아도 모르것읍니다

    알고 계시면 좀알려주세요..

    어쨌든 이것은 폼위에 버튼을 두번 누르면 됩니다..



    참..그리고 BrowseInfo.idRoot?인가에 디렉토리의 ItemIDList를 집어넣으니깐

    그 디렉토리가 루트인체로 나오더 군요..



    }







    unit Unit1;



    interface



    uses

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

    StdCtrls,comctrls, ShellApi ,ShlObj, ActiveX, ComObj;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure FormDestroy(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;

    pidl: PItemIDList;

    implementation



    function FBoxWindow(HWindow:HWND; Mesg, wParam, lParam:Longint):Longint;stdcall;export;

    begin

    Result := 0;



    case Mesg of



    BFFM_INITIALIZED:

    begin

    MessageBox(Form1.Handle, '떠야 되는데', '캡션', MB_OK);

    if pidl <> nil then

    SendMessage(HWindow, BFFM_SETSELECTION, 0 , Longint(pidl));



    end;

    end;



    Result := DefWindowProc(HWindow, Mesg, wParam, lParam);

    end;









    {$R *.DFM}





    procedure TForm1.FormDestroy(Sender: TObject);

    begin

    if pidl <> nil then

    GlobalFreePtr(pidl);

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin



    pidl := nil;



    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var



    FBrowseInfo: TBrowseInfo;

    Success: Boolean;

    TitleName : string;

    DirPath:string;

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

    begin



    ZeroMemory(@FBrowseInfo, sizeof(FBrowseInfo));

    try

    GetMem(FBrowseInfo.pszDisplayName, MAX_PATH);

    FBrowseInfo.hwndOwner := Handle;

    FBrowseInfo.lpfn := @FBoxWindow;



    TitleName := '디렉토리를 선택해주세요';

    FBrowseInfo.lpszTitle := PChar(TitleName);

    pidl := SHBrowseForFolder(FBrowseInfo);

    if pidl <> nil then

    begin

    Success := SHGetPathFromIDList(pidl, Buffer);

    if Success then

    begin

    DirPath := Buffer;

    if DirPath[Length(DirPath)] <> '' then

    DirPath := DirPath + '';

    end;

    end;

    finally

    if Assigned(FBrowseInfo.pszDisplayName) then

    FreeMem(FBrowseInfo.pszDisplayName, Max_Path);

    end;

    end;



    end.