Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.004 c
2-1354114312
AntonMos
2012-11-28 18:51
2013.07.28
Fastreport


2-1354223407
Natashka90
2012-11-30 01:10
2013.07.28
SelectDirectory и поле ввода пути


3-1291630604
DOA User
2010-12-06 13:16
2013.07.28
Проблема с вставкой/редактированием записей в TOracleDataSet


15-1362384811
Pit
2013-03-04 12:13
2013.07.28
В ProcessExplorer видно,что DLL загружена 2 раза


15-1362523636
Хыхы
2013-03-06 02:47
2013.07.28
Какими горячими клавишами...





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