Зв'язка ActiveX - Internet Explorer h2>
Іван Семенов p>
А
чи знаєте ви, що на Delphi можна писати ActiveX компоненти? Звичайно знаєте. А
що з їх допомогою можна взаємодіяти з Internet Explorer? Це може бути
цікаво для професійних веб-майстрів, скажете ви, але я не згоден.
"Простий" програміст теж може знайти масу застосувань цього. Тут
буде описано одне з них. Всі ми лазимо (ходимо і т.д.) по інтернету. І ви теж
- Раз читаєте ці рядки:). А не траплялося вам, випадково десь побувавши,
что-то прочитав і благополучно забувши адреса сайту через деякий час раптом
зрозуміти, що там було саме те, що вам зараз терміново знадобилося? Можна
звичайно подивитися History браузера, можна залізти в кеш "руками" і
спробувати знайти там щось. А можна написати компонент, який би шукав слова
у файлах кешу (в загальному випадку в будь-яких HTML-файлах) і виводив би на перегляд
необхідні файли. Зв'язати цей компонент з експлорер - і вперед. Що зручно --
вся робота відбувається в експлорері: і пошук, і, природно, перегляд. При цьому
для Delphi-програміста не потрібні особливі знання мови HTML, скриптових мов і
т.п. Достатньо знати кілька основних конструкцій (а вже довідкових
керівництв в інтернеті дуже багато). Написаний ActiveX-компонент вставляється в
HTML-сторінку. Ось приклад найпростішої сторінки p>
p>
p>
Пошук TITLE> p>
HEAD> p>
p>
p>
CLASSID = "CLSID: 47E50425-E611-11D3-970A-4854E82B17E6" p>
CODEBASE = "C: PATHFINDWORDS.OCX"> p>
OBJECT> p>
P> p>
BODY> p>
HTML> p>
В
цьому прикладі ActiveX-компонент, що знаходиться у файлі C: PATHFINDWORDS.OCX
вставляється в HTML-сторінку. Але важливо відзначити, що ця сторінка відкриється
тільки в Microsoft Internet Explorer версії 4 і більше. Пишуть, що третій
експлорер теж підтримує тег , але сам не пробував, не знаю.
Браузери Netscape, Opera і які ще там бувають, його не підтримують. p>
Отже,
тег вставляє в сторінку ActiveX-компонент. Його атрибут CLASSID
вказує ідентифікатор класу нашого компонента. При створенні в Delphi
компоненту з нуля йому автоматично присвоюється цей ідентифікатор класу.
ID = "findword1" - ім'я об'єкта. Тут можна писати будь-яке ім'я. По ньому
ми надалі будемо посилатися на наш компонент в тілі сторінки з
скриптів-процедур обробки подій. Далі, для того, щоб наш компонент міг
використовуватися прикладними програмами, він повинен бути зареєстрований у
реєстрі. Зареєструвати його можна програмою regsvr32, що за умовчанням
знаходиться в каталозі [System]. Наприклад так: [regsvr32 C: PATHFINDWORDS.OCX].
Якщо при відкритті сторінки Explorer не знаходить в реєстрі зазначений компонент,
то він шукає його в місці розташування, зазначеному атрибутом CODEBASE. Тут може бути
повний шлях до файлу, якщо він знаходиться на вашому жорсткому диску або навіть
URL-адреса (з усіма супутніми атрибутами, як то http:// і т.д.). Тобто, якщо
експлорер зустрів посилання на компонент, а цього компонента немає на вашій машині,
він може завантажити його з інтернету із зазначеної адреси. До речі, атрибут
CLASSID - обов'язкова, саме по ньому проводиться "ідентифікація"
класу. А атрибут CODEBASE - необов'язковий. У випадку, коли він опущений, якщо
компонент вже зареєстрований в системі, то він відобразиться у вашій сторінці,
якщо не зареєстрований - сторінка буде пустою. І нарешті якщо експлорер сам
реєструє компонент, він переписує файл OCX в папку [WindowsDownloaded
program files]. p>
Для
того, щоб вручну не писати скрипти приєднання ActiveX компонентів, я
раджу завантажити програму Microsoft ActiveX Control Pad звідси. Ця програма
призначена для впровадження ActiveX-компонентів в HTML-сторінки. Після її
роботи визначення компонента виглядає приблизно так: p>
CLASSID = "CLSID: 47E50425-E611-11D3-970A-4854E82B17E6" p>
CODEBASE = "C: PATHFINDWORDS.OCX"> p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
p>
OBJECT> p>
Тобто
ця програма сама підставляє повне визначення компонента (його CLASSID,
наприклад). Правда, отриманий код іноді доводиться підправляти вручну.
Наприклад може бути потрібно прибрати явне вказівку висоти й ширини об'єкта. p>
Тепер
підходимо до найголовнішого: як зробити сам компонент (щоб було що вставляти
в нашу сторінку:). Отже, в Delphi робимо NewActiveXActive form. У віконці
Active Form Wizard вибираємо Threading model = Apartment. Інші threading models
не працюють з IE 4. Виглядає це так: компонент в сторінці відкривається, але
іноді раптом вискакує Access violation. (зазвичай на подію Create). Модель
ж Both працює з IE 5. Прапорець "Include Design-Time licence" краще
не встановлювати. Далі відкривається нова форма, де ви можете розміщувати свої
кнопки-текстбокси, визначати реакцію на події і т.д. p>
Далі
будуть описані деякі хитрощі. Наприклад, потрібно зберігати деякі дані під
зовнішньому файлі. Я зіткнувся з таким: мій компонент на різних машинах
розміщував свої файли в різних місцях: на одній в каталозі Windows, на іншій --
на робочому столі. Був знайдений такий вихід: нехай сторінка на вимогу
компонента повертає йому каталог, в якому вона знаходиться. Для цього на форму
я помістив PageControl, зробив закладки невидимими і на OnShow (у форми ActiveX
компонента немає події OnShow) одній із сторінок поставив генерацію власного
події OnWantDir. А в теле HTML-сторінки відповідно реакцію на нього: p>