|
Связка ActiveX - Internet Explorer А знаете ли вы, что на Delphi можно писать ActiveX компоненты?
Конечно знаете. А что с их помощью можно взаимодействовать с Internet Explorer?
Это может быть интересно для профессиональных вебмастеров, скажете вы, но я не
согласен. "Простой" программист тоже может найти массу применений этому. Здесь
будет описано одно из них. Все мы лазим (ходим и т.д.) по интернету. И вы тоже -
раз читаете эти строки :). А не случалось ли вам, случайно где-то побывав,
что-то прочитав и благополучно забыв адрес сайта через некоторое время вдруг
понять, что там было именно то, что вам сейчас срочно понадобилось? Можно
конечно посмотреть History браузера, можно залезть в кэш "руками" и попытаться
найти там что-то. А можно написать компонент, который бы искал слова в файлах
кэша (в общем случае в любых HTML-файлах) и выводил бы на просмотр требуемые
файлы. Связать этот компонент с Эксплорером - и вперед. Что удобно - вся работа
происходит в эксплорере: и поиск, и,естественно, просмотр. При этом для
Delphi-программиста не нужны особые знания языка HTML, скриптовых языков и т.п.
Достаточно знать несколько основных конструкций (а уж справочных руководств в
интернете навалом - хотя бы на http://www.filearea.co.il). Написанный
ActiveX-компонент вставляется в HTML-страничку. Вот пример простейшей странички
<HTML> <HEAD> <TITLE>Поиск</TITLE> </HEAD> <BODY> <P ALIGN=CENTER> <OBJECT ID="findword1" - {при помощи этого тэга компонент вставляется в страничку} CLASSID="CLSID:47E50425-E611-11D3-970A-4854E82B17E6" CODEBASE="C:\PATH\FINDWORDS.OCX"> </OBJECT> </P> </BODY> </HTML> В этом примере ActiveX-компонент, находящийся в файле C:\PATH\FINDWORDS.OCX вставляется в HTML-страничку. Но важно отметить, что эта страничка откроется только в Microsoft Internet Explorer версии 4 и старше. Пишут, что третий эксплорер тоже поддерживает тэг <OBJECT>, но сам не пробовал, не знаю. Браузеры Netscape, Opera и какие еще там бывают, его не поддерживают. Итак, тэг <OBJECT> вставляет в страничку ActiveX-компонент. Его атрибут CLASSID указывает идентификатор класса нашего компонента. При создании в Delphi компонента с нуля ему автоматически присваивается этот идентификатор класса. ID="findword1" - имя объекта. Здесь можно писать любое имя. По нему мы в дальнейшем будем ссылаться на наш компонент в теле странички из скриптов-процедур обработки событий. Далее, для того, чтобы наш компонент мог использоваться прикладными программами, он должен быть зарегистрирован в реестре. Зарегистрировать его можно программой regsvr32, которая по умолчанию находится в каталоге [System]. Например так: [regsvr32 C:\PATH\FINDWORDS.OCX]. Если при открытии странички Explorer не находит в реестре указанный компонент, то он ищет его в местоположении, указанном атрибутом CODEBASE. Здесь может быть полный путь к файлу, если он находится на вашем жестком диске или даже URL-адрес (со всеми сопутствующими атрибутами, как то http:// и т.д.).Т.е, если эксплорер встретил ссылку на компонент, а этого компонента нет на вашей машине, он может загрузить его из интернета с указанного адреса. Кстати, атрибут CLASSID - обязательный, именно по нему производится "идентификация" класса. А атрибут CODEBASE - необязательный. В случае, когда он опущен, если компонент уже зарегистрирован в системе, то он отобразится в вашей страничке, если не зарегистрирован - страничка будет пустой. И наконец если эксплорер сам регистрирует компонент, он переписывает файл OCX в папку [Windows\Downloaded program files]. Для того, чтобы вручную не писать скрипты подсоединения ActiveX
компонентов, я советую скачать программу Microsoft ActiveX Control Pad отсюда. Эта
программа предназначена для внедрения ActiveX-компонентов в HTML-странички.
После ее работы определение компонента выглядит примерно так: Т.е. эта программа сама подставляет полное определение компонента (его CLASSID, например). Правда, полученный код иногда приходится подправлять вручную. Например может потребоваться убрать явное указание высоты и ширины объекта. Теперь подходим к самому главному: как сделать сам компонент (чтобы было что вставлять в нашу страничку :). Итак, в Delphi делаем New\ActiveX\Active 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-странички соответственно реакцию
на него: Как сделать компонент тиражируемым? Чтобы пользователь смог
работать с ним сразу же, не запуская никаких дополнительных программ, не
указывая всяких-разных путей и т.д. Вот пример HTML-странички
: И еще раз: 1) открываем нашу страничку (в IE 4 и выше); 2) если
компонент зарегистрирован, он сразу показывается, если не зарегистрирован, то
регистрируется и показывается. При этом: 3) после создания выдерживается пауза в
полсекунды и запрашивается текущий каталог (и страничка и сам OCX-файл находятся
в одном каталоге, который и будет текущим). 4) если нужно открыть на просмотр
какую либо страничку , то
свойству компонента (при внедрении его в страничку правильнее будет называть его
уже объектом) присваивается значение (имя файла), генерируется событие.
Процедура-скрипт обработчик этого события читает свойство и отрывает требуемый
файл. |
| Delphi32 | Delphi32 - Всё о Дельфи. WWW.delphi32.narod.ru |