Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизДиалог дл я выбора директории Найти похожие ветки
← →
Анатолий (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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c