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

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

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 штуки с таким именем :) И одна из них как раз не с "древним интерфейсом" ;>


Наверх

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