Сайт о телевидении

Сайт о телевидении

» » Shell explorer 2 методы. HTML и Кларион. Класс Internet Explorer

Shell explorer 2 методы. HTML и Кларион. Класс Internet Explorer

Введение

Суть современной информационной технологии Digital Dashboard (DD), основанной на программных продуктах Microsoft, заключается в интеграции сведений, получаемых из различных источников информации в одной или нескольких Web-страницах, разрабатываемых для конкретных пользователей - лиц, принимающих решения. Другими словами, эта технология предназначена для организации рабочих мест для ответственных работников коммерческих предприятий: бизнесменов, аналитиков, руководителей разных уровней. Ключевым моментом, определяющим эффективность DD, является наличие достаточно разнообразных источников информации, используемых для принятия решений. Принята следующая классификация таких источников:

  • внешние источники - сведения, получаемые из Интернета и интранета. Это разного рода Web-страницы, Web-запросы, тикеры, Web-камеры и другие средства, доступные в глобальной Сети;
  • корпоративные источники - сведения о положении дел на предприятии в целом и в его подразделениях, в том числе внутренние документы, отчеты и базы данных;
  • групповые источники - средства, предоставляемые технологией Team Folder: календарь проекта, почта и задачи, общие для группы работников;
  • личные источники - предполагается, что эта группа полностью основана на стандартных приложениях Outlook: личной электронной почте, календаре, задачах и контактах.

Наиболее трудоемким процессом в создании DD является интеграция корпоративных источников - требуется ревизия всего документооборота на предприятии и преобразование данных в формы, удобные для анализа. Предполагается, что лучшими инструментами для работы с корпоративной информацией являются Microsoft Office и Microsoft SQL Server. Поэтому технология DD в первую очередь обеспечивает взаимодействие именно с этими средствами. Таким образом, привлекательность новой технологии заключается в том, что она позволяет соединить способность гипертекстовых документов интегрировать разнородную информацию, представленную в самых разнообразных формах, с мощными средствами ее обработки, имеющимися в составе Microsoft Office.

Технически все это выглядит следующим образом. DD - узел из Web-страниц, изготовленных с помощью Visual InterDev, который дополнительно оснащен специальным модулем расширения (Add-In) из пакета DDRK (Digital Dashboard Resource Kit). Стандартная страница DD состоит из совокупности динамических окон, в каждом из которых помещается Web Part - элемент, представляющий собой источник информации. Для отображения DD используется не обычный обозреватель, а Microsoft Outlook, причем домашняя страница DD заменяет стандартный Outlook Today, для чего переписывается его адрес в реестре Windows. DD открывается в приложении Microsoft Outlook, являющемся компонентом Microsoft Office, благодаря чему обеспечивается необходимая связь между Web-страницей и средствами Office.

Однако в действительности все обстоит намного проще. Ключевую роль в системе с DD играет библиотека SHDocVw, которая имеется на любом компьютере, где установлен обозреватель Internet Explorer, и обычно расположена по адресу c:\windows\system\ shdocvw.dll. А Outlook выполняет функцию контейнерного приложения для объектов этой библиотеки. Вероятно, многие программисты, просматривая список доступных элементов управления ActiveX, обнаруживали на своей машине или WebBrowser, или, в русской версии, Обозреватель Web-страниц Microsoft. Это не что иное, как один из компонентов SHDocVw.

Так что возможность организации взаимодействия Web-страниц с приложениями Office, являющаяся основополагающей для технологии DD, существовала довольно давно, по крайней мере с момента появления Microsoft Office 97, оснащенного VBA.

В настоящей статье описываются варианты организации такого взаимодействия, что позволяет создавать DD альтернативным способом, в обход жестких требований к программному обеспечению, предписанных корпорацией Microsoft. Вместе с тем все возможности «стандартных» DD, построенных на базе DDRK, сохраняются и могут быть реализованы по мере необходимости.

Внедренный WebBrowser

В справочной документации для Microsoft Access 97 прямо рекомендуется использовать элемент управления WebBrowser в формах базы данных для придания проекту возможности отображать Web-страницы. Однако WebBrowser прекрасно внедряется не только в формы, но и в обычные документы Office - текстовые документы Word и страницы рабочих книг Excel. Чтобы внедрить WebBrowser, на панели инструментов Элементы управления классических приложений Office достаточно раскрыть опцию Дополнительные элементы и в открывшемся списке выбрать Обозреватель Web-страниц Microsoft. В результате этих действий на рабочей поверхности документа появится прямоугольник с эмблемой Windows на черном фоне. Размеры этого прямоугольника можно изменить с помощью мыши. Если WebBrowser внедрить на лист Excel, то в строке редактирования можно обнаружить команду: =ВНЕДРИТЬ(”Shell.Explorer.2”;””), а в коллекции объектов листа добавится имя WebBrowser1.

Теперь в качестве контейнерного приложения вместо Outlook выступает объект Worksheet. Если перейти в окно кода этого объекта, то в ниспадающем списке Объекты наряду с Worksheet будет присутствовать объект WebBrowser1, а в ниспадающем списке Процедуры появится список из двух десятков событий, предусмотренных для этого объекта.

Единственное неудобство, сопутствующее такому внедрению, будет заключаться в постоянном переключении панелей управления приложения. Как только фокус переместится на объект WebBrowser, будет автоматически открываться панель инструментов Web - кстати говоря, совершенно бесполезная, поскольку ее команды воздействуют не на внедренный объект, а на внешний обозреватель Internet Explorer. Напротив, при утрате фокуса будут открываться стандартные панели инструментов рабочего листа. Аналогичное переключение панелей наблюдается и при внедрении графиков (объекты Chart) на листы Worksheet, но в этом случае такое переключение вполне уместно.

Однако не следует забывать, что внедрение WebBrowser было задумано для отображения DD - Web-страницы с большим количеством разнообразных элементов. Очевидно, что для такой страницы желательно выделить максимум доступного пространства на экране дисплея. Поэтому следует избавиться не только от «неправильной» панели Web, но и ото всех панелей управления, включая основное меню приложения, и не допускать их «самовольного» появления.

Кроме того, необходимо предусмотреть типичные команды управления навигацией, применяемые во всех обозревателях: Назад, Далее, Остановить, Обновить, Домой, Избранное и ComboBox Переход. Сделать это нетрудно, тем более что на отвергнутой панели Web такие элементы управления присутствуют, поэтому у них можно позаимствовать все необходимое, за исключением свойств onAction. Установка необходимого обрамления выполняется с помощью следующей процедуры:

‘- Формирование Excel Settings Dim objCBar As CommandBar Dim objControl As CommandBarControl Dim objCBoxTo As CommandBarComboBox Dim objCBoxFrom As CommandBarComboBox Dim objWB As WebBrowser Dim i As Integer With Application ‘- скрытие всех панелей инструментов For Each objCBar In .CommandBars If objCBar.Visible And objCBar.Name <> _ “Worksheet Menu Bar” Then objCBar.Visible = False End If Next ‘- только нужные панели Excel .DisplayFormulaBar = False .DisplayStatusBar = True ‘- удаление всех меню Set objCBar = .CommandBars(“Worksheet Menu Bar”) For Each objControl In objCBar.Controls objControl.Delete Next End With ‘- формирование панели инструментов With objCBar ‘- кнопка Назад Set objControl = .Controls.Add (Type:=msoControlButton) With objControl .FaceId = 1017 .Caption = “&Назад” .OnAction = “GoBack” End With ‘- кнопка Далее Set objControl = .Controls.Add (Type:=msoControlButton) With objControl .FaceId = 1018 .Caption = “Да&лее” .OnAction = “GoForward” End With ‘- кнопка Остановить Set objControl = .Controls.Add (Type:=msoControlButton) With objControl .FaceId = 1019 .Caption = “Ос&тановить переход” .OnAction = “StopNavigate” End With ‘- кнопка Обновить Set objControl = .Controls.Add (Type:=msoControlButton) With objControl .FaceId = 1020 .Caption = “О&бновить текущую страницу” .OnAction = “Refresh” End With ‘- кнопка Домой Set objControl = .Controls.Add (Type:=msoControlButton) With objControl .FaceId = 1016 .Caption = “На&чальная страница” .OnAction = “GoHome” End With ‘- меню Избранное Application.CommandBars(“WEB”).Controls(7). Copy objCBar ‘- ComboBox для ввода Адреса Set objControl = _ .Controls.Add(Type:=msoControlComboBox) With objControl .Caption = “Пере&ход” .OnAction = “GoAddress” .Width = 256 Set objCBoxTo = objControl Set objCBoxFrom = _ Application.CommandBars(“WEB”).Controls(10) For i = 1 To objCBoxFrom.ListCount objCBoxTo.AddItem objCBoxFrom.List(i) Next ‘- адрес открытой страницы Set objWB = _ ThisWorkbook.Worksheets(“Browser”).WebBrowser1 objCBoxTo.Text = objWB.LocationURL End With End With End Sub

Обратите внимание, что при формировании нового комбинированного списка Переход в его раскрывающийся список копируются все адреса из старого ComboBox со стандартной панели элементов Web.

Естественно, необходимо предусмотреть и вторую процедуру, выполняющую обратные действия. Она совсем простая:

Private Sub RestoreSettings() ‘- Восстановление Excel Settings With Application .CommandBars(“Worksheet Menu Bar”).Reset .CommandBars(“Standard”).Visible = True .CommandBars(“Formatting”).Visible = True .CommandBars(“Web”).Visible = False .DisplayFormulaBar = True .DisplayStatusBar = True End With End Sub

Вызывать приведенные процедуры нужно не только при первоначальном открытии и закрытии рабочей книги, но и при ее активации/деактивации:

