![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Browse For Folder Dialog [D7, WinXP]
Dementiy © (2005-11-10 03:59:00)в дельфе нет нормального диалога выбора папки, все чем она располагает это SelectDirectory(....). Но это такой древний интерфейс, что даже неприятно его лицезреть, особенно иконки. В общем в результате поисков нашел следующий код
{ TBrowseFolderDlg }
function TBrowseFolderDlg.BrowseFolder(title: PChar; h: hwnd): String;
var lpItemID: PItemIDList;
path: array[0..Max_path] of char; //выбранная папка
BrowseInfo: TBrowseInfo; //настройки диалога
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
SHGetSpecialFolderLocation(h,CSIDL_DRIVES,BrowseInfo.pidlRoot);
//устанавливаем свойства диалогового окна
with BrowseInfo do
begin
hwndOwner := h; //окно-владелец
lpszTitle := title; //заголовок диалога
//не показываем некоторые системные папки: "Корзина", "Панель управления" и т.д
ulFlags := BIF_RETURNONLYFSDIRS+BIF_NEWDIALOGSTYLE;
end;
//выводим диалог
lpItemID := SHBrowseForFolder(BrowseInfo);
//папка, указанная юзером, существует?
if (lpItemId <> nil) then
begin
SHGetPathFromIDList(lpItemID, Path);
Result := path;
GlobalFreePtr(lpItemID); //освобождаем ресурсы
end;
end;
все замечательно, НО, я просидел три часа и так и не понял как указать папку, которая уже будет открыта в этом появившемся диалоге. Ну то есть чтобы пользователь уже видел какая на данный момент выбрана папка и отсюда плясал, а то этот код только открывает корень моего компьютера, что и очевидно по CSIDL_DRIVES. Заранее большое спасибо.
Dementiy (2005-11-10 10:39:00) [1]хехе, спасибо. вот бы еще и параметры диалогу можно было бы указать, то не было бы цены этой функции)
Defunct (2005-11-10 05:19:00) [2]> Джо
:)
Defunct (2005-11-10 05:18:00) [3]Dementiy (10.11.05 05:04) [2]
> но в первой можно указать только корневую папку
...
var Root : WideString;
S:String;
begin
S := 'C:\Windows';
SelectDirectory('Стартуем в каталоге C:\Windows', Root, S);
Джо (2005-11-10 05:14:00) [4]
> [2] Dementiy (10.11.05 05:04)
Нет, не так все.
Directory := 'D:\Work';
if SelectDirectory ('Select','',Directory) then
...
Параметр Directoryслужит как для указания текущей папки, так и для сохранения выбранного пользователем пути.
П.С. Любите Хелп - источник знаний :)
Dementiy (2005-11-10 05:04:00) [5]
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
вторая с древним интерфейсом согласен. но в первой можно указать только корневую папку(т.е. остальные все папки выше указанной как рутовая будут не доступны), а мне нужно чтобы были видны и диски и папки, но выделенной папкой была текущая юзерская папка. я так понял нужно callback юзать в BrowseInfo и оттуда уже бегать по папкам.
Джо (2005-11-10 04:17:00) [6]
> все чем она располагает это SelectDirectory(....).
Это overloaded-функция. Посмотри внимательно Справку, и увидишь, что их там 2 штуки с таким именем :) И одна из них как раз не с "древним интерфейсом" ;>