22.07.2005, 10:11 | #1 |
Участник
|
Ситуация:
На формочке есть поле, содержащее путь к определенной папке. При нажатии на AssistEdit открывается стандатрый Windows диалог выбора папки. Это реализовано через стандартный Automation 'Microsoft Shell Controls And Automation'.Shell. Для вызова диалога используется метод BrowseForFolder. Вопрос: Первым параметром этому методу необходимо передать Handle активного окна. Как мне, используя Стандартные Automation получить этот Handle окна Navision? Сейчас это реализовано при помоще специально написаной dll, но честно говоря, этот способ мне не очень нравиться. Если что-нибудь по изящее? Спасибо. |
|
22.07.2005, 13:22 | #2 |
Участник
|
А что такое Handle?
__________________
MBS Certified Master in Navision Developer |
|
22.07.2005, 13:28 | #3 |
Участник
|
Handle - это специальный дескриптор, используется в Windows для уникальной идентификации объекта или ресурса.
В данном случае, он нужен для того, чтобы запускать окно в модальном режиме. |
|
22.07.2005, 13:40 | #4 |
Участник
|
Панятно.
А есть какие-то причины, чтобы не использовать (как это в NAvision обычно делается) OCX: Microsoft Common Dialog Control?
__________________
MBS Certified Master in Navision Developer |
|
22.07.2005, 15:05 | #5 |
Участник
|
Цитата:
Сообщение от Роман
Панятно.
А есть какие-то причины, чтобы не использовать (как это в NAvision обычно делается) OCX: Microsoft Common Dialog Control? Эта задача возникла потому, что пользователю ежедневно необходимо загружать порядка 20 файлов одного формата, и заставлять его ежедневно 20 раз последовательно указывать загружаемый файл мне как-то не хочется. Поэтому я сделал, что он просто выбирает директорию, где эти файлы лежат, и они скопом загружаются... |
|
22.07.2005, 15:33 | #6 |
Участник
|
Ситуацию понял. Но ведь можно сделать механизм обработки такой (при исользовании OCX), что если пользователь выбрал один какой-нибудь файл, то загружаются все файлы из выбранной директории. Я, честно говоря, не мудрствуя лукаво, так и поступил с подобной задачей.
__________________
MBS Certified Master in Navision Developer |
|
22.07.2005, 15:37 | #7 |
Moderator
|
К сожалению, с помощью стандартных объектов 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 |
Участник
|
Цитата:
Сообщение от 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> Открыть диологовое окно у меня проблем не вызывает, а вызывает сложность заставить это окно открытся в Runmodal режиме, использую только C-AL и стандартные dll. Dll, которую я использую, была мною скачена с mibuso.com вместе с исходниками. Она используя user32.dll выдает handle активного окна, в моем случае Navision. От туда, кстати, я и взял идею открытия диалогового окна через Automation. В общем всем Спасибо. Придеться ташить к клиенту эту dll и там на всех машинах, где она может использоваться, ее регистрить.. |
|
22.07.2005, 16:07 | #9 |
Участник
|
Все таки, могли бы использовать Microsoft Common Dialog Control.
В отчете надо было бы просто первым Item ом сделать таблицу File и добавить небольшой кусочек кода для обработки всех файлов из директории. Ну, хозяин - барин.
__________________
MBS Certified Master in Navision Developer |
|
22.07.2005, 16:16 | #10 |
Moderator
|
2Dimsun:
Вообще нет, т.к. automation (в отличии от ocx) можно очищать при закрытии формы - т.е окно болтаться не будет |
|
26.07.2005, 11:17 | #11 |
Участник
|
Можно сделать выбор 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] |
|