Private Sub Workbook_Activate() SetSettings End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) RestoreSettings End Sub Private Sub Workbook_Deactivate() RestoreSettings End Sub Private Sub Workbook_Open() ThisWorkbook.Worksheets(“Browser”).Activate SetSettings With Application .WindowState = xlMaximized ‘- максимальный размер для WebBrowser If ThisWorkbook.Worksheets(“Browser”) _ .OLEObjects(1).Height <> .UsableHeight Then ThisWorkbook.Worksheets(“Browser”) _ .OLEObjects(1).Height = .UsableHeight End If If ThisWorkbook.Worksheets(“Browser”) _ .OLEObjects(1).Width <> .UsableWidth Then ThisWorkbook.Worksheets(“Browser”) _ .OLEObjects(1).Width = .UsableWidth End If End With ‘- загрузка домашней страницы GoHome End Sub

Следует отметить, что при открытии рабочей книги для внедренного OLE-объекта (а это наш WebBrowser) выделяется все доступное свободное пространство внутри приложения (свойства UsableHeight и UsableWidth). При необходимости размеры этого окна можно сократить, предусмотрев место для какой-нибудь панели управления непосредственно на листе Excel, скомбинировав Web-страницу и документ Office.

Что касается самих процедур, вызываемых при нажатии кнопок управления на новой панели инструментов, то их реализация также не вызывает труда, так как все необходимые команды совпадают с методами, предусмотренными для объекта класса WebBrowser. Рассмотрим только две из них, поскольку все остальные процедуры отличаются от GoHome только именем метода или адресом перехода:

Const HOMEPAGE As String = “file:///C:/MyDD/index.html” Public Sub GoHome() ‘- Открыть домашнюю страницу Dim objWB As WebBrowser Set objWB = _ ThisWorkbook.Worksheets(“Browser”).WebBrowser1 If ActiveWorkbook.Name <> <> “Browser” Then ThisWorkbook.Worksheets(“Browser”).Activate End If On Error Resume Next objWB.Navigate HOMEPAGE If Err <>

В начале процедуры производится инициализация объектной переменной и активизируется рабочая книга и лист, содержащий внедренный объект. Последнее является целесообразным, поскольку выполнение команды для невидимого объекта вряд ли интересует пользователя. Собственно полезное действие выполняется над объектом objWB при отключенном обработчике ошибок. В конце процедуры вызывается вспомогательная процедура HideAll, скрывающая возможно появившиеся, но нежелательные панели инструментов:

Private Sub HideAll() ‘- Скрыть все панели управления Dim objCBar As CommandBar With Application For Each objCBar In .CommandBars If objCBar.Visible And objCBar.Name <> _ “Worksheet Menu Bar” Then objCBar.Visible = False End If Next End With End Sub

Несколько более сложная процедура выполняется при вводе адреса перехода в комбинированный список:

Private Sub GoAddress() ‘- Переход по адресу Dim objCBar As CommandBar Dim objCBox As CommandBarComboBox Dim objWB As WebBrowser Set objWB = _ ThisWorkbook.Worksheets(“Browser”).WebBrowser1 If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate End If If ActiveSheet.Name <> “Browser” Then ThisWorkbook.Worksheets(“Browser”).Activate End If On Error Resume Next Set objCBar = _ Application.CommandBars(“Worksheet Menu Bar”) Set objCBox = objCBar.Controls(7) ‘- добавить в список страниц If objCBox.ListIndex = 0 Then objCBox.AddItem objCBox.Text End If ‘- переход objWB.Navigate objCBox.Text If Err <> 0 Then MsgBox Error$, vbCritical End If HideAll End Sub

Здесь, кроме собственно вызова метода Navigate, осуществляется и модификация списка истории переходов, чтобы избежать повторного ввода вручную адреса страницы, которую уже посещали.

В результате произведенных операций получился весьма симпатичный обозреватель Web-страниц, показанный на рисунке.

Кроме всего прочего, этот обозреватель замечателен тем, что к нему не цепляются всевозможные «Powered» Add-Ins-компоненты, которые модифицируют меню и панели инструментов стандартного Internet Explorer и от которых порой очень трудно избавиться.

Класс Internet Explorer

Вышеописанное решение нельзя считать универсальным. Поскольку обозреватель Web-страниц жестко привязан к определенному документу Office, для работы с DD требуется постоянно держать этот документ открытым. Конечно, если DD является частью интерфейса какого-либо проекта, реализованного в среде офисного приложения, то данное решение целесообразно. Например, конкретное рабочее место может быть организовано в виде совокупности таблиц, графиков, форм и макросов Excel. В таком проекте DD сможет выступать в качестве центрального документа, откуда вызываются все формы и макросы и куда помещается сводная информация.

