Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-25517
Jih
2003-12-16 00:15
2004.01.09
Нужна база на interbase


14-25557
Михааааааааааааа
2003-12-18 15:29
2004.01.09
Важная инфа


4-25641
dream
2003-11-06 12:18
2004.01.09
как создать новую форму программно?


3-25229
h0use
2003-12-10 15:32
2004.01.09
Как получить внесенные изменения из DBGrid


11-25270
Ал
2003-04-18 16:48
2004.01.09
Работа с COM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский