Форум: "Основная";
Текущий архив: 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