Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Диалог дл я выбора директории [D5]


Анатолий ©   (2004-08-19 12:41:00) 

Посоветуйте апи-функцию какого-нибудь стандартного диалога для выбора директории.

Спасибо.


Анатолий   (2004-08-20 11:07:00) [1]

Я сделал так:

function BrowseCallbackProc(hWnd : HWND; uMsg : UINT; lParam, lpData : LPARAM) : integer;
stdcall;
begin
 case uMsg of
   BFFM_INITIALIZED:
     if lpData > 0 then
       SendMessage(hWnd, BFFM_SETSELECTION, WPARAM(True), lpData);
 end;
 Result := 0;
end;

function CoolSelectDirectory(const Caption: string; var Directory: string): Boolean;
var
 WindowList: Pointer;
 BrowseInfo: TBrowseInfo;
 Buffer: PChar;
 RootItemIDList, ItemIDList: PItemIDList;
 ShellMalloc: IMalloc;
begin
 Result := False;
 FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
 if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
 begin
   Buffer := ShellMalloc.Alloc(MAX_PATH);
   try
     RootItemIDList := nil;
     BrowseInfo.hwndOwner := Application.Handle;
     BrowseInfo.pidlRoot := RootItemIDList;
     BrowseInfo.lpfn := @BrowseCallbackProc;
     BrowseInfo.lParam := LPARAM(Directory);
     BrowseInfo.pszDisplayName := Buffer;
     BrowseInfo.lpszTitle := PChar(Caption);
     BrowseInfo.ulFlags := BIF_EDITBOX or
                           BIF_RETURNONLYFSDIRS;
     WindowList := DisableTaskWindows(0);
     try
       ItemIDList := ShBrowseForFolder(BrowseInfo);
     finally
       EnableTaskWindows(WindowList);
     end;
     Result :=  ItemIDList <> nil;
     if Result then
     begin
       ShGetPathFromIDList(ItemIDList, Buffer);
       ShellMalloc.Free(ItemIDList);
       Directory := Buffer;
     end;
   finally
     ShellMalloc.Free(Buffer);
   end;
 end;
end;


Работает - просто заглядение. Может еще кому пригодится.
Спасибо за советы.


Dimaxx   (2004-08-19 23:10:00) [2]

Посмотреть как сделано в KOL - там все меняется и сохраняется последний выбор.


Dimka-gl   (2004-08-19 21:47:00) [3]

Для задания директории просто используйте SelectDirectory (1 вариант), но параметр Directory - не пустая строка, а сохранённая заранее - это и будет стартовая директория!


Анатолий   (2004-08-19 13:07:00) [4]

Значит, для подумавших, что мне неизвестен SelectDirectory диалог.

Так вот, первый вариант :

function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
не подходит, потому-то не сохраняет последнее выбраное место, а надо.

Второй вариант :

function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
не подходит, потому-что невозможно изменить заголовок, а надо.

Может, есть знающие, как проинитить такой диалог, чтобы при открытии диалога открывалась последняя выбранная директория и можно было задать свой кепшен?


VMcL   (2004-08-19 13:03:00) [5]

SHBrowseForFolder()
?


Наверх

Титульная страница Поиск, карта сайта Написать письмо