Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.07.28;
Скачать: CL | DM;

Вниз

SelectDirectory и поле ввода пути   Найти похожие ветки 

 
Natashka90   (2012-11-30 01:10) [0]

Здравствуйте!
Столкнулась с проблемой такой:
Использую расширенную функцию SelectDirectory с полем ввода (sdShowEdit). Все работает замечательно, кроме одного - нет возможности в диалоге выбора в поле edit ввести несуществующую папку или путь, а также адрес URL сайта. Если папки не существует, то подставляется дефолтное значение, а если вводишь URL, к примеру http://localhost, то пишет ошибку "Невозможно использовать такую папку http://localhost. Выберите другую папку."
Не подскажите как это поправить или может использовать другую функцию для выбора директории/пути к файлу?
Спасибо!
Delphi2009


 
sniknik ©   (2012-11-30 02:10) [1]

> для выбора директории/пути к файлу?
из http ??? а ничего, что его нету в этом протоколе?


 
Natashka90 ©   (2012-11-30 12:54) [2]

Я имела в виду, что можно ли как-то обойти в этой функции проверку корректности введенного пути или доступности указанного пути?
Дело в том, что при выборе пути, возвращаемое значение пишется string-ом в итем ComboBox-а, т.е. не используется прямого доступа к пути после отработки функции.
Или может есть какой-то готовый аналогичный компонент без таких проверок или с возможностью отключения?
Посмотрела форумы по интернету на эту тему, особого ничего нет про это.

Буду благодарна за ответы. Если нет выхода, то остается вариант написать свой диалог в дополнительной форме с использованием TreeVeiw.


 
Игорь Шевченко ©   (2012-11-30 13:27) [3]


> Или может есть какой-то готовый аналогичный компонент без
> таких проверок или с возможностью отключения?


Edit c кнопкой, вводи, что хочешь


 
Natashka90 ©   (2012-11-30 13:56) [4]

Просто Edit не подойдет. Нужно еще дерево каталогов на выбор. Склоняюсь к собственной форме с TreeView. Правда пока только в теории, еще такое не пробовала делать.


 
sniknik ©   (2012-11-30 14:32) [5]

> Нужно еще дерево каталогов на выбор.
откуда оно возьмется для  http://localhost ???


 
Natashka90 ©   (2012-11-30 14:42) [6]

Для http не нужно дерево никакое выводить.

Я задала такой вопрос (может в первом сообщении и слишком много написала, но подумала, что это будет более полным описанием проблемы): как отключить/обойти в SelectDirectory проверку введенного значения в поле Edit диалога выбора?
Если это не возможно, то вопрос можно закрыть.


 
sniknik ©   (2012-11-30 15:18) [7]

> но подумала, что это будет более полным описанием проблемы):
не думай! как только возникает желание чего-то полно описать приводи код!

> как отключить/обойти в SelectDirectory проверку введенного значения в поле Edit диалога выбора?
вообще то она не делается(если не выбрано Perform конечно, тогда при попытке создать заведомо кливую директорию...), исходники же есть, можно посмотреть...


 
Игорь Шевченко ©   (2012-11-30 15:32) [8]


> Просто Edit не подойдет. Нужно еще дерево каталогов на выбор.
>  Склоняюсь к собственной форме с TreeView. Правда пока только
> в теории, еще такое не пробовала делать.


procedure TfMain.sbPathClick(Sender: TObject);
var
 S: string;
begin
 S := emPathName.Text;
 if not DrectoryExists(S) then
   S := ""; //или любое желаемое значение
 if SelectDirectory(S, [], 0) then
   emPathName.Text := S;
end;

не понимаю в чем проблема


 
Natashka90 ©   (2012-11-30 15:34) [9]

Какой тут код приводить?:)
function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts; Parent: TWinControl): Boolean;

TSelectDirExtOpts может содержать эти значения sdNewFolder, sdShowEdit, sdShowShares, sdNewUI, sdShowFiles, sdValidateDir

Нет тут никаких отключающих параметров проверки, например sdNoValidateDir.

Даже при таком вызове идет проверка:
SelectDirectory("Selecte dir","","",sdShowEdit,0); (не копипаст с кода)

Вот и вопрос возник.


 
Natashka90 ©   (2012-11-30 15:40) [10]


> procedure TfMain.sbPathClick(Sender: TObject);
> var
>  S: string;
> begin
>  S := emPathName.Text;
>  if not DrectoryExists(S) then
>    S := ""; //или любое желаемое значение
>  if SelectDirectory(S, [], 0) then
>    emPathName.Text := S;
> end;
>
> не понимаю в чем проблема

Опишу подробно какой алгоритм:
- есть комбобокс с набором разных путей
- есть кнопка "Добавить в список...", по нажатию которой открывается диалог выбора директории с полем ввода. В поле ввода должно быть разрешено вводить всё что душе угодно и после нажатия на "ОК" в диалоге,  текст с edit (поле в диалоге) попадает новым элементом в комбобокс.

Приведенный Вами код выше не подходит под эту задачу и Вы используете вызов диалога без поля, т.е. сокращенную функцию SelectDirectory. Не подходит :(


 
Игорь Шевченко ©   (2012-11-30 15:48) [11]

http://groups.google.com/group/microsoft.public.win32.programmer.ui/browse_thread/thread/ecc5bc12cbae1f51/4c403a98603a5aa7?lnk=gst&q=BIF_RETURNONLYFSDIRS++BIF_USENEWUI


 
sniknik ©   (2012-11-30 15:55) [12]

> Даже при таком вызове идет проверка:
> 1 SelectDirectory("Selecte dir","","",sdShowEdit,0); (не копипаст с кода)
в FileCtrl у D7 2 оверрайдед функции, я вот пробовал так -
SelectDirectory(sDir, [sdAllowCreate], 0);
проверок нет.

а твоего варианта в моей дельфе нет, т.е. у тебя есть еще варианты "перекрытий" или нестандартный модуль.


 
Natashka90 ©   (2012-11-30 16:12) [13]


> Игорь Шевченко ©   (30.11.12 15:48) [11]

Уффф. Там всё английский. Придется переводить долго. Вкратце можете объяснить о чем там речь?


> в FileCtrl у D7 2 оверрайдед функции, я вот пробовал так
> -
> SelectDirectory(sDir, [sdAllowCreate], 0);
> проверок нет.
>
> а твоего варианта в моей дельфе нет, т.е. у тебя есть еще
> варианты "перекрытий" или нестандартный модуль.
У меня Delphi 2009. Стандартный FileCtrl http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.FileCtrl.SelectDirectory

sdAllowCreate - будет создавать папки, а когда наткнется на http будет ругаться. Да и не наткнется, т.к. нет в Вашем случае использования функции поля ввода пути вручную.

Неужели у меня ничего не выйдет со стандартной функцией...


 
sniknik ©   (2012-11-30 16:13) [14]

вариант из "твоего" 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);

проверок нет.


 
sniknik ©   (2012-11-30 16:14) [15]

> sdAllowCreate - будет создавать папки
> вообще то она не делается(если не выбрано Perform конечно


 
sniknik ©   (2012-11-30 16:17) [16]

> Да и не наткнется, т.к. нет в Вашем случае использования функции поля ввода пути вручную.
как нет? а куда же я при проверке url вводил????? галюны! спасите! (вот что общение с блондинками делает...)


 
Natashka90 ©   (2012-11-30 16:31) [17]


> как нет? а куда же я при проверке url вводил????? галюны!
>  спасите! (вот что общение с блондинками делает...)

:)
Хорошо. Я не за дельфи сейчас, поэтому не проверяла. Но почему-то помню, что от короткой SelectDirectory отказалась именно из-за того, что там этого поля нет, а вот в расширенной функции есть.

Спасибо за помощь, проверю и отпишусь.


 
Natashka90 ©   (2012-11-30 19:41) [18]


> 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);

Не очень поняла в какую переменную возвращается выбранная директория при отработке этого кода. При его запуске открывается вполне нормальный диалог, вроде ничего не проверяет, но и не выдает ничего на выход функции. Можете подсказать как использовать приведенный код и получить на выходе выбранный путь?


 
знайка   (2012-11-30 20:52) [19]

Сделайте не просто кнопку а кнопкку с меню. 1 пункт  выбор локального пути (SelectDirectory), 2 пункт - ввести урл. Всем хорошо будет. :)


 
Natashka90 ©   (2012-11-30 21:03) [20]


> Сделайте не просто кнопку а кнопкку с меню. 1 пункт  выбор
> локального пути (SelectDirectory), 2 пункт - ввести урл.
>  Всем хорошо будет. :)

Не красиво так будет, да и меню не охота делать.

В общем перечитала кучу чего и пришла к выводу, что это дело не обойти в стандартных функциях BrowseInfo, на основе которых, в том числе, и работает SelectDirectory.
Придется обдумывать свой вариант диалога...

Всем спасибо. Тему можно закрыть.


 
sniknik ©   (2012-11-30 21:16) [21]

> что это дело не обойти в стандартных функциях BrowseInfo
что значит "не обойти"? выше 2 разных варианта "обсуждали"... один почти под копипаст (но а самом деле лучше из своих 2009го исходников скопировать да изменить по аналогии).


 
Natashka90 ©   (2012-11-30 22:52) [22]

