![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SelectDirectory и поле ввода пути
Natashka90 © (2012-11-30 01:10:00)Здравствуйте!
Столкнулась с проблемой такой:
Использую расширенную функцию SelectDirectory с полем ввода (sdShowEdit). Все работает замечательно, кроме одного - нет возможности в диалоге выбора в поле edit ввести несуществующую папку или путь, а также адрес URL сайта. Если папки не существует, то подставляется дефолтное значение, а если вводишь URL, к примеру http://localhost, то пишет ошибку "Невозможно использовать такую папку http://localhost.Выберите другую папку."
Не подскажите как это поправить или может использовать другую функцию для выбора директории/пути к файлу?
Спасибо!
Delphi2009
KilkennyCat (2012-12-01 13:00:00) [1]Я б свой диалог создал. так проще.
Германн (2012-12-01 01:41:00) [2]
> Опишу подробно какой алгоритм:
> - есть комбобокс с набором разных путей
> - есть кнопка "Добавить в список..."
Это описание как бы, несколько, конфликтует с
> а если вводишь URL, к примеру http://localhost
Natashka90 (2012-12-01 00:09:00) [3]
> как подсказала зайка.
простите, з Найка :) От усталости уже кнопки пропускаю при наборе текста :)
Natashka90 (2012-12-01 00:06:00) [4]Если провести аналогию, не изучаю тонны документации, то BIF_BROWSEINCLUDEURLS тоже самое по смыслу действия, что и BROWSEFORPRINTER. Т.е. это не влияет на поле ввода, а только на видимость ресурсов в диалоге. В общем я в тупике оказалась с этой функцией и аналогов не нашла, которые решали бы эту проблему. Думаю, что нужно писать самой какой-то аналог функции или же придумывать костыли, как подсказала зайка.
Natashka90 (2012-11-30 23:58:00) [5]Кстати, заметила, что если ввести http://localhost, то функция возвращает пустое значение, а если www.yandex.ru, то подставляет изначальное значение директории, переданное при вызове функции.
Natashka90 (2012-11-30 23:54:00) [6]
>
> > lpItemID := SHBrowseForFolder(BrowseInfo);
>
>
> Здесь что возвращается ?
Игорь, а как правильно вытащить? Если делаю showmessage (PChar(lpItemId)), то выдается китайская грамота, даже при верном выборе (и при не верном тоже).
> > or BIF_BROWSEINCLUDEFILES
Пробовала ранее и сейчас еще раз - эффекта ноль. Я вообще все флаги, которые нашла, пробовала в разных вариантах совместного использования:
BFFM_INITIALIZED
BFFM_SELCHANGED
BFFM_VALIDATEFAILED
BFFM_SETSTATUSTEXT
BFFM_ENABLEOK
BFFM_SETSELECTIONA
BIF_RETURNONLYFSDIRS
BIF_DONTGOBELOWDOMAIN
BIF_STATUSTEXT
BIF_RETURNFSANCESTORS
BIF_EDITBOX
BIF_VALIDATE
BIF_NEWDIALOGSTYLE
BIF_BROWSEINCLUDEURLS
BIF_BROWSEFORCOMPUTER
BIF_BROWSEFORPRINTER
BIF_BROWSEINCLUDEFILES
BIF_SHAREABLE
BIF_USENEWUI
Игорь Шевченко (2012-11-30 23:42:00) [7]
> or BIF_BROWSEINCLUDEFILES
Игорь Шевченко (2012-11-30 23:41:00) [8]
> lpItemID := SHBrowseForFolder(BrowseInfo);
Здесь что возвращается ?
Natashka90 (2012-11-30 23:38:00) [9]Попробовала с BIF_BROWSEINCLADEURLS. Возвращает пустой каталог.
Вызов функции:
MyPath:=BrowseForFolder('Test','c:',Application.Handle)
Сама функция:
function BrowseForFolder (const caption: String; folder: String; FormHandle: THandle): String;
function BFFCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): integer; stdcall;
begin
if uMsg = BFFM_INITIALIZED then SendMessage(hwnd, BFFM_SETSELECTION, 1, lpData);
result := 0;
end;
var
TitleName : String;
lpItemID : PItemIDList;
BrowseInfo : TBrowseInfo;
DisplayName : Array [0..MAX_PATH] of char;
TempPath : Array [0..MAX_PATH] of char;
begin
FillChar(BrowseInfo, SizeOf(TBrowseInfo), #0);
BrowseInfo.hwndOwner := FormHandle;
BrowseInfo.pszDisplayName := @DisplayName;
TitleName := Caption;
BrowseInfo.lpszTitle := PChar(TitleName);
BrowseInfo.ulFlags := BIF_USENEWUI or BIF_BROWSEINCLUDEURLS or BIF_SHAREABLE;
BrowseInfo.lpfn := @BFFCallbackProc;
BrowseInfo.lParam := dword(pchar(folder));
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
GlobalFreePtr(lpItemID);
Result := TempPath;
end
else
Result := '';
end;
Игорь Шевченко (2012-11-30 23:20:00) [10]
> В поле ввода должно быть разрешено вводить всё что душе
> угодно и после нажатия на "ОК" в диалоге, текст с edit
> (поле в диалоге) попадает новым элементом в комбобокс
Если допускается вводить "Я тут ввел всякую $%^$*\....\", то только свой диалог. Или читать документацию. В документации написано, что ShBrowseForFolders умеет показывать (и вводить) url, при установке нужных флагов BIF_BROWSEINCLUDEURLS or BIF_USENEWUI or BIF_BROWSEINCLUDEFILES.
Natashka90 (2012-11-30 23:09:00) [11]
> Естественно, потому что BrowseForFolder возвращает PIDLIST.
> Если только через callback как-то попробовать исхитриться
У меня, к сожалению, не хватает познаний в этой области для вот таких действий. Поэтому я и обратилась на форум за помощью.
Если подвести итог, то нужно, чтобы функция возвращала вместо пустого значения в случае недоступности выбранного то, что написано в edit. Как это сделать я не знаю...
Игорь Шевченко (2012-11-30 23:04:00) [12]
> 2 - не возвращался пустой путь при выборе несуществующих
> путей (нет папки на диске или в сети, адрес http).
Естественно, потому что BrowseForFolder возвращает PIDLIST. Если только через callback как-то попробовать исхитриться
Natashka90 (2012-11-30 22:52:00) [13]Я пробовала уже все. Не получилось. Два варианта выше:
1 - диалог в формате аля вин 3.1. Это не подходит сразу и не вписывается в программу
2 - так и не сказали как вытащить из приведенного кода путь, но я нашла аналоги такого же кода, пробовала менять флаги и все равно - проверка идет.
Вы сами попробуйте добиться, чтобы
1 - был интерфейс диалога в оформлении NEWUI
2 - не возвращался пустой путь при выборе несуществующих путей (нет папки на диске или в сети, адрес http).
Кстати, в Вашем варианте, как раз возвращается либо пустой путь, либо тот, который изначально указывается функции при "некорректном" выборе.
sniknik (2012-11-30 21:16:00) [14]> что это дело не обойти в стандартных функциях BrowseInfo
что значит "не обойти"? выше 2 разных варианта "обсуждали"... один почти под копипаст (но а самом деле лучше из своих 2009го исходников скопировать да изменить по аналогии).
Natashka90 (2012-11-30 21:03:00) [15]
> Сделайте не просто кнопку а кнопкку с меню. 1 пункт выбор
> локального пути (SelectDirectory), 2 пункт - ввести урл.
> Всем хорошо будет. :)
Не красиво так будет, да и меню не охота делать.
В общем перечитала кучу чего и пришла к выводу, что это дело не обойти в стандартных функциях BrowseInfo, на основе которых, в том числе, и работает SelectDirectory.
Придется обдумывать свой вариант диалога...
Всем спасибо. Тему можно закрыть.
знайка (2012-11-30 20:52:00) [16]Сделайте не просто кнопку а кнопкку с меню. 1 пункт выбор локального пути (SelectDirectory), 2 пункт - ввести урл. Всем хорошо будет. :)
Natashka90 (2012-11-30 19:41:00) [17]
> SelectDirectory(sDir, [sdAllowCreate], 0);
> проверок нет.
Тут проверок нет, но меня не устраивает вид диалога аля Win3.1. Нужно с нормальным системным видом как в XP или Win7. А это доступно только в расширенной SelectDirectory
> чуток переделал, из его кода, получить "расширенное" -
> function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData:
> LPARAM): Integer stdcall;
> begin
> if (uMsg = BFFM_INITIALIZED) and (lpData <> 0) then
> SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpdata);
>
> result := 0;
> end;
>
> var
> BrowseInfo: TBrowseInfo;
> IDesktopFolder: IShellFolder;
> Root: WideString;
> Eaten, Flags: LongWord;
> RootItemIDList: PItemIDList;
> Buffer: PChar;
> ShellMalloc: IMalloc;
> Directory: string;
> begin
> Directory:= 'C:\';
>
> SHGetDesktopFolder(IDesktopFolder);
> IDesktopFolder.ParseDisplayName(Application.Handle, nil,
> POleStr(Root), Eaten, RootItemIDList, Flags);
>
> ShGetMalloc(ShellMalloc);
> Buffer:= ShellMalloc.Alloc(MAX_PATH);
> with BrowseInfo do begin
> hwndOwner := Application.Handle;
> pidlRoot := RootItemIDList;
> pszDisplayName:= Buffer;
> lpszTitle := PChar(Caption);
> ulFlags := BIF_RETURNONLYFSDIRS or BIF_EDITBOX;
>
> if Directory <> '' then begin
> lpfn := SelectDirCB;
> lParam:= Integer(PChar(Directory));
> end;
> end;
> ShBrowseForFolder(BrowseInfo);
Не очень поняла в какую переменную возвращается выбранная директория при отработке этого кода. При его запуске открывается вполне нормальный диалог, вроде ничего не проверяет, но и не выдает ничего на выход функции. Можете подсказать как использовать приведенный код и получить на выходе выбранный путь?
Natashka90 (2012-11-30 16:31:00) [18]
> как нет? а куда же я при проверке url вводил????? галюны!
> спасите! (вот что общение с блондинками делает...)
:)
Хорошо. Я не за дельфи сейчас, поэтому не проверяла. Но почему-то помню, что от короткой SelectDirectory отказалась именно из-за того, что там этого поля нет, а вот в расширенной функции есть.
Спасибо за помощь, проверю и отпишусь.
sniknik (2012-11-30 16:17:00) [19]> Да и не наткнется, т.к. нет в Вашем случае использования функции поля ввода пути вручную.
как нет? а куда же я при проверке url вводил????? галюны! спасите! (вот что общение с блондинками делает...)
sniknik (2012-11-30 16:14:00) [20]> sdAllowCreate - будет создавать папки
> вообще то она не делается(если не выбрано Performконечно