Однако в общем случае DD не является частью локального прикладного проекта. В задачу DD входит интеграция Web-страниц со всеми приложениями Office, поэтому выбор Outlook в качестве контейнера не случаен. Сделав такой выбор, Microsoft дает понять, что приложение Outlook является центральным звеном в семействе Office и должно оставаться открытым на протяжении всей работы на компьютере. К сожалению, это не всегда справедливо. Многие пользователи не в полной мере используют Outlook по разным причинам. Чаще всего это связано с тем, что в качестве почтового агента выбрана другая программа, например Outlook Express. Понятно, что использование другого почтового агента подразумевает и иную адресную книгу, в результате чего большая часть возможностей Outlook остается невостребованной.

Кроме того, некоторые пользователи, не отягощенные знаниями, из всех приложений Office знакомы лишь с Word, да и то только как со средством для формирования и печати несложных текстовых документов.

Зато стандартный обозреватель Internet Explorer, устанавливаемый вместе с операционной системой Windows, известен практически всем пользователям, имеющим выход в Internet. А раз так, то почему бы для отображения DD не использовать этот обозреватель в неизменном виде?

Такая возможность существует и реализуется с помощью все той же библиотеки SHDocVw. Только в этом случае необходимо применять не класс WebBrowser, а другой класс - InternetExplorer. Создание объекта этого класса приводит к открытию нового отдельного окна обозревателя Internet Explorer со всеми стандартными элементами управления - меню и панелями инструментов. Для того чтобы обеспечить доступ к событиям этого объекта, создается контейнер нового класса, содержащий описание InternetExplorer c ключевым словом WithEvents. Такой новый класс («упаковка») ничуть не уступает формам или документам Office по возможностям обращения к свойствам, методам и событиям внедренных объектов.

Создать новый класс можно в любом приложении Office, переключившись в редактор VBE с помощью заветной комбинации клавиш Alt+F11. Единственное, что нужно сделать дополнительно, - подключить к проекту ссылку на библиотеку SHDocVw. Выполняется это с помощью команды Сервис|Ссылки…, а в окне доступных ссылок ставится галочка против имени Microsoft Internet Controls. Создаваемый класс InternetExplorerWithEvents может выглядеть следующим образом:

Option Explicit ‘- Константы для API Private Const W_HIDE = 0 Private Const W_SHOWNORMAL = 1 Private Const W_SHOWMINIMIZED = 2 Private Const W_SHOWMAXIMIZED = 3 Private Const W_TITLE = “Microsoft Internet Explorer” Private Const W_TITLE_NEW = _ “Microsoft Internet Explorer Powered by VBA” ‘- Класс InternetExplorerWithEvents Public WithEvents IE As InternetExplorer Private blnClosed As Boolean ‘ IE закрыт Private lngHwnd As Long ‘ описатель окна ‘- Функции API Private Declare Function FindWindow Lib “user32” _ Alias “FindWindowA” _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function ShowWindow Lib “user32” _ (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long Private Declare Function SetWindowText Lib “user32” _ Alias “SetWindowTextA” _ (ByVal hwnd As Long, _ ByVal lpString As String) As Long Private Sub Class_Initialize() Dim objIE As New InternetExplorer Set IE = objIE ‘- maximize IE window lngHwnd = FindWindow(vbNullString, W_TITLE) If lngHwnd > 0 Then SetWindowText lngHwnd, W_TITLE_NEW ShowWindow lngHwnd, W_SHOWMAXIMIZED End If IE.Visible = True blnClosed = False End Sub Private Sub Class_Terminate() Set IE = Nothing End Sub Public Property Get Closed() As Boolean Closed = blnClosed End Property Public Property Get hwnd() As Long hwnd = lngHwnd End Property Private Sub IE_TitleChange(ByVal Text As String) Dim strTitle As String ‘- новое название окна IE strTitle = Text & “ - “ & W_TITLE_NEW SetWindowText lngHwnd, strTitle End Sub Private Sub IE_OnQuit() Set IE = Nothing blnClosed = True End Sub

В приведенном примере для класса в целом обрабатываются события Initialize и Terminate. Основное свойство - объектная переменная IE, ссылающаяся на объект InternetExplorer, - объявлено общим (Public). Предусмотрено два дополнительных свойства, доступные только для чтения - Closed и hwnd. Внутри класса описаны две процедуры, обрабатывающие события TitleChange и OnQuit для внутреннего объекта IE. Кроме того, присутствует описание трех функций WinAPI.

Чтобы понять, как все это работает, рассмотрим типичный случай. Допустим, в некотором внешнем модуле имеется описание объекта класса InternetExplorerWithEvents. В тот момент, когда в этом модуле создается новый экземпляр объекта с помощью команды Set, вызывается конструктор Class_Initialize, в котором сначала создается новый экземпляр объекта InternetExplorer. Это равносильно открытию нового окна обозревателя с пустой (blank) домашней страницей. Затем вызываются функции API - для придания этому окну желаемого вида. Сначала, с помощью функции FindWindow, определяется дескриптор окна, в заголовке которого написано Microsoft Internet Explorer. Текст в заголовке найденного окна дополняется словами Powered by VBA с помощью функции SetWindowText. Наконец, это окно увеличивается до максимального размера с помощью функции ShowWindow, а управление возвращается в вызывающую программу. Теперь внешняя программа может вызывать навигацию, обращаясь к методам объекта IE. Особой необходимости в функциях Windows API нет, но объект InternetExplorer не имеет собственных свойств, позволяющих выбирать один из трех типичных размеров окна, и всегда открывается в окне среднего размера (Normal). Дополнение текста в заголовке словами Powered by VBA позволяет визуально контролировать наличие и утрату связи между обозревателем и VBA, то есть возможность реализации специальных функций DD. Для той же цели предусмотрен и обработчик события TitleChange. Если в заголовке имеется упоминание о VBA, то связь с Office возможна. Если же таких слов нет, то объект - упаковка InternetExplorerWithEvents - уничтожен. Это может произойти в том случае, если приложение Office, открывшее Internet Explorer, закрылось раньше обозревателя.

Противоположная ситуация может создаться в том случае, если закрывается окно Internet Explorer, в то время как объект InternetExplorerWithEvents еще существует. Для контроля этого состояния используется свойство Closed, которое принимает значение FALSE в момент открытия обозревателя и переключается в TRUE в обработчике события OnQuit. Внешняя программа может проверять это свойство и, если ранее открытый обозреватель уже закрыт, создавать новый экземпляр объекта InternetExplorerWithEvents.

Имея в своем распоряжении подобный класс, можно реализовать и макрос, открывающий DD в стандартном обозревателе Internet Explorer:

Const HOMEPAGE As String = “file:///C:/MyDD/index.html” Public gobjIE As InternetExplorerWithEvents Public Sub DigitalDashboard() ‘- Открытие Digital Dashboard ‘- создание глобального объекта If gobjIE Is Nothing Then Set gobjIE = New InternetExplorerWithEvents Else If gobjIE.Closed Then Set gobjIE = Nothing Set gobjIE = New InternetExplorerWithEvents End If End If ‘- открытие домашней страницы gobjIE.IE.Navigate HOMEPAGE ‘- фокус на Internet Explorer gobjIE.IE.Visible = True End Sub

Все коды, приведенные в текущем разделе, не зависят от приложения. Следовательно, как модуль класса InternetExplorerWithEvents, так и макрос DigitalDashboard могут быть импортированы в неизменном виде в любое приложение Office. Более того, они могут быть импортированы в каждое приложение, например в шаблон Normal Microsoft Word и в общую книгу макросов PERSONAL.XLS приложения Microsoft Excel. Остается только добавить кнопку вызова макроса на панель инструментов каждого приложения - и положительный результат налицо. В любой момент из каждого приложения Office можно вызвать DD или обозреватель Internet Explorer, чтобы побродить по лабиринтам Всемирной паутины.

(Продолжение следует)

КомпьютерПресс 3"2001

HTML это простой язык разметки. Совместно с CSS и JavaScript уже можно создавать интерактивные страницы и страницы с оригинальным красивым дизайном. Глубоких знаний при этом не требуется. А web-интерфейс достаточно часто применяется при разработке программ. Применение html-страниц позволяет освежить аскетичный набор контролов Клариона.

Показать html-страницу в Кларион не составляет труда. Для этого можно использовать ole-контрол Shell.Explorer.2. Этот контрол присутствует на всех компьютерах с установленным браузером Internet Explorer. Как известно, по умолчанию IE установлен на всех компьютерах с ОС Windows. Т.е. этот контрол есть всегда и везде.

Для того, чтобы открыть страницу выполняется команда:

OLE{"Navigate("file://" & CLIP(inFileName) & "")"}

OCXREGISTEREVENTPROC(?OLE, MyOleEventFunc)

MyOleEventFunc – это процедура обработки событий, определяемая пользователем. Эта процедура имеет определенный прототип:

MyOleEventFunc PROCEDURE(*SHORT inReference, SIGNED inOleControl, LONG inCurrentEvent),LONG

Описание параметров привожу из стандартной помощи по Кларион 6:

The parameters it receives from the operating system are:

*SHORT A Reference parameter to pass onto the following other OCX library procedures: OCXGETPARAM, OCXGETPARAMCOUNT, and OCXSETPARAM as their first parameter.

SIGNED The field number for the control. This is the same number that is represented by the control’s field equate label.

LONG The number of the .OCX event. Equates for some pre-defined event numbers are contained in the OCXEVENT.CLW file.

The LONG return value indicates to the operating system whether any further processing is necessary. Returning zero (0) indicates some further processing is necessary(like updating a USE variable or unchecking a radio button), while returning any other value indicates processing is complete.

Processing the events generated by an .OCX control must occur quickly, since some events have critical timing. Therefore, there should be no user interaction possible within this procedure (such as WINDOWs, ASK statements, or MESSAGE procedures). The code should process only what it needs to, just as quickly as possible (usually, this means eliminating all mouse events).

Для примера рассмотрим следующую html-страницу:

Try me

MyOleEventFunc PROCEDURE(*SHORT inReference, SIGNED inOleControl, LONG inCurrentEvent) ! ,LONG loc:Event CSTRING(1024) loc:Link CSTRING(1024) CODE loc:Event = inOleControl{PROP:LastEventName} IF CLIP(loc:Event) = "BeforeNavigate2" loc:Link = OCXGETPARAM(inReference, 2) IF SUB(UPPER(loc:Link),1,8) = "CLICK://" loc:Link = SUB(loc:Link, 9, LEN(loc:Link) - 9) ! cut the "CLICK://" IF UPPER(loc:Link) = "I_WANNA_CATCH_THIS_LINK" MESSAGE("CATCH IT") END OCXSETPARAM(inReference, 7, 1) ! cancel navigate END END

И это все! Этих знаний достаточно для применения html-страниц в кларион-коде.

Часть 2: усложняем

«Всю жизнь мечтал» о реализации своего рабочего стола:

Здесь основная проблем состоит в корректном отображении иконок действий при ресайзе окна.


То, что достаточно громоздко реализовать в Кларион, легко получается в html.

В примере представлен класс CFCHTMLClass (cfchtml.inc, cfchtml.clw), который реализует возможность отображения и обработки нажатий на ссылки html-документа. Помимо этих действий, класс решает две известные мне проблемы.

Во-первых, контрол Shell.Explorer.2 имеет стандартное контекстное меню IE. И необходимо заблокировать это меню.

Во-вторых, когда фокус находится внутри ole-контрола, такие клавиши как Esc, Ctrl+F4, Ctrl+F6, F10 и тому подобные обрабатываются самим контролом, а не окнами Кларион. Соответственно, необходимо перехватить нажатия этих клавиш и передать их в Кларион окно.

Если посмотреть на окно ПОСЛЕ загрузки html-страницы, то увидим следующее:

Желтым цветом выделены непосредственно ole-контрол Клариона и окно с классом Internet Explorer_Server.

Все «настоящие» действия, т.е. отображение и обработка событий, происходят в окне Internet Explorer_Server.

Также из рисунка выше видно, что Ole-контрол никак иерархически не связан с окном Internet Explorer_Server. На данный момент я не знаю, как сопоставить эти окна, используя только технологию OLE.

Для перехвата контекстного меню и нажатий служебных клавиш, необходимо поймать события WM_RBUTTONUP, WM_CONTEXTMENU и WM_KEYDOWN, WM_KEYUP, поступающие в окно Internet Explorer_Server. Для этого необходимо засабклассить это окно.

Как вы понимаете, мы можем положить на окно несколько html-документов. И, естественно, необходимо засабклассить каждое окно. Еще раз обращу внимание на то, что окно Internet Explorer_Server появляется динамически только после загрузки в него html-документа.

Для сабклассинга необходимо найти все окна с классом Internet Explorer_Server. Это достигается использование API EnumChildWindows и GetClassName. Повторный сабклассинг необходимо исключить. Все найденные окна сохраняются в очередь. Пробежав по очереди сабклассим каждое окно и выставляем в этой же очереди флаг, если окно уже было засабклашшено, то проверив флаг, пропускаем его.

Для сабклассинга используется класс CFCWndProc (CFCWndProc.inc, CFCWndProc.clw) описание, которого не входит в рамки этой статьи.

Так как решено было использовать один глобальный класс, то при работе с очередью необходимо обрамлять действия критической секцией.

Код реализующий вышесказанное можно посмотреть в файле cfchtml.clw, это методы CFCHTMLManagerClass.SetIEsCallback и процедура CFC_HTMLEnumerateWindows.

Код процедуры сабклассинга достаточно прост:

CFCHTMLCallbackClass.CallBackProc PROCEDURE(ULONG hWnd,ULONG inMsg,ULONG wParam,LONG lParam) loc:WM_RBUTTONUP EQUATE(0205h) loc:WM_CONTEXTMENU EQUATE(07Bh) loc:WM_KEYDOWN EQUATE(0100h) loc:WM_KEYUP EQUATE(0101h) CODE CASE inMsg OF loc:WM_RBUTTONUP OROF loc:WM_CONTEXTMENU RETURN FALSE OF loc:WM_KEYDOWN CFC_PostMessage(0{PROP:Handle},loc:WM_KEYDOWN,wParam,lParam) RETURN FALSE OF loc:WM_KEYUP CFC_PostMessage(0{PROP:Handle},loc:WM_KEYUP,wParam,lParam) RETURN FALSE END RETURN PARENT.CallBackProc(hWnd,inMsg,wParam,lParam)

Оставшиеся мелочи

Shell.Explorer.2 имеет те же свойства, которые указаны в Панели управления/Свойства обозревателя. Это означает, что если отключено отображение картинок в IE, то и в своем окне они будут отключены. Это необходимо учитывать при создании html-документа и, возможно, предупреждать об этом конечного пользователя.

PNG–формат предпочтителен для отображения картинок. Нормальная поддержка формата появилась в IE версии выше 6. Потому рекомендуется обновить браузер до последней доступной версии. Не стоит забывать также, что используемые изображения, необходимо также копировать конечному пользователю.

В классе сделаны дополнительные методы IsImagesEnabled, GetIEVersion и DisableClickSound, работа которых основана на работе с реестром.

И последнее вы можете создавать html-документ динамически, это ведь просто текстовый документ. А после создания загружать его в ole-контрол.

Покопались с данной технологией и набрели на следующие вопросы:

Интересно, можно ли сделать что-то похожее на AJAX. Т.е. подгружать данные из клариона на web-страничку без ее перезагрузки…

Старые комментарии

Второе, можно ли из клариона вызвать javascript функцию. Подозреваю, что можно. Пробовал

OleControl{‘Document.InvokeScript(«somefunc();»)’}
?OleControl{‘Document.InvokeScript(«somefunc()»)’}
?OleControl{‘Document.InvokeScript(«somefunc»)’} и тому подобное, но чего-то не получается. В C# в WebBrowser (что, наверное, есть тот же самый IE) можно вызвать webbie.Document.InvokeScript(«somefunc»); и все нормально работает…

Зря беспокоил
1) можно использовать функцию Document.GetElementByID например, inOleControl{‘Document.GetElementByID(«menu1″).innerHTML’} = ‘»123″‘ или см. п2
2) Document.ParentWindow.execScript например, inOleControl{‘Document.ParentWindow.execScript(«somefunc(122);»,»javascript»)’}
Этими двумя функциями можно добиться эффекта, похожего на AJAX

