Главная страница
    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.019 c
14-25519
kronprince
2003-12-19 16:19
2004.01.09
Поздравляю присутствующих с Днем энергетика !!!


3-25200
Stinger
2003-12-11 22:35
2004.01.09
курсоры Oracle


3-25256
PaveLL
2003-12-10 13:28
2004.01.09
sql


3-25188
perova
2003-12-12 13:42
2004.01.09
Уважаемые мастера, подскажите, пожалуйста, как скрыть сценарий БД


6-25497
sipliy
2003-11-10 11:32
2004.01.09
Бьются файлы при закачке их на ftp сервер.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский