| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Слушай, ты потратил несколько дней выясняя это, это школьная задача что-ли? За это время можно десяток своих диалогов нарисовать со всеми наворотами... Я никогда таким не озадачивался и ответа не знаю, и если мне нужен какой диалог, так мне легче его самому написать, чем несколько дней рыться по 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 | ||
Что "всё нормально"? Ну да зависит от родительского окна и что? А как его вывести там где мне надо? У меня родительское окно находится с края экрана а диалог нужен не по отношению к родительскому окну, а в вполне определённом месте. Неужели надо создавать какое-нибудь невидимое фиктивное окно и его передавать? Бред какой-то... |