Что такое ActiveX, не может толком сказать никто. Обычно на этот вопрос отвечают: "Переименованная технология OLE". Но если быть точными, OLE - лишь часть того, что называют компонентной объектной моделью COM (Component Object Model). Ясности, однако, от этого не прибавляется. Попробуем расставить точки над i и назовем ActiveX расширенной технологией OLE, базирующейся на модели COM и призванной "активизировать" компьютер, т. е. существенно увеличить его функциональные возможности (в первую очередь за счет интеграции в Internet и intranet).

Основными компонентами технологии ActiveX являются управляющие элементы ActiveX (с различными дополнениями), ActiveX Conferencing - средство, превращающее компьютер в коммуникационное устройство сети Internet, ActiveX Scripting - средство создания собственных программ обработки языков сценариев (скриптов), как, например, VBScript и JScript, встроенных в Microsoft Internet Explorer. И хотя это не все, но для первого представления о технологии ActiveX, согласитесь, уже достаточно.

Составляющие ActiveX
Свойства и методы
Как и обычные объекты OLE, элементы ActiveX могут реализовать наборы свойств интерфейсов и методов. Про интерфейсы и методы мы уже говорили, а вот свойства не были затронуты. Свойства - это некоторые параметры, присущие какому-либо классу объектов. Например, для квадрата характерны цвет, координаты левого верхнего угла и длина стороны. Про эти параметры говорят, что это свойства класса "Квадрат".

События
В дополнение к свойствам и методам элементы ActiveX могут предоставлять интерфейсы, через которые можно подавать сигналы-события всем заинтересованным в них программам. Соответственно программы, заинтересованные в получении событий, должны позаботиться об их перехвате, для чего в них должны быть предусмотрены фрагменты кода, называемые обработчиками событий.

Визуальное представление
Очень многие управляющие элементы могут размещать и отображать себя внутри окна программы-контейнера, которая использует эти элементы. Контейнер управляет расположением и размером ActiveX, которые он содержит.

Обработка событий клавиатуры
Управляющие элементы ActiveX могут перехватывать нажатия кнопок клавиатуры и их комбинации и соответствующим образом реагировать на них. Обычно все нажатия перехватываются программой-контейнером, содержащей ActiveX, и передаются управляющим элементам.

Сохранение состояния
Управляющий элемент ActiveX может сохранять и восстанавливать свое состояние. Это позволяет не тратить время на повторную настройку элементов.

Регистрация и лицензирование
Перед использованием элементы ActiveX должны быть зарегистрированы в системе и отмечены в реестре (регистраторе). Обычно элементы сами проделывают эту работу. Кроме того, элементы ActiveX могут быть лицензированы для предотвращения их нелегального использования.

Для работы ActiveX в 1С 7.7 необходимо использование 1С++
Проект 1С++ - www.1cpp.ru
FAQ по ActiveX/АктивИкс
Пример использования:
Internet Explorer на форме (ActiveX)

Подробнее:
Создаем новый Внешний отчет
ВНИМАНИЕ! Для отображения ActiveX необходимо разместить на форме элемент диалога "Текст" или "Кнопка".
Размещаем на форме элемент диалога "Текст" с Идентификатором "ФБраузер".
Размещаем в модуле обработки следующий код:

Перем гФорма , Браузер ;

Процедура ПриОткрытии ()
Попытка
гФорма = СоздатьОбъект ("СервисРасшФормы" );
гФорма . ЗагрузитьМодуль (); //ПослеОткрытия
Исключение

