Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SelectDirectory и поле ввода пути


Страницы:   1 2

Natashka90 ©   (2012-11-30 01:10:00) 

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


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

вариант из "твоего" 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:12:00) [22]


> Игорь Шевченко ©   (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 15:55:00) [23]

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

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


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

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


Natashka90   (2012-11-30 15:40:00) [25]


> 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. Не подходит :(


Natashka90   (2012-11-30 15:34:00) [26]

Какой тут код приводить?:)
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); (не копипаст с кода)

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


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


> Просто 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;

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


sniknik   (2012-11-30 15:18:00) [28]

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

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


Natashka90   (2012-11-30 14:42:00) [29]

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

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


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

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


Natashka90   (2012-11-30 13:56:00) [31]

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


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


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


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


Natashka90   (2012-11-30 12:54:00) [33]

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

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


sniknik   (2012-11-30 02:10:00) [34]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо