Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Диалог "Открыть папку"  (Прочитано 29790 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
artsb
Гость
« : 26-11-2007 15:41 » 

Подскажите как открыть диалог выбора папки. Не TOpenDialog, а там маленькое окошко с деревом каталагов, как у винампа(рисунок). Желательно, чтобы можно было создавать новую папку с помощью него. Ну и расскажите пожалуйста как с ним работать.
Среди стандартных не нашёл (может плохо искал ).
Спасибо.

* open_folder.JPG (15.07 Кб - загружено 1245 раз.)
Записан
Джон
просто
Администратор

de
Offline 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
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #2 : 27-11-2007 06:10 » new

Еще вот такая 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 второй параметр?
Записан
Джон
просто
Администратор

de
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 28-11-2007 20:13 » 

artsb, если у тебя установлены хелпы (а они должны быть), то поставь курсор на SelectDirectory и нажми F1 - там подробно рассказано, какие есть свойства и методы и, наверняка, есть пара примеров.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
artsb
Гость
« Ответ #7 : 29-11-2007 06:44 » 

RXL скорее всего с помощью SelectDirectory не получится так сделать. На многих форумах читал по этой теме, но там для Delphi.
Может есть другой способ вызвать этот диалог и чтобы там была кнопка "Создать"?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 29-11-2007 06:51 » 

artsb, и Delphi и BC используют одни и те же библиотеки: VCL или более новую CLX. Т.е. перенос исходников с D в BC возможен, с учетом разницы синтаксиса.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline 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 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 29-11-2007 16:29 » 

Да уж случай действительно клинический...

Подскажите как открыть диалог выбора папки.

маленькое окошко с деревом каталагов

Желательно, чтобы можно было создавать новую папку с помощью него.

А теперь постарайся пожалуйста предельно точно указать какой именно из этих пунктов в SHBrowseForFolder у тебя "не то"? Вот что у меня получается



"И тяжёлая, и дыра есть" (с) А.П. Чехов "Злоумышленник"


* ss1.gif (12.53 Кб - загружено 5685 раз.)
« Последнее редактирование: 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 » 

Под фразой "правильно ли так" я подразумевал: не будет ли потом проблем или глюков при использовании этой библиотеки в дальнейшем.

Всем спасибо.
Записан
Джон
просто
Администратор

de
Offline 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>
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines