Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выбор директории в OpenDialog

295
10 октября 2003 года
gray_k
356 / / 20.12.1999
Как настроить OpenDialog для выбора директории, а не файлов. DirectoryListBox не подходит, нужен именно OpenDialog.
293
10 октября 2003 года
SEDEGOFF
586 / / 06.10.2002
А чем тебе не нравиться виндовый диалог


//В самом верху
#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;
//******************
295
10 октября 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
А чем тебе не нравиться виндовый диалог


//В самом верху
#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;
//******************


Спасибо, а как устанавливать начальный каталог пользователя?

415
10 октября 2003 года
SLA
274 / / 08.08.2003
Цитата:
Originally posted by SEDEGOFF
//В самом верху
#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 ?

415
10 октября 2003 года
SLA
274 / / 08.08.2003
Цитата:
Originally posted by gray_k
Как настроить OpenDialog для выбора директории, а не файлов. DirectoryListBox не подходит, нужен именно OpenDialog.



Недавно, в этом же форуме, мне посоветовали воспользоваться функцией SelectDirectory() из VCL.
Но у этой функции есть недостаток - эсли юзер так и не выбрал в диалоге каталог (закрыв диалог кнопкой [x]), то функция возвращает пустую строку. Поэтому приходится перепроверять, выбрал ли он каталог. Поэтому я написал примерно вот такую функцию:

Код:
void MySelectDir(AnsiString &anDir)
{
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 += "\\";
    }
}
487
11 октября 2003 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by SLA


Недавно, в этом же форуме, мне посоветовали воспользоваться функцией SelectDirectory() из VCL.
Но у этой функции есть недостаток - эсли юзер так и не выбрал в диалоге каталог (закрыв диалог кнопкой [x]), то функция возвращает пустую строку. Поэтому приходится перепроверять, выбрал ли он каталог. Поэтому я написал примерно вот такую функцию:

Код:
void MySelectDir(AnsiString &anDir)
{
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))
{
// Юзер выбрал директорию!
}

293
12 октября 2003 года
SEDEGOFF
586 / / 06.10.2002
Нужно устоновить функцию CALLBACK которая и устанавливает нужную папку
Вот тебе пример моего файла 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]
293
12 октября 2003 года
SEDEGOFF
586 / / 06.10.2002
Цитата:
Originally posted by SLA


Кстати, SEDEGOFF, я хотел сказать что у меня это не компилируется. Выдается целая куча ошибок, причем ругается Билдер именно на Микрософтовские .H-файлы, а не на мою программу.
И еще: что такое NO_WIN32_LEAN_AND_MEAN ?


Ну начнем по порядку
1 - что за ошибки. У меня кучу ошибок сыпало когда небыло в самом верху (самая первая строка)
#define NO_WIN32_LEAN_AND_MEAN
2 - Что такое NO_WIN32_LEAN_AND_MEAN - я не имею ни какого понятия, так как нет времени для того что бы разбираться. Но как мне представляеться это связано с представлением для 16 разрадных систем

1.9K
06 мая 2006 года
Anton Chik
175 / / 26.09.2005
а как все-таки начинать выбор с заданной директории, типо как задать InitialDir?
293
06 мая 2006 года
SEDEGOFF
586 / / 06.10.2002
Прочитай внимательно два поста выше твоего - это 100% рабочий код
1.9K
06 мая 2006 года
Anton Chik
175 / / 26.09.2005
верю.стал разбираться и сам все понял...

но пришел вот к чему:

красивенький интерфейс (not a-la win3.1)
 
Код:
SelectDirectory("Выберите директорию...",WideString("Desktop"),dir);

начинаться выбор будет с dir ,результат пишется туда же...
Мне кажется весьма оптимальный вариант без лишнего кода.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог