Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизSelectDirectory c предвыбором папки Найти похожие ветки
← →
Yuri Btr (2003-11-03 11:57) [0]Ув. мастера, подскажите как можно вызвать стандартную функцию Windows - выбор каталога - с позиционированием на определённой папке (не обрезая выше стоящие папки)
В диалоге SelectDirectory есть Root - он не подходит, хотелось бы как у Winamp 2 окно добавления в плейлист директории.
Порыл документацию на SHBrowseForFolder, наверно нужно делать открытие папок вручную через BrowseCallbackProc ?
← →
clickmaker (2003-11-03 12:02) [1]> наверно нужно делать открытие папок вручную через BrowseCallbackProc
Угу
← →
Yuri Btr (2003-11-03 12:26) [2]Сенкс
← →
Yuri Btr (2003-11-03 12:42) [3]Ещё вопрос по этой теме...
Какая числовая константа соотвествует сообщению BFFM_SETEXPANDED
(не могу найти его в заголовочных файлах) а в MSDN нет ссылки на заголовок, где это заявлено :(
← →
Yuri Btr (2003-11-03 12:45) [4]Сорри, нашёл в ShlObj.h
WM_USER + 106
позже приведу полный код для интересующихся...
← →
Yuri Btr (2003-11-03 15:36) [5]Ув. мастера, не подскажите ли, почему в Callback функции, после выделения папки, она не разворачивается ?
Хотя делаю всё всё как в МСДН описано (on line, т.к. на CD с Visual Studio статья МСДН с ошибкой)
Function TForm1.ChooseDir(OpenedPath:string=""):String;
function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lP, lPD: LPARAM): Integer stdcall;
begin
if uMsg=BFFM_INITIALIZED
then
begin
SendMessage(Wnd,BFFM_SETSELECTION,LongInt(true),lPD);
SendMessage(Wnd,WM_USER+106,LongInt(true),lPD);
end;
result:=0;
end;
Function ShowBrowseFolderForm(Title:string="";OpenedPath:string=""):string;
var
bi: TBrowseInfo;
pidlBrowse: PItemIDList;
Buffer: array[0..MAX_PATH] of char;
dispname:array[0..MAX_PATH] of char;
pMalloc: IMalloc;
begin
try
SHGetMalloc(pMalloc);
bi.hwndOwner := Application.Handle;
bi.pidlRoot := nil;
bi.pszDisplayName := dispname;
bi.lpszTitle := PChar(Title);
bi.ulFlags := BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE or BIF_STATUSTEXT or 100 or BIF_EDITBOX ;
bi.lParam :=Integer(Pchar(OpenedPath));;
bi.iImage:=0;
bi.lpfn:=@BrowseCallbackProc;
pidlBrowse:=SHBrowseForFolder(bi);
if (pidlBrowse <> nil)
then
if (SHGetPathFromIDList(pidlBrowse, @Buffer))
then
result:=StrPas(@Buffer);
finally
pMalloc.Free(pidlBrowse);
end;
end;
begin
Result:=ShowBrowseFolderForm("Выберите папку",OpenedPath);
end;
Заранее спасибо.
← →
Yuri Btr (2003-11-05 17:37) [6]Ув. мастера, посмотрите, так будет корректно, без ошибок?
хоу выложить в базу бесплатных кодов, всё таки удобная вещь.
а предыдущая проблема решается убиранием BIF_NEWDIALOGSTYLE.
Function ChooseDir(OpenedPath:string=""):String;
function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lP, lPD: LPARAM): Integer stdcall;
begin
if (uMsg=BFFM_INITIALIZED) and not (lPD=0)
then
begin
SendMessage(Wnd,BFFM_SETSELECTION,LongInt(true),lPD);
SendMessage(Wnd,WM_USER+106,LongInt(true),lPD);
end;
result:=0;
end;
Function ShowBrowseFolderForm(Title:string="";OpenedPath:string=""):string;
var
bi: TBrowseInfo;
pidlBrowse: PItemIDList;
Buffer: array[0..MAX_PATH] of char;
dispname:array[0..MAX_PATH] of char;
pMalloc: IMalloc;
begin
try
CoInitializeEx(nil,COINIT_APARTMENTTHREADED);
SHGetMalloc(pMalloc);
bi.hwndOwner := Application.Handle;
bi.pidlRoot := nil;
bi.pszDisplayName := dispname;
bi.lpszTitle := PChar(Title);
bi.ulFlags := BIF_RETURNONLYFSDIRS;
if OpenedPath>""
then
bi.lParam :=Integer(Pchar(OpenedPath))
else
bi.lParam :=0;
bi.iImage:=0;
bi.lpfn:=@BrowseCallbackProc;
pidlBrowse:=SHBrowseForFolder(bi);
if (pidlBrowse <> nil)
then
if (SHGetPathFromIDList(pidlBrowse, @Buffer))
then
result:=StrPas(@Buffer);
finally
pMalloc.Free(pidlBrowse);
end;
end;
begin
Result:=ShowBrowseFolderForm("Выберите папку",OpenedPath);
end;
← →
kDenis (2003-11-06 02:22) [7]Если я правильно понял вопрос, то помойму проще так:
ShellExecute(application.Handle, NULL, "твоя папка", NULL, NULL, SW_SHOWNORMAL);
и незабудь подключить ShellAPI.
← →
Yuri Btr (2003-11-06 11:23) [8]to kDenis (06.11.03 02:22) [7]
Вы неправильно поняли.
← →
SergIN (2003-11-06 11:39) [9]procedure TForm1.Button1Click(Sender: TObject);
var
curDir: string;
begin
curDir := "c:\windows"; // Имя нужной папки
SelectDirectory("Select Directory, "", curDir);
end;
← →
Yuri Btr (2003-11-06 12:47) [10]to SergIN
Эта ф-ия не позволяет раскрывать дерево папок в указанном месте
← →
SergIN (2003-11-06 17:37) [11]Что ты подразумеваешь под "раскрывать дерево папок в указанном месте"
← →
SergIN (2003-11-06 17:44) [12]попрорбуй досмвольно повторить код
← →
SergIN (2003-11-06 17:50) [13]ПОЗВОЛЯЕТ
← →
Yuri Btr (2003-11-07 11:28) [14]to SergIN
Чёрт возьми,вы правы, я только пробовал ставить в Root имя нужной папки, после чего всё что выше обрезалось. А передавать в Directory параметр - папку для позиционирования - я не догадался - не хватило терпения перечитать Help
...
The directory passed to the function with the Directory parameter appears as the currently selected directory when the dialog box appears.
...
Однако моя реализация этой ф-ии позволяет не подключать FileCtrl, но надо подключать ShlObj, ActiveX.
В результате єкономим ~ 3 кб :) (Ещё можно выбрать новый стиль отображения папки диалогового окна.)
Спасибо за внимание.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c