Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.059 c
2-1132085325
MRAk
2005-11-15 23:08
2005.12.04
Fs.free


3-1129644747
DancerMan
2005-10-18 18:12
2005.12.04
DBGridEh. Как изменить цвет строки по клику на ней?


2-1132082575
Kirill_
2005-11-15 22:22
2005.12.04
Привет! Как мне найти миньшее число из 6 данных?


14-1131511621
КаПиБаРа
2005-11-09 07:47
2005.12.04
Задача с каменюкой


3-1129688072
beglec
2005-10-19 06:14
2005.12.04
Проблема с подсчетом записей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский