Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Диалог дл я выбора директории   Найти похожие ветки 

 
Анатолий   (2004-08-19 12:41) [0]

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

Спасибо.


 
VMcL ©   (2004-08-19 13:03) [1]

SHBrowseForFolder()
?


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

Значит, для подумавших, что мне неизвестен 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;
не подходит, потому-что невозможно изменить заголовок, а надо.

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


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

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


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

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


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

Я сделал так:

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;


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



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
14-1094959709
Думкин
2004-09-12 07:28
2004.10.03
С днем рождения! 12 сентября


6-1090141033
mrGrey
2004-07-18 12:57
2004.10.03
Как получить исходник страницы?


4-1093062659
ASoft
2004-08-21 08:30
2004.10.03
Система, GDI...


8-1089582914
d10
2004-07-12 01:55
2004.10.03
Помогите с DirectDraw от JEDI


1-1095691269
Slaga
2004-09-20 18:41
2004.10.03
Создание шаблона набора компонент