гФорма . УстановитьФорму (Форма ); //ФормаПриСоздании
КонецПопытки ;

Процедура ПослеОткрытия ()

Браузер . УстановитьАтрибут (Форма , "ФБраузер" );
Браузер . СоздатьЭУ ("Shell.Explorer.2" );
Браузер . Объект . Navigate ("c:\" );
КонецПроцедуры

Процедура ФормаПриСоздании ()
ПослеОткрытия ();
КонецПроцедуры // ФормаПриСоздании

Процедура ФБраузер_BeforeNavigate2 (объект , урл , флаги , фрейм , пост , заголовки , отмена )
Сообщить (урл );
КонецПроцедуры // ФБраузер_BeforeNavigate2

Если компонента 1С++ не загружена, то загружаем ее в процедуре обработки ПриОткрытии или в Глобальном Модуле.
Запускаем обработку и видим на экране содержимое диска С:\
Возможные проблемы:
- незагруженные компоненты;
- старые версия компоненты (на момент написания статьи: 1С++ 3.0.1.23, просмотреть версии можно выбрав пункт меню Помощь->О программе... либо Сервис->Параметры); - отсутствие прав доступа к диску C:, отсутствие диска C:;
- другие проблемы.
Вместо содержимого диска также можно открывать и ссылки в интернет, например www.сайт.
Процедура ФБраузер_BeforeNavigate2 выбрана в виде примера события возникающего при работе ActiveX.
С полный перечнем событий, методов и свойств можно познакомиться в MSDN.
После чего расширить функциональную часть

ActiveX сторонних разработчиков:

Scintilla ActiveX Control
3D Active Button Magic
Бесплатный контрол двумерной графики в виде ActiveX - разберем подробнее:
Прежде всего зарегистрируем Контрол - regsvr32 acChart.ocx.
Также нам будет необходима ВК для передачи даных в Контрол с типом "Массив". Описание синтаксиса на странице ВК.
Скопируем файл предыдущего примера, удалим текст модуля, добавим следующие строки:

Перем гФорма , Браузер , _OleSafeArray ;

Процедура ПриОткрытии ()
Попытка
гФорма = СоздатьОбъект ("СервисРасшФормы" );
гФорма . ЗагрузитьМодуль (); //ПослеОткрытия
Исключение
гФорма = СоздатьОбъект ("Форма" );
гФорма . УстановитьФорму (Форма ); //ФормаПриСоздании
КонецПопытки ;
КонецПроцедуры // ПриОткрытии

Процедура ПослеОткрытия ()
_OleSafeArray . Создать (12 , 5 , 2 );
_OleSafeArray . УстановитьЗначение (0 , 0 , 1 );
_OleSafeArray . УстановитьЗначение (0 , 1 , 5 );
_OleSafeArray . УстановитьЗначение (1 , 0 , 3 );
_OleSafeArray . УстановитьЗначение (1 , 1 , 1 );
_OleSafeArray . УстановитьЗначение (2 , 0 , 3 );
_OleSafeArray . УстановитьЗначение (2 , 1 , 2 );
_OleSafeArray . УстановитьЗначение (3 , 0 , 4 );
_OleSafeArray . УстановитьЗначение (3 , 1 , 2 );
_OleSafeArray . УстановитьЗначение (4 , 0 , 8 );
_OleSafeArray . УстановитьЗначение (4 , 1 , 10 );
Браузер = СоздатьОбъект ("АктивИкс" );
Браузер . УстановитьАтрибут (Форма , "ФБраузер" );
Браузер . СоздатьЭУ ("acChart.ctlChart" );

OLEExSup = CreateObject ("OLEExSup" );
// Браузер.Объект.maxX = 5;
//Браузер.Объект.maxY = 5;
Браузер . Объект . ShowGridX = 1 ;
Браузер . Объект . ShowGridY = 1 ;
Браузер . Объект . ChartBorder = 1 ;
// Браузер.Объект.ChartType = 5;
Браузер . Объект . PlotHold = 1 ;
Браузер . Объект . TitleX = "Дни" ;
Браузер . Объект . TitleY = "Количество" ;
Браузер . Объект . LegendAligment = 0 ;
Браузер . Объект . AddLegendString ("График" );
Браузер . Объект . UseGradientFill = 1 ;
OLEExSup . InvokeOLEMethod (Браузер . Объект , "DrawXY" , _OleSafeArray );
КонецПроцедуры

Процедура ФормаПриСоздании ()
ПослеОткрытия ();
КонецПроцедуры // ФормаПриСоздании

Процедура ФБраузер_ChartClick (_X , _Y )
Сообщить ("!!" );
КонецПроцедуры //

Не забываем загрузить OLEExSup.dll.
Запускаем внешний отчет, получаем график. Далее эксперементируем по своему усмотрению.
К сожалению на Официальной странице Контрола дано описание не всех методов и событий. Для получения доступа к ним воспользуемся советами из