Зв'язка ActiveX – Internet Explorer

А чи знаєте ви, що на Delphi можна писати ActiveX компоненти? Звичайно знаєте. А що з їх допомогою можна взаємодіяти з Internet Explorer? Це може бути цікаво для професійних веб-майстрів, скажете ви, але я не згоден. "Простий" програміст теж може знайти масу застосувань цього. Тут буде описано одне з них. Всі ми лазимо (ходимо і т.д.) по інтернету. І ви теж – раз читаєте ці рядки :). А чи не траплялося вам, випадково десь побувавши, щось прочитавши і благополучно забувши адресу сайту через деякий час раптом зрозуміти, що там було саме те, що вам зараз терміново знадобилося? Можна звичайно подивитися History браузера, можна залізти в кеш "руками" і спробувати знайти там щось. А можна написати компонент, який би шукав слова у файлах кешу (в загальному випадку в будь-яких HTML-файлах) і виводив би на перегляд необхідні файли. Пов'язати цей компонент з Експлорером – і вперед. Що зручно – вся робота відбувається в експлорері: і пошук, і, природно, перегляд. При цьому для Delphi-програміста не потрібні особливі знання мови HTML, скриптових мов і т.п. Достатньо знати кілька основних конструкцій (а вже довідкових посібників в інтернеті навалом – хоча б на http://www.citforum.ru). Написаний ActiveX-компонент вставляється в HTML-сторінку. Ось приклад найпростішої сторінки







<HTML>
   <HEAD>
<TITLE> Пошук </ TITLE>
   </HEAD>
   <BODY>
     <P ALIGN=CENTER>
<OBJECT ID = "findword1" – {за допомогою цього тега компонент вставляється в сторінку}
       CLASSID=”CLSID:47E50425-E611-11D3-970A-4854E82B17E6″
       CODEBASE=”C:PATHFINDWORDS.OCX”>
       </OBJECT>
     </P>
   </BODY>
</HTML>


У цьому прикладі ActiveX-компонент, що знаходиться у файлі C: PATHFINDWORDS.OCX вставляється в HTML-сторінку. Але важливо відзначити, що ця сторінка відкриється тільки в Microsoft Internet Explorer версії 4 і старше. Пишуть, що третій експлорер теж підтримує тег <OBJECT>, але сам не пробував, не знаю. Браузери Netscape, Opera і які ще там бувають, його не підтримують.


Отже, тег <OBJECT> вставляє в сторінку ActiveX-компонент. Його атрибут CLASSID вказує ідентифікатор класу нашого компонента. При створенні в Delphi компонента з нуля йому автоматично присвоюється цей ідентифікатор класу. ID = "findword1" – ім'я об'єкта. Тут можна писати будь-яке ім'я. По ньому ми надалі будемо посилатися на наш компонент в тілі сторінки з скриптів-процедур обробки подій. Далі, для того, щоб наш компонент міг використовуватися прикладними програмами, він повинен бути зареєстрований в реєстрі. Зареєструвати його можна програмою regsvr32, що за умовчанням знаходиться в каталозі [System]. Наприклад так: [regsvr32 C: PATHFINDWORDS.OCX]. Якщо при відкритті сторінки Explorer не знаходить в реєстрі зазначений компонент, то він шукає його в розташуванні, атрибутом CODEBASE. Тут може бути повний шлях до файлу, якщо він знаходиться на вашому жорсткому диску або навіть URL-адреса (з усіма супутніми атрибутами, як то http:// і т.д.). Тобто, якщо експлорер зустрів посилання на компонент, а цього компонента немає на вашій машині, він може завантажити його з інтернету із зазначеної адреси. До речі, атрибут CLASSID – обов'язковий, саме по ньому проводиться "ідентифікація" класу. А атрибут CODEBASE – Необов'язковий. У випадку, коли він опущений, якщо компонент уже зареєстрований в системі, то він відобразиться у вашій сторінці, якщо не зареєстрований – сторінка буде пустою. І нарешті якщо експлорер сам реєструє компонент, він переписує файл OCX в папку [WindowsDownloaded program files].


