Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Диалог "Открыть папку"


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

Автор: Fazil6 25.11.2007, 00:37
Код

SelectDirectory("C:\\",
        TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt
        ,0)

Автор: artsb 25.11.2007, 21:52
А какой-нибудь компонент нужно кидать на форму?
Не мог бы объяснить то, что написал?
И куда сохраняется выбранный путь?
 smile 

Автор: Fazil6 25.11.2007, 21:58
Цитата(artsb @  25.11.2007,  21:52 Найти цитируемый пост)
И куда сохраняется выбранный путь?

сори, конечно первым параметром должна быть ссылка и это не скомпилится. В эту ссылку и сохранится.
В хэлпе билдера все что нужно про эту функцию написано. 

Автор: artsb 25.11.2007, 22:45
Спасибо разобрался, но это не совсем, то, что нужно.
Посмотрите скрин. Это выбор папки с музыкой в винампе.

Автор: Nat 26.11.2007, 08:34
Попробуй RX компаненты, в частности RXDirectoryEdit и RXFilenameEdit.

Автор: artsb 26.11.2007, 10:01
Попробовал,то , что предлагал Nat, но это тоже самое о чём писал Fazil6. А мне нужно вызвать такое окно как на рисунке. Помогите плиз.

Автор: Fazil6 26.11.2007, 10:42
Цитата(artsb @  26.11.2007,  10:01 Найти цитируемый пост)
Попробовал,то , что предлагал Nat, но это тоже самое о чём писал Fazil6. А мне нужно вызвать такое окно как на рисунке. Помогите плиз.

плохо ты пробовал.
Код

DialogKind = dkWin32

Автор: artsb 26.11.2007, 18:23
Fazil6 спасибо, получилось. А как добавить поле "Создать папку"?

Автор: artsb 27.11.2007, 10:15
На другом форуме подсказали, что можно с помощью API функции. 
Код

#include <FileCtrl.hpp>
...
AnsiString FolderIn;
if( SelectDirectory("Текст подсказки над окном" , "Caption_string" , FolderIn))
                {
                LabeledEdit1->Text=FolderIn;
                }

Это как раз то, что нужно. Только как сделать, чтобы отображалась кнопка для создания новой папки?

Автор: artsb 27.11.2007, 16:37
Так кто-нибудь знает или нет?

Автор: artsb 27.11.2007, 17:19
На другом форуме советуют пользоваться функцией SHGetPathFromIDList. 
Код

  char FileName[MAX_PATH+1];
  BROWSEINFO bi;
  memcpy(FileName, "D:\\", 3);
      bi.hwndOwner = hWnd;
      bi.pidlRoot = NULL;
      bi.pszDisplayName = FileName;
      bi.lpszTitle = "Заголовок";
      bi.ulFlags = BIF_STATUSTEXT
                  |BIF_BROWSEFORCOMPUTER
                  |BIF_EDITBOX
                  |BIF_NEWDIALOGSTYLE
                  |BIF_NONEWFOLDERBUTTON;
                  //|BIF_BROWSEINCLUDEFILES;
      bi.lpfn = NULL;

   SHGetPathFromIDList(SHBrowseForFolder(&bi),FileName);

Но когда я пишу этот код, при запуске вылетают ошибки. Может нужно какие-то библиотеки или ещё что-то подключить?

Автор: artsb 27.11.2007, 23:36
Народ ну помогите-е-е-е!
Странно?! Такое ощущение как-будто с этим никто и никогда не сталкивался. 
Может есть компонент какой-нибудь?
Вот картинка, того что мне нужно:


Автор: artsb 28.11.2007, 21:59
НУ помогите плиз. smile 

Автор: Alca 29.11.2007, 10:20
#include <shlobj.h>
http://www.soft32.ru/delphi.shtml?topic=app&title=sel_dir_mk_dir
Код

    char FileName[MAX_PATH+1];
    BROWSEINFO bi;
    memcpy(FileName, "D:\\", 3);
    bi.hwndOwner = /*hWnd*/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;

Автор: artsb 29.11.2007, 19:01
На форме Edit1 и Button1.
Подключил shlobj.h
В обработчике нажатия кнопки написал:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    char FileName[MAX_PATH+1];
    BROWSEINFO bi;
    memcpy(FileName, "D:\\", 3);
    bi.hwndOwner = /*hWnd*/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'

В чём может быть дело?

Автор: Alca 29.11.2007, 19:25
Я просто в shlobj.h переименовал:

FOLDERSETTINGS -> FOLDERSETTINGS_
DESKBANDINFO    -> DESKBANDINFO_
FVSHOWINFO       -> FVSHOWINFO_
SHELLFLAGSTATE -> SHELLFLAGSTATE_

Может какие-то ещё способы есть - я не парился, сделал так.

Автор: artsb 29.11.2007, 22:55
Всё! Спасибо! То что нужно!

Интересно, а то что я в shlobj.h произвёл изменения как Alca советовал, не повлечёт за собой каких-нибудь последствий???

И  ещё, кто-нибудь может объяснить предназначение всех флагов?

Автор: dumb 30.11.2007, 21:46
Цитата(artsb @  29.11.2007,  22:55 Найти цитируемый пост)
а то что я в shlobj.h произвёл изменения как Alca советовал, не повлечёт за собой каких-нибудь последствий?
за такое в приличных домах клавиатурой по пальцам бьют. smile

http://forum.vingrad.ru/forum/topic-106576/index.html

Автор: Alca 30.11.2007, 22:28
Цитата

за такое в приличных домах клавиатурой по пальцам бьют.

Шура не бейте!

Автор: artsb 1.12.2007, 16:23
dumb спасибо.
Всем спасибо.

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