Выбор директории в OpenDialog
//В самом верху
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
//********************
//в фунцции
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Выберите путь";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit4->Text = p;
//******************
А чем тебе не нравиться виндовый диалог
//В самом верху
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
//********************
//в фунцции
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Выберите путь";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit4->Text = p;
//******************
Спасибо, а как устанавливать начальный каталог пользователя?
//В самом верху
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
//********************
//в фунцции
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Выберите путь";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit4->Text = p;
//******************
Кстати, SEDEGOFF, я хотел сказать что у меня это не компилируется. Выдается целая куча ошибок, причем ругается Билдер именно на Микрософтовские .H-файлы, а не на мою программу.
И еще: что такое NO_WIN32_LEAN_AND_MEAN ?
Как настроить OpenDialog для выбора директории, а не файлов. DirectoryListBox не подходит, нужен именно OpenDialog.
Недавно, в этом же форуме, мне посоветовали воспользоваться функцией SelectDirectory() из VCL.
Но у этой функции есть недостаток - эсли юзер так и не выбрал в диалоге каталог (закрыв диалог кнопкой [x]), то функция возвращает пустую строку. Поэтому приходится перепроверять, выбрал ли он каталог. Поэтому я написал примерно вот такую функцию:
{
AnsiString anDirCopy = anDir;
AnsiString anLastSelection = "-";
if (anDir != "") anLastSelection = anDir;
SelectDirectory("Select directory:\nLast selected: "+anLastSelection, "", anDirCopy);
if (anDirCopy.Length()) //Юзер сделал выбор?
{
anDir = anDirCopy;
//А теперь добавим слэш (кстати, иногда он уже присутствует, например "C:\").
if (anDir[anDir.Length()]!='\\\') anDir += "\\";
}
}
Недавно, в этом же форуме, мне посоветовали воспользоваться функцией SelectDirectory() из VCL.
Но у этой функции есть недостаток - эсли юзер так и не выбрал в диалоге каталог (закрыв диалог кнопкой [x]), то функция возвращает пустую строку. Поэтому приходится перепроверять, выбрал ли он каталог. Поэтому я написал примерно вот такую функцию:
{
AnsiString anDirCopy = anDir;
AnsiString anLastSelection = "-";
if (anDir != "") anLastSelection = anDir;
SelectDirectory("Select directory:\nLast selected: "+anLastSelection, "", anDirCopy);
if (anDirCopy.Length()) //Юзер сделал выбор?
{
anDir = anDirCopy;
//А теперь добавим слэш (кстати, иногда он уже присутствует, например "C:\").
if (anDir[anDir.Length()]!='\\\') anDir += "\\";
}
}
Вообще-то SelectDirectory возвращает true или false на выбор/отмену выбора директории.
Так что не проще-ли сделать:
if (SelectDirectory("Select directory:\nLast selected: "+anLastSelection, "", anDirCopy))
{
// Юзер выбрал директорию!
}
Вот тебе пример моего файла CALLBACK.CPP, который я подсоеденяю к нужному модулю и вызываю функцияю
ChoisDir - котороя возвращает выбранный путь, в кучесте Handle передаю Handle программы
[COLOR=darkblue]
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
#include <windows.h>
#include <system.hpp>
#include <sysUtils.hpp>
static AnsiString CurrentDir__;
int __stdcall CallBack (HWND Wnd, UINT uMsg,LPARAM lParam,LPARAM lpData)
{
AnsiString Temp;
if (uMsg == BFFM_INITIALIZED)
{
if (CurrentDir__ == "")
Temp = GetCurrentDir();
else
Temp = ExcludeTrailingBackslash (CurrentDir__);
SendMessage (Wnd,BFFM_SETSELECTION,true,(int )Temp.c_str());
}
return 0;
}
//***************************
AnsiString __fastcall ChoisDir(HWND Handle, AnsiString Title, String Dir = "")
{
CurrentDir__ = Dir;
AnsiString return_;
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpfn = CallBack;
dir.lpszTitle = Title.c_str();
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
{
return_ = p;
}
else
return_ = Dir;
return return_;
};
[/COLOR]
Кстати, SEDEGOFF, я хотел сказать что у меня это не компилируется. Выдается целая куча ошибок, причем ругается Билдер именно на Микрософтовские .H-файлы, а не на мою программу.
И еще: что такое NO_WIN32_LEAN_AND_MEAN ?
Ну начнем по порядку
1 - что за ошибки. У меня кучу ошибок сыпало когда небыло в самом верху (самая первая строка)
#define NO_WIN32_LEAN_AND_MEAN
2 - Что такое NO_WIN32_LEAN_AND_MEAN - я не имею ни какого понятия, так как нет времени для того что бы разбираться. Но как мне представляеться это связано с представлением для 16 разрадных систем
но пришел вот к чему:
красивенький интерфейс (not a-la win3.1)
начинаться выбор будет с dir ,результат пишется туда же...
Мне кажется весьма оптимальный вариант без лишнего кода.