Для того, щоб вручну не писати скрипти приєднання ActiveX компонентів, я раджу завантажити програму Microsoft ActiveX Control Pad. Ця програма призначена для впровадження ActiveX-компонентів в HTML-сторінки. Після її роботи визначення компонента виглядає приблизно так:







<OBJECT ID=”findword1″
CLASSID=”CLSID:47E50425-E611-11D3-970A-4854E82B17E6″
CODEBASE=”C:PATHFINDWORDS.OCX”>
<PARAM NAME=”Visible” VALUE=”-1″>
<PARAM NAME=”AutoScroll” VALUE=”0″>
<PARAM NAME=”AutoSize” VALUE=”0″>
<PARAM NAME=”AxBorderStyle” VALUE=”1″>
<PARAM NAME=”Caption” VALUE=”findword”>
<PARAM NAME=”Color” VALUE=”2147483663″>
<PARAM NAME=”Font” VALUE=”MS Sans Serif”>
<PARAM NAME=”KeyPreview” VALUE=”0″>
<PARAM NAME=”PixelsPerInch” VALUE=”96″>
<PARAM NAME=”PrintScale” VALUE=”1″>
<PARAM NAME=”Scaled” VALUE=”-1″>
<PARAM NAME=”DropTarget” VALUE=”0″>
<PARAM NAME=”HelpFile” VALUE=””>
<PARAM NAME=”DoubleBuffered” VALUE=”0″>
<PARAM NAME=”Enabled” VALUE=”-1″>
<PARAM NAME=”BiDiMode” VALUE=”0″>
<PARAM NAME=”Cursor” VALUE=”0″>
<PARAM NAME=”filename” VALUE=”nothing”>
</OBJECT>


Тобто ця програма сама підставляє повне визначення компонента (його CLASSID, наприклад). Правда, отриманий код іноді доводиться підправляти вручну. Наприклад може знадобитися прибрати явне вказівку висоти і ширини об'єкта.


Тепер підходимо до найголовнішого: як зробити сам компонент (щоб було що вставляти в нашу сторіночку:). Отже, в Delphi робимо NewActiveXActive form. У віконці Active Form Wizard вибираємо Threading model = Apartment. Інші threading models не працюють з IE 4. Виглядає це так: компонент в сторінці відкривається, але іноді раптом вискакує Access violation. (Зазвичай на подію Create). Модель ж Both працює з IE 5. Прапорець "Include Design-Time licence" краще не встановлювати. Далі відкривається нова форма, де ви можете розміщувати свої кнопки-текстбокси, визначати реакцію на події і т.д.


Далі будуть описані деякі хитрощі. Наприклад, потрібно зберігати деякі дані в зовнішньому файлі. Я зіткнувся з таким: мій компонент на різних машинах розміщував свої файли в різних місцях: на одній в каталозі Windows, на іншій – на робочому столі. Був знайдений такий вихід: нехай сторінка на вимогу компонента повертає йому каталог, в якому вона знаходиться. Для цього на форму я помістив PageControl, зробив закладку невидимими і на OnShow (у форми ActiveX компонента немає події OnShow) однієї зі сторінок поставив генерацію власної події OnWantDir. А в тілі HTML-сторінки відповідно реакцію на нього:







<SCRIPT LANGUAGE=”VBScript”>
<!–
Sub findword1_OnWantDir()
findword1.page_location = location.href
end sub
–>
</SCRIPT>


Далі, ця подія OnShow відбувається відразу після створення екземпляра компонента. Так от, якщо подія OnWantDir генерувати безпосередньо в ньому (в OnShow), то мабуть щось в надрах Windows не встигає провернутися і машина висне. Тому довелося повісити на форму таймер, на OnShow таймер запускати, і вже на OnTimer якраз і викликати своє подія OnWantDir. Інтервал у таймера я поставив у півсекунди. Звичайно можна було б зберігати свої файли наприклад в каталозі [Windows], але чомусь функція GetWindowsDirectory при виклику з ActiveX-компонента повертала помилку, хоча тут же нормально відпрацьовувала з звичайного додатки (exe). Те ж і з GetSystemDirectory і GetTempDirectory. Хто не знає як робити власні властивості та події – клікайте сюди.


