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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2024, 17:56   #1  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,944 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
? Ax2012 ActiveX WebBrowser - странное поведение
Всем привет.

Хотелось обсудить странное поведение компонента Web browser. Мы используем этот ActiveX на форме. Отображаем при его помощи простую страничку (немного текста и картинок). Страничка сделана под Edge.
Выяснилась интересная особенность. (все описание сделано для Ax2012- R3 но проблема актуальная и для 2009-й)

Если для ActiveX контрола вызвать метод Navigate указав путь к файлу html то все отображается корректно, так как в Edge (как задумал наш верстальщик)
Но если подготовленный html не сохранять в файл, а в виде строковой переменной htmlText скормить сразу ActiveX контролу (MyActiveXcontrol) вызовом
X++:
SysHelp::showHelp(MyActiveXcontrol, htmlText);
(а так в стандартной аксапте во многих местах и делается, например - форма сравнения узлов AOT, форма контрольного списка установки обновления и.т.п.),
то (Внимание!) ни фига мы не получим отображения как в Edge. Вокруг картинок будут черные рамочки (см файлы со скриншотами AsIE8_IE10_ShapeIsCorrupted.png и AsEdge_ShapeIsOk.png)
Немного помедитировав над полученным отображением, я догадался что оно соответствует какому-то из режимов отображения (IE8, IE9, IE10). При отображении в последней версии IE можно настройкой совместимости по F12 также добиться черных рамочек..

Как-то непоследовательно себя ведет ActiveX Web browser

Стали копать. Хочется, чтобы одинаково было.
Выяснилось, что при вызове SysHelp::showHelp() аксапта сперва требует от контрола отобразить пустую страничку из ресурса res://mshtml.dll/blank.htm (см. метод SysHelp::initWebBrowser) затем получает Com объект Document (SysHelp::insertHTML2Document) и пишет в него текст html из переменной. И в этот момент ActiveX отрисовывает страничку.
Но почему-то в режиме совместимости с предыдущей версией IE.
технология такая же как описано тут
https://habr.com/ru/articles/163841/
http://www.msvb.narod.ru/doc_webbrowser_p1.htm
http://www.msvb.narod.ru/doc_webbrowser_p2.htm
)

Одна из догадок в том, что шаблон пустой страницы res://mshtml.dll/blank.htm уже подразумевает режим совместимости, так что мы его не можем перекрыть в тексте нашего html.
О чем-то подобном описано тут
https://mpbox.ru/manuals/html/meta-t...ua-compatible/
Цитата:
PHP код:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
Тег должен находиться в секции head страницы перед всеми остальными элементами, за исключением title и других мета-элементов. В противном случае он игнорируется!
Вроде бы мы нашли причину?
Пробуем исправить.
Делаем свой файлик пустышку, который используем для инициализации контрола вместо res://mshtml.dll/blank.htm, прописывая в его заголовке нужный нам режим совместимости
PHP код:
<meta http-equiv="X-UA-Compatible" content="ie=edge"
, чтобы затем уже подсунуть ему в SysHelp::insertHTML2Document нужный нам сгенерированный html
И!

Фокус не удался.
Пробовали разные варианты

Так
PHP код:
<!doctype html>
<
html lang="en">
<
head>
<
meta charset="UTF-16LE">
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
<
meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</
head>
<
body></body>
</
html
так
PHP код:
<html>
<
head>
<
meta http-equiv="X-UA-Compatible" content="ie=edge" />
</
head>
<
body></body>
</
html
так
PHP код:
<HTML>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</
HTML
и так
PHP код:
<HTML>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
HTML
и эдак
PHP код:
<!doctype html>
<
HTML>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
HTML
и вот так
PHP код:
<!doctype html>
<
HTML>
<
head>
<
meta http-equiv="X-UA-Compatible" content="ie=edge">
</
head>
</
HTML
и никак не работает.
Даже взяли, сделали сперва Navigate на наш рабочий файлик с html, а затем его же содержимое скормили контролу через SysHelp::showHelp
И так тоже не сработало !

Более того, в тех случаях, когда явно в файле инициализации стоял режим совместимости Edge - вообще ломалось исполнение метода SysHelp::insertHTML2Document !!!

Вызов
X++:
activeX.document();
в методе SysHelp::initWebBrowser
стал возвращать объект другого типа !
Если в нормальном случае это Com для которого ToString() дает значение DispHTMLDocument
То теперь это Com, для которого ToString() дает значение JScriptTypeInfo
а затем при попытке исполнить код
X++:
document.open('');
в методе SysHelp::insertHTML2Document
все валится с ошибкой :
Цитата:
"Число аргументов, указанных в вызове функции, отличается от числа аргументов в объявлении метода."
т.е. явно почему-то пришел объект другого типа.

Похоже у Edge движка какая-то другая объектная модель или другой интерфейс используется. И если уж страничка отобразилась в режиме совместимости Edge вызовом Navigate метода (т.е. в браузере подцепился движок от Edge, а не от IE какой-то из предыдущих версий), то для нее перестает работать получение document() и аксаптовский способ работы с Web browser ломается.


В общем, очень странно.

Может кто-нибудь знает как это побороть ?
Есть альтернативы ?
Может WebView2 ?
https://learn.microsoft.com/ru-ru/mi...arted/winforms

или задействовать .net контрол WebBrowser (там есть готовые методы NavigateToString и NavigateToStream)
https://learn.microsoft.com/en-us/do...stem-io-stream)
https://learn.microsoft.com/en-us/do...(system-string)


P.S.
Зачем понадобился весь этот гемор.
Хотелось обойтись без сохранения html текста во временный файл, а сразу из X++ переменной подставлять созданный html

Архив с файликами выложил (на форуме уже места нет для моих вложений) сюда :
https://github.com/KozlovPavel677/Ax2012_WebBrowser

Последний раз редактировалось Logger; 07.02.2024 в 18:28.
За это сообщение автора поблагодарили: Товарищ ♂uatr (14).
Теги
activex, webbrowser

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX2009 Странное поведение пакетного сервера Raven Melancholic DAX: Администрирование 7 06.11.2019 22:32
ax2012 и activex в пакетной обработке Omeo DAX: Программирование 8 17.09.2015 11:10
Странное поведение при обновлении форм ах2009 DmitryK DAX: Функционал 26 18.03.2013 15:48
Странное поведение ttsAbort Logger DAX: Программирование 6 28.05.2009 15:11
Странное поведение резервирования после создания спланированной закупки. NEO DAX: Функционал 7 01.07.2004 14:03
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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