C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Диалог открытия папки, ошибка в диалоге открытия папки
Adept
Отправлено: 27.10.2005, 10:34


Не зарегистрирован







Вот диалог открытия папки скачаный с этого сайта

#include

void __fastcall TForm1::Button1Click(TObject *Sender)
{
BROWSEINFO info;
char szDir[MAX_PATH];
char szDisplayName[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pShellMalloc;

// SHBrowseForFolder возвращает PIDL. Память для PIDL

// распределяется оболочкой. В итоге, мы должны очистить
// эту память, так как мы должны получить указатель на объект

// shell malloc COМ который будет позже освобожден PIDL.
if(SHGetMalloc(&pShellMalloc) == NO_ERROR)
{
//если мы получили оболочку malloc объекта,

// тогда продолжите, инициализируя структуру BROWSEINFO
memset(&info, 0x00,sizeof(info));
info.hwndOwner = Handle; // Owner window
info.pidlRoot = 0; // root folder
info.pszDisplayName = szDisplayName; // return display name
info.lpszTitle = "Browse Title"; // label caption
info.ulFlags = BIF_RETURNONLYFSDIRS; // config flags
info.lpfn = 0; // callback function

// вызовем диалог
pidl = SHBrowseForFolder(&info);

// pidl будет null если пользователь нажмет cancel в диалоге выбора

// pidl не будет null если пользователь выбрал папку
if(pidl)
{
// попытаемся преобразовать pidl в строку
// при успешном преобразовании возвращаемое значение — true

if(SHGetPathFromIDList(pidl, szDir))
{
// set one caption to the directory path
Label1->Caption = szDir;
}

// set another caption based on the display name
Label2->Caption = info.pszDisplayName;

// Освобождим pidl.
// затем вызовем Relasee для сигнализирования, что мы больше
// не нуждаемся в shell malloc object
pShellMalloc->Free(pidl);
}
pShellMalloc->Release();
}
}


когда пытаюсь скомпелировать вот что получается
[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for
'FOLDERSETTINGS'
и тд в том же духе
AVC
Отправлено: 27.10.2005, 11:48


Ветеран

Группа: Модератор
Сообщений: 1583



Это нужно повозиться с shellobj.h
Вот рабочий код
CODE

#include "shlobj1.h"

//---------------------------------------------------------------------------
// Диалог выбора каталога
//  возврат IsEmpty — отказ или абсолютный путь c завершающим "\"
//---------------------------------------------------------------------------

PACKAGE AnsiString __fastcall SelectFolder (int pBIF_Flags)
{
char dir [MAX_PATH+1];

BROWSEINFO bi;
memset(&bi, 0, sizeof(bi));
bi.hwndOwner  = Application->Handle;
bi.pidlRoot   = NULL;
bi.pszDisplayName = dir;
bi.lpszTitle  = NULL;
bi.ulFlags   = pBIF_Flags;
bi.lpfn    = NULL;

if (!SHGetPathFromIDList(SHBrowseForFolder(&bi), dir)) return "";

AnsiString path(dir);
if (!path.IsPathDelimiter(path.Length()))  path += "\";

return path;
}

а вот к нему shellobj1.h тот же shellobj у которого кое-что заккоментировано

User Attached Image Скачать файл
shlobj1.h


Doga
Отправлено: 27.10.2005, 11:51


Мастер участка

Группа: Участник
Сообщений: 575



Похоже Вы подключаете shobjidl.h вместо ShlObj.hpp.
Исправьте и не забудьте про это:

QUOTE

// If problems occur when compiling win32 structs, records, or
// unions, please define NO_WIN32_LEAN_AND_MEAN to force inclusion
// of Windows header files.


это коментарий из ShlObj.hpp



P.S. Можно было бы и поискать — похожая тема уже была...


P.P.S. В RxLib есть процедура BrowseDirectory, похоже это то что Вам было нужно. И ещё компонент TDirectoryEdit...

Отредактировано Doga — 27/10/2005, 12:38
olegenty
Отправлено: 27.10.2005, 12:50


Ветеран

Группа: Модератор
Сообщений: 2412



а ещё всё это есть в Examples
Rius
Отправлено: 28.10.2005, 05:45


Мастер участка

Группа: Участник
Сообщений: 321



CODE
AnsiString Dir = ExtractFilePath(Application->ExeName);
if (SelectDirectory("Выберите каталог", "", Dir))
       {
...

Вернуться в Вопросы программирования в C++Builder