Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Диалог задания папки


Автор: Alex 29.9.2002, 15:41
Как вызвать диалог задания папки с кнопкой "Создать новую папку"?
А в идеале как вызвать диалог задания папки, который выглядит также как диалог открытия файла?

Автор: December 29.9.2002, 21:21
Давным-давно, когда ещё не было мне ведомо про ф-цию BrowseDirectory, извратнулся я таким образом: вызывается диалог выбора файла, потом из выбранного файла экстрагируется сам папк. А вообще я что-то не встречал цельных компонентов, подходящих для этой цели.

Автор: Dapo 30.9.2002, 15:02
RxLib 2.75

Автор: Alex 1.10.2002, 13:58
Что RxLib? Конкретней можешь ответить?

Автор: Dapo 1.10.2002, 14:12
А куда конкретнее? RxLIB 2.75 - это библиотека компонентов созданная русскими разработчиками, кажется в Питере. Для русских бесплатно, для буржуев платно. Неужто не слышал про такую? Там конкретно есть компонент для выбора папки. Еще конкретнее?

Автор: Alex 1.10.2002, 14:18
Что такое RxLib я знаю. Но там нет компонента, который бы показывал диалог выбора папки, в котором есть кнопка "Создать новую папку".

Автор: Alex 2.10.2002, 02:11
Vit, Song не верю, что вы не знаете ответа.

Автор: Vit 2.10.2002, 04:47
Цитата(alex @ 01.10.2002, 10:11)
Vit, Song не верю, что вы не знаете ответа.

Слушай, ты потратил несколько дней выясняя это, это школьная задача что-ли? За это время можно десяток своих диалогов нарисовать со всеми наворотами... Я никогда таким не озадачивался и ответа не знаю, и если мне нужен какой диалог, так мне легче его самому написать, чем несколько дней рыться по FAQ и виндовым API чтобы найти нужные параметры.

Итог - я не знаю. Что бы я делал в таком случае -
1) Зашёл на www.torry.net - посмотрел, может там есть отдельный компонент с такими свойствами, или есть среди пакетов компонентов - некоторые из них предлагают сотни разных диалогов
2) Написал бы свой со всеми нужными мне наворотами.

Автор: Alex 2.10.2002, 15:40
Vit не сердись. Свой диалог я написал еще 2 года назад и его везде использую. Но я знаю точно, что такой диалог как я хочу можно вызвать стандартными средствами, по этому и спросил.

Автор: Vit 2.10.2002, 18:04
Я не сержусь, просто не смотря на глас вопиющий, я не знаю :(

Автор: Vit 5.10.2002, 04:18
Между прочим пример в нашем FAQ делает именно то что тебе надо:

http://www.forum.vingrad.ru/cgi-bin/newforum/ikonboard.cgi?act=ST;f=32;t=1920;hl=%EA%E0%F2%E0%EB%EE%E3

(см. второй пример)

Автор: Alex 5.10.2002, 20:51
Пример это конечно хорошо, но в нем полно ошибок, если хотите, могу прислать 100% рабочий пример.

Автор: Vit 5.10.2002, 21:25
Бросай сюда, я изменю пример в FAQ

Автор: Alex 6.10.2002, 14:11
Рабочий код:
threadvar
 myDir: string;

function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): integer; stdcall;
begin
 Result := 0;
 if uMsg = BFFM_INITIALIZED then
   SendMessage(hwnd, BFFM_SETSELECTION, 1, LongInt(PChar(myDir)));
end;

function SelectDirPlus(hWnd: HWND; const Caption: string; const Root: WideString; Directory: string): Boolean;
// Диалог выбора директории с кнопкой "Создать папку"
var
 WindowList: Pointer;
 BrowseInfo : TBrowseInfo;
 Buffer: PChar;
 RootItemIDList, ItemIDList: PItemIDList;
 ShellMalloc: IMalloc;
 IDesktopFolder: IShellFolder;
 Eaten, Flags: LongWord;
begin
 myDir := Directory;
 Result := False;
 FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
 if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then begin
   Buffer := ShellMalloc.Alloc(MAX_PATH);
   try
     RootItemIDList := nil;
     if Root <> '' then begin
       SHGetDesktopFolder(IDesktopFolder);
       IDesktopFolder.ParseDisplayName(hWnd, nil,
       POleStr(Root), Eaten, RootItemIDList, Flags);
     end;
     with BrowseInfo do begin
       hwndOwner := hWnd;
       pidlRoot := RootItemIDList;
       pszDisplayName := Buffer;
       lpfn := @BrowseCallbackProc;
       lParam:= Integer(PChar(Directory));
       lpszTitle := PChar(Caption);
       ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT;
     end;
     WindowList := DisableTaskWindows(0);
     try
       ItemIDList := ShBrowseForFolder(BrowseInfo);
     finally
       EnableTaskWindows(WindowList);
     end;
     Result :=  ItemIDList <> nil;
     if Result then begin
       ShGetPathFromIDList(ItemIDList, Buffer);
       ShellMalloc.Free(ItemIDList);
       Directory := Buffer;
     end;
   finally
     ShellMalloc.Free(Buffer);
   end;
 end;
end;

А http://alex-co.narod.ru/Delphi/Files/Samples/acDlgSelectDir.zipлежит модуль с функциями работы диалогом выбора папки.

Автор: Vit 13.10.2002, 01:26
Вновь поднимаю эту тему. А как задать координаты этого диалога - он  стремится открыться где-то в правом нижнем углу экрана, а на одном из моих компьютеров открывается и вовсе практически полностью за экраном? Конечно можно посылать сообщения диалогу, но это как-то совсем дегенеративно...

Автор: Alex 13.10.2002, 15:51
Vit извини может я скажу глупость, а зачем тогда параметр hwnd функции. Помойму в него передаешь handel окна родителя и все нормально.

Автор: Vit 13.10.2002, 21:30
Цитата(alex @ 12.10.2002, 23:51)
Помойму в него передаешь handel окна родителя и все нормально.

Что "всё нормально"? Ну да зависит от родительского окна и что? А как его вывести там где мне надо? У меня родительское окно находится с края экрана а диалог нужен не по отношению к родительскому окну, а в вполне определённом месте. Неужели надо создавать какое-нибудь невидимое фиктивное окно и его передавать? Бред какой-то...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)