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

Вниз

Browse For Folder Dialog   Найти похожие ветки 

 
Dementiy   (2005-11-10 03:59) [0]

в дельфе нет нормального диалога выбора папки, все чем она располагает это 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. Заранее большое спасибо.


 
Джо ©   (2005-11-10 04:17) [1]


>  все чем она располагает это SelectDirectory(....).

Это overloaded-функция. Посмотри внимательно Справку, и увидишь, что их там 2 штуки с таким именем :) И одна из них как раз не с "древним интерфейсом" ;>


 
Dementiy   (2005-11-10 05:04) [2]

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 05:14) [3]


>  [2] Dementiy   (10.11.05 05:04)

Нет, не так все.

 Directory := "D:\Work";
 if SelectDirectory ("Select","",Directory) then
   ...

Параметр Directory служит как для указания текущей папки, так и для сохранения выбранного пользователем пути.
П.С. Любите Хелп - источник знаний :)


 
Defunct ©   (2005-11-10 05:18) [4]

Dementiy   (10.11.05 05:04) [2]

> но в первой можно указать только корневую папку

...
var Root : WideString;
   S:String;
begin
 S := "C:\Windows";
 SelectDirectory("Стартуем в каталоге C:\Windows", Root, S);


 
Defunct ©   (2005-11-10 05:19) [5]

> Джо

:)


 
Dementiy   (2005-11-10 10:39) [6]

хехе, спасибо. вот бы еще и параметры диалогу можно было бы указать, то не было бы цены этой функции)



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

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

Наверх




Память: 0.48 MB
Время: 0.034 c
6-1125267910
desam_
2005-08-29 02:25
2005.12.04
PHP и Delphi


2-1131955451
nadirPP
2005-11-14 11:04
2005.12.04
AutoSelect


4-1128006074
petr
2005-09-29 19:01
2005.12.04
порты


14-1132194091
Antonn
2005-11-17 05:21
2005.12.04
С днем студента!


1-1131086643
Zhekson
2005-11-04 09:44
2005.12.04
Объединённые ячейки в StringGrid