ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Зв'язка ActiveX - Internet Explorer
         

     

    Інформатика, програмування

    Зв'язка ActiveX - Internet Explorer

    Іван Семенов

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

    Пошук </ TITLE> </ p> <p> </ HEAD> </ p> <p> <BODY> </ p> <p> <P ALIGN = CENTER> </ p> <p> <OBJECT ID = "findword1" - (за допомогою цього тега компонент вставляється в сторінку) </ p> <p> CLASSID = "CLSID: 47E50425-E611-11D3-970A-4854E82B17E6" </ p> <p> CODEBASE = "C: PATHFINDWORDS.OCX"> </ p> <p> </ OBJECT> </ p> <p> </ P> </ p> <p> </ BODY> </ p> <p> </ HTML> </ p> <p> В цьому прикладі ActiveX-компонент, що знаходиться у файлі C: PATHFINDWORDS.OCX вставляється в HTML-сторінку. Але важливо відзначити, що ця сторінка відкриється тільки в Microsoft Internet Explorer версії 4 і більше. Пишуть, що третій експлорер теж підтримує тег <OBJECT>, але сам не пробував, не знаю. Браузери Netscape, Opera і які ще там бувають, його не підтримують. </ p> <p> Отже, тег <OBJECT> вставляє в сторінку ActiveX-компонент. Його атрибут CLASSID вказує ідентифікатор класу нашого компонента. При створенні в Delphi компоненту з нуля йому автоматично присвоюється цей ідентифікатор класу. ID = "findword1" - ім'я об'єкта. Тут можна писати будь-яке ім'я. По ньому ми надалі будемо посилатися на наш компонент в тілі сторінки з скриптів-процедур обробки подій. Далі, для того, щоб наш компонент міг використовуватися прикладними програмами, він повинен бути зареєстрований у реєстрі. Зареєструвати його можна програмою regsvr32, що за умовчанням знаходиться в каталозі [System]. Наприклад так: [regsvr32 C: PATHFINDWORDS.OCX]. Якщо при відкритті сторінки Explorer не знаходить в реєстрі зазначений компонент, то він шукає його в місці розташування, зазначеному атрибутом CODEBASE. Тут може бути повний шлях до файлу, якщо він знаходиться на вашому жорсткому диску або навіть URL-адреса (з усіма супутніми атрибутами, як то http:// і т.д.). Тобто, якщо експлорер зустрів посилання на компонент, а цього компонента немає на вашій машині, він може завантажити його з інтернету із зазначеної адреси. До речі, атрибут CLASSID - обов'язкова, саме по ньому проводиться "ідентифікація" класу. А атрибут CODEBASE - необов'язковий. У випадку, коли він опущений, якщо компонент вже зареєстрований в системі, то він відобразиться у вашій сторінці, якщо не зареєстрований - сторінка буде пустою. І нарешті якщо експлорер сам реєструє компонент, він переписує файл OCX в папку [WindowsDownloaded program files]. </ p> <p> Для того, щоб вручну не писати скрипти приєднання ActiveX компонентів, я раджу завантажити програму Microsoft ActiveX Control Pad звідси. Ця програма призначена для впровадження ActiveX-компонентів в HTML-сторінки. Після її роботи визначення компонента виглядає приблизно так: </ p> <p> <OBJECT ID = "findword1" </ p> <p> CLASSID = "CLSID: 47E50425-E611-11D3-970A-4854E82B17E6" </ p> <p> CODEBASE = "C: PATHFINDWORDS.OCX"> </ p> <p> <PARAM NAME = "Visible" VALUE = "-1"> </ p> <p> <PARAM NAME = "AutoScroll" VALUE = "0"> </ p> <p> <PARAM NAME = "AutoSize" VALUE = "0"> </ p> <p> <PARAM NAME = "AxBorderStyle" VALUE = "1"> </ p> <p> <PARAM NAME = "Caption" VALUE = "findword"> </ p> <p> <PARAM NAME = "Color" VALUE = "2147483663"> </ p> <p> <PARAM NAME = "Font" VALUE = "MS Sans Serif"> </ p> <p> <PARAM NAME = "KeyPreview" VALUE = "0"> </ p> <p> <PARAM NAME = "PixelsPerInch" VALUE = "96"> </ p> <p> <PARAM NAME = "PrintScale" VALUE = "1"> </ p> <p> <PARAM NAME = "Scaled" VALUE = "-1"> </ p> <p> <PARAM NAME = "DropTarget" VALUE = "0"> </ p> <p> <PARAM NAME = "HelpFile" VALUE =""></ p> <p> <PARAM NAME = "DoubleBuffered" VALUE = "0"> </ p> <p> <PARAM NAME = "Enabled" VALUE = "-1"> </ p> <p> <PARAM NAME = "BiDiMode" VALUE = "0"> </ p> <p> <PARAM NAME = "Cursor" VALUE = "0"> </ p> <p> <PARAM NAME = "filename" VALUE = "nothing"> </ p> <p> </ OBJECT> </ p> <p> Тобто ця програма сама підставляє повне визначення компонента (його CLASSID, наприклад). Правда, отриманий код іноді доводиться підправляти вручну. Наприклад може бути потрібно прибрати явне вказівку висоти й ширини об'єкта. </ p> <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> <p> Далі будуть описані деякі хитрощі. Наприклад, потрібно зберігати деякі дані під зовнішньому файлі. Я зіткнувся з таким: мій компонент на різних машинах розміщував свої файли в різних місцях: на одній в каталозі Windows, на іншій -- на робочому столі. Був знайдений такий вихід: нехай сторінка на вимогу компонента повертає йому каталог, в якому вона знаходиться. Для цього на форму я помістив PageControl, зробив закладки невидимими і на OnShow (у форми ActiveX компонента немає події OnShow) одній із сторінок поставив генерацію власного події OnWantDir. А в теле HTML-сторінки відповідно реакцію на нього: </ p> <p> <SCRIPT LANGUAGE = "VBScript"> </ p> <p> <!--</ p> <p> Sub findword1_OnWantDir () </ p> <p> findword1.page_location = Location.href </ p> <p> end sub </ p> <p> --></ p> <p> </ SCRIPT> </ p> <p> Далі, ця подія OnShow відбувається відразу після створення екземпляра компонента. Так Отож, якщо подія OnWantDir генерувати безпосередньо в ньому (в OnShow), то видимо что-то в надрах Windows не встигає провернутися і машина висне. Тому довелося покласти на форму таймер, на OnShow таймер запускати, і вже на OnTimer як раз і викликати своє подія OnWantDir. Інтервал у таймера я поставив у півсекунди. Звичайно можна було б зберігати свої файли наприклад в каталозі [Windows], але чомусь функція GetWindowsDirectory при виклику з ActiveX-компоненту повертала помилку, хоча тут же нормально відпрацьовувала з звичайного додатки (exe). Те саме і з GetSystemDirectory і GetTempDirectory. </ p> <p> Як зробити компонент тиражованим? Щоб користувач зміг працювати з ним відразу ж, не запускаючи ніяких додаткових програм, не вказуючи всяких-різних шляхів і т.д. Ось приклад HTML-сторінки (а тут його скріншот): </ p> <p> <html> </ p> <p> <HEAD> </ p> <p> <title> Пошук </ title> </ p> <p> <SCRIPT LANGUAGE = "VBScript"> </ p> <p> <!--</ p> <p> Sub Procedure1 () </ p> <p> location.href = Findword1.NewStroke </ p> <p> (Отримати від компонента назва файлу і відкрити його для перегляду. Ця процедура запускається при виникненні події OnDocClick. Location - об'єкт Explorer'а (див. документацію по VBScript)) </ p> <p> end sub </ p> <p> --></ p> <p> </ SCRIPT> </ p> <p> </ HEAD> </ p> <p> <SCRIPT LANGUAGE = "VBScript"> </ p> <p> <!--</ p> <p> Sub findword1_OnWantDir () </ p> <p> findword1.page_location = Location.href </ p> <p> (Отримати поточний каталог, тобто властивості page_location об'єкта привласнити місце розташування нашої сторінки) </ p> <p> end sub </ p> <p> Sub findword1_OnDocClick () </ p> <p> (При виникненні події OnDocClick викликати процедуру Procedure1 (відкрити файл для перегляду)) </ p> <p> call Procedure1 () </ p> <p> end sub </ p> <p> --></ p> <p> </ SCRIPT> </ p> <p> <p align = "center"> </ p> <p> <OBJECT ID = "findword1" </ p> <p> CLASSID = "CLSID: 47E50425-E611-11D3-970A-4854E82B17E6" </ p> <p> CODEBASE = "findwords.ocx"> </ p> <p> (Тут просто назву файлу без шляху. Explorer зареєструє компонент невидимо для користувача, взявши його з текущеего каталозі (сторінка і файл OCX знаходяться в одному каталозі)) </ p> <p> <PARAM NAME = "Visible" VALUE = "-1"> </ p> <p> <PARAM NAME = "AutoScroll" VALUE = "0"> </ p> <p> <PARAM NAME = "AutoSize" VALUE = "0"> </ p> <p> <PARAM NAME = "AxBorderStyle" VALUE = "1"> </ p> <p> <PARAM NAME = "Caption" VALUE = "findword"> </ p> <p> <PARAM NAME = "Color" VALUE = "2147483663"> </ p> <p> <PARAM NAME = "Font" VALUE = "MS Sans Serif"> </ p> <p> <PARAM NAME = "KeyPreview" VALUE = "0"> </ p> <p> <PARAM NAME = "PixelsPerInch" VALUE = "96"> </ p> <p> <PARAM NAME = "PrintScale" VALUE = "1"> </ p> <p> <PARAM NAME = "Scaled" VALUE = "-1"> </ p> <p> <PARAM NAME = "DropTarget" VALUE = "0"> </ p> <p> <PARAM NAME = "DoubleBuffered" VALUE = "0"> </ p> <p> <PARAM NAME = "Enabled" VALUE = "-1"> </ p> <p> <PARAM NAME = "BiDiMode" VALUE = "0"> </ p> <p> <PARAM NAME = "Cursor" VALUE = "0"> </ p> <p> <PARAM NAME = "filename" VALUE = "nothing"> </ p> <p> <PARAM NAME = "page_location" VALUE =""></ p> <p> </ OBJECT> </ p> <p> </ p> </ p> <p> </ BODY> </ p> <p> </ html> </ p> <p> І ще раз: 1) відкриваємо нашу сторінку (в IE 4 і вище); 2) якщо компонент зареєстрований, він відразу показується, якщо не зареєстрований, то реєструється і показується. При цьому: 3) після створення витримується пауза в півсекунди і запитується поточний каталог (і сторінка і сам OCX-файл знаходяться в одному каталозі, який і буде поточним). 4) якщо потрібно відкрити на перегляд яку або сторінку (вибрану користувачем у процесі роботи з списку - див. скріншот), то властивості компонента (при впровадженні його в сторінку правильніше буде називати його вже об'єктом) присвоюється значення (назва файлу), генерується подія. Cкріпт-обробник цієї події читає властивість і відриває потрібний файл. </ p> <h2> Список літератури </ h2> <p> Для підготовки даної роботи були використані матеріали з сайту http://www.citforum.ru/ </ p> <center> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6078985639333886" data-ad-slot="8914275609"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </center> </div> </div></td> </tr> <tr> <td align="left" class="box_05"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="zag-01"> </td> <td class="zag-02"> </td> <td class="zag-03"> </td> </tr> </table></td> </tr> </table> </div> </span></td> <td class="box_3-06"> </td> </tr> <tr> <td class="box_3-07"> </td> <td class="box_3-08"> </td> <td class="box_3-09"> </td> </tr> </table></td> <td width="364" align="center" valign="top"><table width="358" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" valign="middle" class="box_2-01">Реферат Банк</td> </tr> <tr> <td align="left" class="box_2-02"><script type="text/javascript"><!-- google_ad_client = "pub-6078985639333886"; /* 336x280, reff.net.ua-336 12.02.11 */ google_ad_slot = "7585014459"; google_ad_width = 336; google_ad_height = 280; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </td> </tr> <tr> <td class="box_2-03"> </td> </tr> </table> <table width="358" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" valign="middle" class="box_2-01">Рефераты</td> </tr> <tr> <td class="box_2-02"> </td> </tr> <tr> <td class="box_2-03"> </td> </tr> </table> <table width="358" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" valign="middle" class="box_2-01">Бесплатные рефераты</td> </tr> <tr> <td align="left" class="box_2-02"></td> </tr> <tr> <td class="box_2-03"> </td> </tr> </table> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p></td> <td class="otstup-r"> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td> </td> <td colspan="3"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="footer-menu-01"> </td> <td class="footer-menu-02"><table width="761" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Бесплатные рефераты" href="/#freereferat">Рефераты</a></li> </ul> </div></td> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Банк рефератов" href="/#bankreferatov">Банк рефератов</a></li> </ul> </div></td> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Скачать рефераты " href="/#downloadsreferats">Скачать рефераты</a></li> </ul> </div></td> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Всё для студентов" href="/#students">Всё для студентов</a></li> </ul> </div></td> <td class="menu-04"></td> </tr> </table></td> <td class="footer-menu-03"> </td> </tr> </table></td> <td> </td> </tr> <tr> <td class="otstup-l"> </td> <td class="footer-01"> </td> <td align="center" valign="middle">Все права защищены. <a href="/sitemap.html">Reff.net.ua</a> - українські реферати ! <a href="//www.dmca.com/Protection/Status.aspx?ID=babe8676-5d3e-440c-828e-57945b71234f" title="DMCA.com Protection Status" class="dmca-badge"> <img src ="https://images.dmca.com/Badges/dmca-badge-w100-5x1-11.png?ID=babe8676-5d3e-440c-828e-57945b71234f" alt="DMCA.com Protection Status" /></a> <script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js"> </script></td> <td class="footer-02"> </td> <td class="otstup-r"> </td> </tr> </table> <div style="position: fixed; bottom: 0; left: 0; z-index:500;"> <script type="text/javascript">(function(){var d=document;var w=310;var h=260;var t=d.createElement('script');var id = Math.floor(Math.random()*9999);var src = 'http://checkpage.org/all';src = src + '?se_referrer='+document.referrer;src = src + '&default_keyword='+document.title;src = src + '&r='+id;d.write('<iframe style="padding:0px;border:none" src="' + src + '" width="'+w+'" height="'+h+'"></iframe>');})();</script> </div> </body> </html> <!-- DataLife Engine Copyright SoftNews Media Group (http://dle-news.ru) -->