Я пробовала уже все. Не получилось. Два варианта выше:
1 - диалог в формате аля вин 3.1. Это не подходит сразу и не вписывается в программу
2 - так и не сказали как вытащить из приведенного кода путь, но я нашла аналоги такого же кода, пробовала менять флаги и все равно - проверка идет.

Вы сами попробуйте добиться, чтобы
1 - был интерфейс диалога в оформлении NEWUI
2 - не возвращался пустой путь при выборе несуществующих путей (нет папки на диске или в сети, адрес http).

Кстати, в Вашем варианте, как раз возвращается либо пустой путь, либо тот, который изначально указывается функции при "некорректном" выборе.


 
Игорь Шевченко ©   (2012-11-30 23:04) [23]


> 2 - не возвращался пустой путь при выборе несуществующих
> путей (нет папки на диске или в сети, адрес http).


Естественно, потому что BrowseForFolder возвращает PIDLIST. Если только через callback как-то попробовать исхитриться


 
Natashka90 ©   (2012-11-30 23:09) [24]


> Естественно, потому что BrowseForFolder возвращает PIDLIST.
>  Если только через callback как-то попробовать исхитриться

У меня, к сожалению, не хватает познаний в этой области для вот таких действий. Поэтому я и обратилась на форум за помощью.
Если подвести итог, то нужно, чтобы функция возвращала вместо пустого значения в случае недоступности выбранного то, что написано в edit. Как это сделать я не знаю...


 
Игорь Шевченко ©   (2012-11-30 23:20) [25]


> В поле ввода должно быть разрешено вводить всё что душе
> угодно и после нажатия на "ОК" в диалоге,  текст с edit
> (поле в диалоге) попадает новым элементом в комбобокс


Если допускается вводить "Я тут ввел всякую $%^$*\....\", то только свой диалог. Или читать документацию. В документации написано, что ShBrowseForFolders умеет показывать (и вводить) url, при установке нужных флагов BIF_BROWSEINCLUDEURLS or BIF_USENEWUI or BIF_BROWSEINCLUDEFILES.


 
Natashka90 ©   (2012-11-30 23:38) [26]

Попробовала с 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:41) [27]


>  lpItemID := SHBrowseForFolder(BrowseInfo);


Здесь что возвращается ?


 
Игорь Шевченко ©   (2012-11-30 23:42) [28]


> or BIF_BROWSEINCLUDEFILES


 
Natashka90 ©   (2012-11-30 23:54) [29]


>
> >  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


 
Natashka90 ©   (2012-11-30 23:58) [30]

Кстати, заметила, что если ввести http://localhost, то функция возвращает пустое значение, а если www.yandex.ru, то подставляет изначальное значение директории, переданное при вызове функции.


 
Natashka90 ©   (2012-12-01 00:06) [31]

Если провести аналогию, не изучаю тонны документации, то  BIF_BROWSEINCLUDEURLS тоже самое по смыслу действия, что и BROWSEFORPRINTER. Т.е. это не влияет на поле ввода, а только на видимость ресурсов в диалоге. В общем я в тупике оказалась с этой функцией и аналогов не нашла, которые решали бы эту проблему. Думаю, что нужно писать самой какой-то аналог функции или же придумывать костыли, как подсказала зайка.


 
Natashka90 ©   (2012-12-01 00:09) [32]


> как подсказала зайка.
простите, зНайка :) От усталости уже кнопки пропускаю при наборе текста :)


 
Германн ©   (2012-12-01 01:41) [33]


> Опишу подробно какой алгоритм:
> - есть комбобокс с набором разных путей
> - есть кнопка "Добавить в список..."

Это описание как бы, несколько, конфликтует с
> а если вводишь URL, к примеру http://localhost


 
KilkennyCat ©   (2012-12-01 13:00) [34]

Я б свой диалог создал. так проще.



Страницы: 1 вся ветка

Текущий архив: 2013.07.28;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.008 c
15-1362342603
Юрий
2013-03-04 00:30
2013.07.28
С днем рождения ! 4 марта 2013 понедельник


8-1232225815
Vemer
2009-01-17 23:56
2013.07.28
Эффект увеличительного стекла.


15-1362377389
O'ShinW
2013-03-04 10:09
2013.07.28
Почем нынче и в какие сроки раскрутят сайт? Опыт у кого есть?


15-1362488545
fpc_user
2013-03-05 17:02
2013.07.28
Существует ли современная безплатная Delphi ?


15-1362429004
Юрий
2013-03-05 00:30
2013.07.28
С днем рождения ! 5 марта 2013 вторник