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 у которого кое-что заккоментировано
|
|
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))
{
...
|
|
|