#include <string.h>
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <process.h>
#include <fcntl.h>
static int CALLBACK BrowseCallbackProc (HWND hWnd, UINT uMsg,
LPARAM lParam, LPARAM lpData)
{
TCHAR szPath[_MAX_PATH];
switch (uMsg)
{
case BFFM_INITIALIZED:
if (lpData)
SendMessage ( hWnd, BFFM_SETSELECTION, TRUE, lpData );
break;
case BFFM_SELCHANGED:
SHGetPathFromIDList ( LPITEMIDLIST(lParam), szPath);
SendMessage( hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath) );
break;
}
return 0;
}
BOOL GetFolder ( LPCTSTR szTitle, LPTSTR szPath, LPCTSTR szRoot,
HWND hWndOwner )
{
if ( szPath == NULL )
return false;
bool result = false;
LPMALLOC pMalloc;
if ( ::SHGetMalloc(&pMalloc) == NOERROR)
{
BROWSEINFO bi;
::ZeroMemory( &bi,sizeof bi );
bi.ulFlags = BIF_RETURNONLYFSDIRS;
// дескриптор окна-владельца диалога
bi.hwndOwner = hWndOwner;
// добавление заголовка к диалогу
bi.lpszTitle = szTitle;
// отображение текущего каталога
bi.lpfn = BrowseCallbackProc;
bi.ulFlags |= BIF_STATUSTEXT;
// установка каталога по умолчанию
bi.lParam = LPARAM(szPath);
// установка корневого каталога
if ( szRoot != NULL )
{
IShellFolder *pDF;
if ( SHGetDesktopFolder(&pDF) == NOERROR )
{
LPITEMIDLIST pIdl = NULL;
ULONG chEaten;
ULONG dwAttributes;
USES_CONVERSION;
LPOLESTR oleStr = T2OLE ( szRoot );
pDF->ParseDisplayName ( NULL, NULL, oleStr, &chEaten, &pIdl, &dwAttributes );
pDF->Release ();
bi.pidlRoot = pIdl;
}
}
LPITEMIDLIST pidl = ::SHBrowseForFolder ( &bi );
if ( pidl != NULL )
{
if ( ::SHGetPathFromIDList ( pidl, szPath ) )
result = true;
pMalloc->Free(pidl);
}
if ( bi.pidlRoot != NULL )
pMalloc->Free ( (void*) bi.pidlRoot );
pMalloc->Release ();
}
return result;
}
Диалоговое окно открыть папку
мне нужно выбрать путь к папке, но я нашел только компонент который выбирает файл.
P.S. Аналогичная тема есть в ветке Delphi. А поскольку и тут, и там используется VCL - решения тоже совместимые :D
эта функция открывает окно в каком то доисторическом виде. А можно чтобы это окно было типо того как "копировать в папку..." в ХР
Обновить Билдер до более современной версии.
Цитата: Freeman
Обновить Билдер до более современной версии.
у меня шестой то трудно работает
Поставь компоненты RxLib, там есть компонент DirectoryEdit. Может он тебе понравится :)
Тогда смотри в RX BrowseForDirectory (кажется, так). Модуль, если помню, FileUtil. А если сильно захотеть, можно по MSDN и ручками написать.
мне нужно выбрать путь к папке, но я нашел только компонент который выбирает файл.[/QUOTE]
Код:
Код не мой, поэтому за разного рода погрешности прошу меня не пинать.
Код:
void __fastcall TForm1::SelectFolderClick(TObject *Sender)
{
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Browse folder";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit1->Text = p;
}
{
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Browse folder";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit1->Text = p;
}
без наворотов)
Цитата:
char folder[MAX_PATH];
Напомните мне, пожалуйста, а чему равна константа MAX_PATH?
Если 256, то ваша программа будет вылетать со свистом каждый раз, когда ей подсунут любой каталог NTFS, имя которого длиннее, чем по стандарту FAT16 (коему уже давно никто не обязан следовать) :D
Цитата: el scorpio
Напомните мне, пожалуйста, а чему равна константа MAX_PATH?
Если 256, то ваша программа будет вылетать со свистом каждый раз, когда ей подсунут любой каталог NTFS, имя которого длиннее, чем по стандарту FAT16 (коему уже давно никто не обязан следовать) :D
Если 256, то ваша программа будет вылетать со свистом каждый раз, когда ей подсунут любой каталог NTFS, имя которого длиннее, чем по стандарту FAT16 (коему уже давно никто не обязан следовать) :D
Цитата: Plisteron
Код не мой, поэтому за разного рода погрешности прошу меня не пинать.
У кого голова на плечах, тот вместо MAX_PATH что-нибудь да подставит.
Цитата: zergman
Код:
void __fastcall TForm1::SelectFolderClick(TObject *Sender)
{
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Browse folder";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit1->Text = p;
}
{
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Browse folder";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit1->Text = p;
}
без наворотов)
а для танкистов можно объяснить как это использовать?, я это в буттонклик ну и послал меня билдер... опять на форум
Код:
#define NO_WIN32_LEAN_AND_MEAN
.....
void __fastcall TForm1::SelectFolderClick(TObject *Sender)
{
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Browse folder";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit1->Text = p;
}
.....
void __fastcall TForm1::SelectFolderClick(TObject *Sender)
{
BROWSEINFO dir;
char folder[MAX_PATH];
LPITEMIDLIST item;
memset(&dir,0,sizeof(BROWSEINFO));
dir.hwndOwner = Handle;
dir.pszDisplayName = folder;
dir.lpszTitle = "Browse folder";
item = SHBrowseForFolder(&dir);
char p[MAX_PATH];
SHGetPathFromIDList(item,p);
if(p[0] != '\0')
Edit1->Text = p;
}
как я рад, как я рад. Блин сначала не хотело работать. Оказывается вот это #define NO_WIN32_LEAN_AND_MEAN нужно ставить в самом верху, до всех инклудов
я про него забыл сказку расказать)