Як зробити компонент тиражованим? Щоб користувач зміг працювати з ним відразу ж, не запускаючи ніяких додаткових програм, не вказуючи всяких-різних шляхів і т.д. Ось приклад HTML-сторінки:







<html>
 <HEAD>
<title> Пошук </ title>
  <SCRIPT LANGUAGE=”VBScript”>
  <!–
   Sub Procedure1()
   location.href = findword1.NewStroke
{Отримати від компонента ім'я файлу
і відкрити його для перегляду. Ця
процедура запускається при
виникненні події OnDocClick. Location – об'єкт
Explorer "а (див. документацію по VBScript)}
   end sub
  –>
  </SCRIPT>
 </HEAD>
 <BODY>
  <SCRIPT LANGUAGE=”VBScript”>
   <!–
   Sub findword1_OnWantDir()
   findword1.page_location = location.href
{Отримати поточний каталог, тобто
властивості page_location об'єкта привласнити
місце розташування нашої сторінки}

   end sub
   Sub findword1_OnDocClick()
{При виникненні події OnDocClick
викликати процедуру Procedure1 (відкрити файл
для перегляду)}
   call Procedure1()
   end sub
  –>
  </SCRIPT>
  <p align = “center”>
   <OBJECT ID=”findword1″
   CLASSID=”CLSID:47E50425-E611-11D3-970A-4854E82B17E6″
   CODEBASE=”findwords.ocx”>
{Тут просто ім'я файлу без
шляху. Explorer зареєструє компонент
невидимо для користувача, взявши
його з поточного каталогу (сторінка
і файл OCX знаходяться в одному каталозі)}
   <PARAM NAME=”Visible” VALUE=”-1″>
   <PARAM NAME=”AutoScroll” VALUE=”0″>
   <PARAM NAME=”AutoSize” VALUE=”0″>
   <PARAM NAME=”AxBorderStyle” VALUE=”1″>
   <PARAM NAME=”Caption” VALUE=”findword”>
   <PARAM NAME=”Color” VALUE=”2147483663″>
   <PARAM NAME=”Font” VALUE=”MS Sans Serif”>
   <PARAM NAME=”KeyPreview” VALUE=”0″>
   <PARAM NAME=”PixelsPerInch” VALUE=”96″>
   <PARAM NAME=”PrintScale” VALUE=”1″>
   <PARAM NAME=”Scaled” VALUE=”-1″>
   <PARAM NAME=”DropTarget” VALUE=”0″>
   <PARAM NAME=”DoubleBuffered” VALUE=”0″>
   <PARAM NAME=”Enabled” VALUE=”-1″>
   <PARAM NAME=”BiDiMode” VALUE=”0″>
   <PARAM NAME=”Cursor” VALUE=”0″>
   <PARAM NAME=”filename” VALUE=”nothing”>
   <PARAM NAME=”page_location” VALUE=””>
  </OBJECT>
  </p>
 </BODY>
</html>


І ще раз:


  1. Відкриваємо нашу сторінку (в IE 4 і вище)
  2. Якщо компонент зареєстрований, він відразу показується, якщо не зареєстрований, то реєструється і показується. При цьому:
  3. Після створення витримується пауза в півсекунди і запитується поточний каталог (і сторінка і сам OCX-файл знаходяться в одному каталозі, який і буде поточним).
  4. Якщо потрібно відкрити на перегляд яку або сторінку (вибрану користувачем в процесі роботи із списку), то властивості компонента (при впровадженні його в сторінку правильніше буде називати його вже об'єктом) присвоюється значення (ім'я файлу), генерується подія. Процедура-скрипт обробник цієї події читає властивість і відриває потрібний файл.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*