artsb
Гость
|
|
« : 26-11-2007 15:41 » |
|
Подскажите как открыть диалог выбора папки. Не TOpenDialog, а там маленькое окошко с деревом каталагов, как у винампа(рисунок). Желательно, чтобы можно было создавать новую папку с помощью него. Ну и расскажите пожалуйста как с ним работать. Среди стандартных не нашёл (может плохо искал ). Спасибо.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 26-11-2007 16:22 » |
|
Как именно в Borland это сделать - не знаю. Я его не практикую. А под виндой этим диалогом заведует библиотека shell32, в этом направлении и копай. Ф-я называется SHBrowseForFolder
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #2 : 27-11-2007 06:10 » |
|
Еще вот такая API функция есть... #include <FileCtrl.hpp> ... if( SelectDirectory("Текст подсказки над окном" , "Caption_string" , FolderIn)) { LabeledEdit1->Text=FolderIn; }
|
|
« Последнее редактирование: 27-11-2007 06:12 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
artsb
Гость
|
|
« Ответ #3 : 27-11-2007 07:06 » |
|
Arct спасибо. То, что нужно. А ты не знаешь как добавить поле и кнопку для создания новой папки. И ещё, для чего в SelectDirectory второй параметр?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #4 : 27-11-2007 09:31 » |
|
SelectDirectory - ф-я АПИ? Нету такой. Эт наверняка борландовские штучки. Незря же FileCtrl.hpp используется.
artsb, Caption - это типа название окна. Обычно у окон сообщений есть два рараметра - caption и prompt. Первый - название окна, второй - непосредственно сообщение.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
artsb
Гость
|
|
« Ответ #5 : 28-11-2007 19:05 » |
|
Понятно. Так как на счёт кнопки "Создать папку"? Помогите пожалуйста. Очень надо срочно.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #6 : 28-11-2007 20:13 » |
|
artsb, если у тебя установлены хелпы (а они должны быть), то поставь курсор на SelectDirectory и нажми F1 - там подробно рассказано, какие есть свойства и методы и, наверняка, есть пара примеров.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
artsb
Гость
|
|
« Ответ #7 : 29-11-2007 06:44 » |
|
RXL скорее всего с помощью SelectDirectory не получится так сделать. На многих форумах читал по этой теме, но там для Delphi. Может есть другой способ вызвать этот диалог и чтобы там была кнопка "Создать"?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #8 : 29-11-2007 06:51 » |
|
artsb, и Delphi и BC используют одни и те же библиотеки: VCL или более новую CLX. Т.е. перенос исходников с D в BC возможен, с учетом разницы синтаксиса.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #9 : 29-11-2007 10:08 » |
|
artsb, ты наверняка можешь в билдере работать с системными библиотеками. Вызови ф-ю, про которую я говорил из sdhell32 и будет тебе счастье.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
zubr
Гость
|
|
« Ответ #10 : 29-11-2007 10:38 » |
|
Джон, это клинический случай, я ему на другом форуме пример использования функции SHBrowseForFolder выкладывал - бесполезно.
|
|
|
Записан
|
|
|
|
artsb
Гость
|
|
« Ответ #11 : 29-11-2007 15:25 » |
|
Если использовать SHBrowseForFolder, то появляется не то окно, которое мне нужно и которое представлено на рисунке. Я пробовал использовать компонент из RxLib, который основан на SHBrowseForFolder. Там есть два вида: один как на рисунке (без кнопки создать), а другой, тот который не нужен.
|
|
« Последнее редактирование: 29-11-2007 15:32 от artsb »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 29-11-2007 16:29 » |
|
Да уж случай действительно клинический... Подскажите как открыть диалог выбора папки. маленькое окошко с деревом каталагов Желательно, чтобы можно было создавать новую папку с помощью него. А теперь постарайся пожалуйста предельно точно указать какой именно из этих пунктов в SHBrowseForFolder у тебя "не то"? Вот что у меня получается "И тяжёлая, и дыра есть" (с) А.П. Чехов "Злоумышленник"
|
ss1.gif (12.53 Кб - загружено 5684 раз.)
|
« Последнее редактирование: 29-11-2007 16:39 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
zubr
Гость
|
|
« Ответ #13 : 29-11-2007 19:43 » |
|
artsb, все что тебе надо - это поиграться флагами структуры BROWSEINFO. Уже давно открыл бы MSDN - вопрос был бы решен в течение 2 минут. Для формы, которую отобразил Джон, надо BrowseInfo.ulFlags = BIF_EDITBOX | 0x0040;
|
|
|
Записан
|
|
|
|
artsb
Гость
|
|
« Ответ #14 : 29-11-2007 20:04 » |
|
Всё получилось. Помогли на другом форуме. Появляется такое же окно на скрине Джон'а. Подключил shlobj.h В обработчике нажатия кнопки написал: char FileName[MAX_PATH+1]; BROWSEINFO bi; memcpy(FileName, "C:\\", 3); bi.hwndOwner = 0; bi.pidlRoot = NULL; bi.pszDisplayName = FileName; bi.lpszTitle = "Заголовок"; bi.ulFlags = BIF_STATUSTEXT |BIF_BROWSEFORCOMPUTER |BIF_EDITBOX |BIF_NEWDIALOGSTYLE /*|BIF_NONEWFOLDERBUTTON*/ |BIF_USENEWUI; //|BIF_BROWSEINCLUDEFILES; bi.lpfn = NULL; SHGetPathFromIDList(SHBrowseForFolder(&bi),FileName); Edit1->Text=FileName;
При запуске приложения вылетали ошибки: [C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS' [C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO' [C++ Error] shlobj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO' [C++ Error] shlobj.h(3457): E2238 Multiple declaration for 'SHELLFLAGSTATE'
На том форуме, как вариант, предложили переименовать: FOLDERSETTINGS -> FOLDERSETTINGS_ DESKBANDINFO -> DESKBANDINFO_ FVSHOWINFO -> FVSHOWINFO_ SHELLFLAGSTATE -> SHELLFLAGSTATE_
Я переименовал и всё заработало. Но интересно так правильно или есть другой вариант? Также объясните пожалуйста значения всех флагов (на будущее).
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #15 : 30-11-2007 05:11 » |
|
Но интересно так правильно или есть другой вариант? Также объясните пожалуйста значения всех флагов (на будущее). Что значит правильно? В программировании всегда есть множество вариантов, а у программиста есть вариант выбрать самое оптимальное решение для конкретной ситуации. К примеру, в твоем случае, если бы борландская функция SelectDirectory тебя устраивала по функциональности, то проще было бы воспользоваться ей, иначе пришлось искать более универсальное решение. Чтобы посмотреть значения всех флагов, достаточно открыть MSDN: ulFlags Flags specifying the options for the dialog box. This member can include zero or a combination of the following values. BIF_BROWSEFORCOMPUTER Only return computers. If the user selects anything other than a computer, the OK button is grayed. BIF_BROWSEFORPRINTER Only allow the selection of printers. If the user selects anything other than a printer, the OK button is grayed. In Microsoft Windows XP, the best practice is to use an XP-style dialog, setting the root of the dialog to the Printers and Faxes folder (CSIDL_PRINTERS).
BIF_BROWSEINCLUDEFILES Version 4.71. The browse dialog box will display files as well as folders. BIF_BROWSEINCLUDEURLS Version 5.0. The browse dialog box can display URLs. The BIF_USENEWUI and BIF_BROWSEINCLUDEFILES flags must also be set. If these three flags are not set, the browser dialog box will reject URLs. Even when these flags are set, the browse dialog box will only display URLs if the folder that contains the selected item supports them. When the folder's IShellFolder::GetAttributesOf method is called to request the selected item's attributes, the folder must set the SFGAO_FOLDER attribute flag. Otherwise, the browse dialog box will not display the URL. BIF_DONTGOBELOWDOMAIN Do not include network folders below the domain level in the dialog box's tree view control. BIF_EDITBOX Version 4.71. Include an edit control in the browse dialog box that allows the user to type the name of an item. BIF_NEWDIALOGSTYLE Version 5.0. Use the new user interface. Setting this flag provides the user with a larger dialog box that can be resized. The dialog box has several new capabilities including: drag-and-drop capability within the dialog box, reordering, shortcut menus, new folders, delete, and other shortcut menu commands. To use this flag, you must call OleInitialize or CoInitialize before calling SHBrowseForFolder. BIF_NONEWFOLDERBUTTON Version 6.0. Do not include the New Folder button in the browse dialog box. BIF_NOTRANSLATETARGETS Version 6.0. When the selected item is a shortcut, return the PIDL of the shortcut itself rather than its target. BIF_RETURNFSANCESTORS Only return file system ancestors. An ancestor is a subfolder that is beneath the root folder in the namespace hierarchy. If the user selects an ancestor of the root folder that is not part of the file system, the OK button is grayed. BIF_RETURNONLYFSDIRS Only return file system directories. If the user selects folders that are not part of the file system, the OK button is grayed. BIF_SHAREABLE Version 5.0. The browse dialog box can display shareable resources on remote systems. It is intended for applications that want to expose remote shares on a local system. The BIF_NEWDIALOGSTYLE flag must also be set. BIF_STATUSTEXT Include a status area in the dialog box. The callback function can set the status text by sending messages to the dialog box. This flag is not supported when BIF_NEWDIALOGSTYLE is specified. BIF_UAHINT Version 6.0. When combined with BIF_NEWDIALOGSTYLE, adds a usage hint to the dialog box in place of the edit box. BIF_EDITBOX overrides this flag. BIF_USENEWUI Version 5.0. Use the new user interface, including an edit box. This flag is equivalent to BIF_EDITBOX | BIF_NEWDIALOGSTYLE. To use BIF_USENEWUI, you must call OleInitialize or CoInitialize before calling SHBrowseForFolder. BIF_VALIDATE Version 4.71. If the user types an invalid name into the edit box, the browse dialog box will call the application's BrowseCallbackProc with the BFFM_VALIDATEFAILED message. This flag is ignored if BIF_EDITBOX is not specified.
|
|
|
Записан
|
|
|
|
artsb
Гость
|
|
« Ответ #16 : 30-11-2007 07:19 » |
|
Под фразой "правильно ли так" я подразумевал: не будет ли потом проблем или глюков при использовании этой библиотеки в дальнейшем.
Всем спасибо.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #17 : 30-11-2007 10:18 » |
|
) Этого никто гарантировать не может. Но ты можешь быть спокойным. Если из-за этой библиотеки и будут проблемы, то не у тебя в первую очередь, а у системы.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
artsb
Гость
|
|
« Ответ #18 : 05-12-2007 19:56 » |
|
Чтобы не выскакивали ошибки в shlobj.h ничего править не надо. Делаем так:
#define NO_WIN32_LEAN_AND_MEAN #include <shlobj.h>
|
|
|
Записан
|
|
|
|
|