AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.07.2005, 10:11   #1  
Dimsun is offline
Dimsun
Участник
 
4 / 10 (1) +
Регистрация: 22.07.2005
Ситуация:
На формочке есть поле, содержащее путь к определенной папке. При нажатии на AssistEdit открывается стандатрый Windows диалог выбора папки.
Это реализовано через стандартный Automation 'Microsoft Shell Controls And Automation'.Shell.
Для вызова диалога используется метод BrowseForFolder.
Вопрос:
Первым параметром этому методу необходимо передать Handle активного окна.
Как мне, используя Стандартные Automation получить этот Handle окна Navision?

Сейчас это реализовано при помоще специально написаной dll, но честно говоря, этот способ мне не очень нравиться. Если что-нибудь по изящее?

Спасибо.
Старый 22.07.2005, 13:22   #2  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
А что такое Handle?
__________________
MBS Certified Master in Navision Developer
Старый 22.07.2005, 13:28   #3  
Dimsun is offline
Dimsun
Участник
 
4 / 10 (1) +
Регистрация: 22.07.2005
Handle - это специальный дескриптор, используется в Windows для уникальной идентификации объекта или ресурса.
В данном случае, он нужен для того, чтобы запускать окно в модальном режиме.
Старый 22.07.2005, 13:40   #4  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Панятно.
А есть какие-то причины, чтобы не использовать (как это в NAvision обычно делается) OCX: Microsoft Common Dialog Control?
__________________
MBS Certified Master in Navision Developer
Старый 22.07.2005, 15:05   #5  
Dimsun is offline
Dimsun
Участник
 
4 / 10 (1) +
Регистрация: 22.07.2005
Цитата:
Сообщение от Роман
Панятно.
А есть какие-то причины, чтобы не использовать (как это в NAvision обычно делается) OCX: Microsoft Common Dialog Control?
К сожалению, использовать OCX: Microsoft Common Dialog Control нельзя, т.к. он позволяет показывать только диалоги открытия или закрытия файлов. А мне необходимо, чтобы пользователь мог выбрать только дирректорию (например, при любой инсталяции, выбор папки, куда инсталировать).
Эта задача возникла потому, что пользователю ежедневно необходимо загружать порядка 20 файлов одного формата, и заставлять его ежедневно 20 раз последовательно указывать загружаемый файл мне как-то не хочется. Поэтому я сделал, что он просто выбирает директорию, где эти файлы лежат, и они скопом загружаются...
Старый 22.07.2005, 15:33   #6  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Ситуацию понял. Но ведь можно сделать механизм обработки такой (при исользовании OCX), что если пользователь выбрал один какой-нибудь файл, то загружаются все файлы из выбранной директории. Я, честно говоря, не мудрствуя лукаво, так и поступил с подобной задачей.
__________________
MBS Certified Master in Navision Developer
Старый 22.07.2005, 15:37   #7  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
К сожалению, с помощью стандартных объектов automation и OCX, получить хендл нельзя.

В качестве более изящного способа могу предложить реализовать BrowseForFolder через scripting (например на jscript), а вызов диалога выбора папки через Microsoft Script Control.

В общих чертах это будет выглядеть так:
<div class='CALtop'>C/AL</div><div class='CAL'>
CREATE(MsScriptControl);
Str := 'function browse()';
Str += '{';
Str += '  var WSHShellApp = WScript.CreateObject("Shell.Application");';
Str += '  var SelectedItem = WSHShellApp.BrowseForFolder(0, Prompt, BrowseInfo, StartFolder);';
MsScriptControl.AddCode(Str);
MESSAGE('Ваш путь: %1',FORMAT(MsScriptControl.Run('browse()',SafeArray)));
</div>
Старый 22.07.2005, 15:57   #8  
Dimsun is offline
Dimsun
Участник
 
4 / 10 (1) +
Регистрация: 22.07.2005
Цитата:
Сообщение от tyrex
К сожалению, с помощью стандартных объектов automation и OCX, получить хендл нельзя.

В общих чертах это будет выглядеть так:
<div class='CALtop'>C/AL</div><div class='CAL'>
CREATE(MsScriptControl);
Str := 'function browse()';
Str += '{';
Str += '  var WSHShellApp = WScript.CreateObject("Shell.Application");';
Str += '  var SelectedItem = WSHShellApp.BrowseForFolder(0, Prompt, BrowseInfo, StartFolder);';
MsScriptControl.AddCode(Str);
MESSAGE('Ваш путь: %1',FORMAT(MsScriptControl.Run('browse()',SafeArray)));
</div>
В таком случае, если я правильно понимаю, диалоговое окно откроется не в модальном режиме: при вызове BrowseForFolder, в качестве Handle передается 0, т.е. Desktop. А пользователь по прежнему сможет работать с Navision, забыв преспокойненько про открытое окно.
Открыть диологовое окно у меня проблем не вызывает, а вызывает сложность заставить это окно открытся в Runmodal режиме, использую только C-AL и стандартные dll.

Dll, которую я использую, была мною скачена с mibuso.com вместе с исходниками. Она используя user32.dll выдает handle активного окна, в моем случае Navision. От туда, кстати, я и взял идею открытия диалогового окна через Automation.

В общем всем Спасибо. Придеться ташить к клиенту эту dll и там на всех машинах, где она может использоваться, ее регистрить..
Старый 22.07.2005, 16:07   #9  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Все таки, могли бы использовать Microsoft Common Dialog Control.
В отчете надо было бы просто первым Item ом сделать таблицу File и добавить небольшой кусочек кода для обработки всех файлов из директории.
Ну, хозяин - барин.
__________________
MBS Certified Master in Navision Developer
Старый 22.07.2005, 16:16   #10  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
2Dimsun:
Вообще нет, т.к. automation (в отличии от ocx) можно очищать при закрытии формы - т.е окно болтаться не будет
Старый 26.07.2005, 11:17   #11  
zm is offline
zm
Участник
 
44 / 10 (1) +
Регистрация: 15.07.2003
Адрес: Латвия
Можно сделать выбор foldera разместив shell-объекты в модальной форме:
на OnAssistEdit - примерно так (взял из 2.6)

CLEAR(PhantomForm); //PhantomForm-> "Phantom Folder Browser"
PhantomForm.SetFolder("Folder Name");
IF PhantomForm.RUNMODAL = ACTION::Close THEN BEGIN
IF STRLEN(PhantomForm.GetFolder) <> 0 THEN "Folder Name" := PhantomForm.GetFolder;
CurrForm.UPDATE;
END;
CLEAR(PhantomForm);
[attachment=247:attachment]
Вложения
Тип файла: txt Phantom_Folder_Browser.txt (1.4 Кб, 322 просмотров)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:22.