| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
Связка ActiveX - Internet Explorer А знаете ли вы, что на Delphi можно писать ActiveX компоненты?
Конечно знаете. А что с их помощью можно взаимодействовать с Internet Explorer?
Это может быть интересно для профессиональных вебмастеров, скажете вы, но я не
согласен. "Простой" программист тоже может найти массу применений этому. Здесь
будет описано одно из них. Все мы лазим (ходим и т.д.) по интернету. И вы тоже -
раз читаете эти строки :). А не случалось ли вам, случайно где-то побывав,
что-то прочитав и благополучно забыв адрес сайта через некоторое время вдруг
понять, что там было именно то, что вам сейчас срочно понадобилось? Можно
конечно посмотреть History браузера, можно залезть в кэш "руками" и попытаться
найти там что-то. А можно написать компонент, который бы искал слова в файлах
кэша (в общем случае в любых HTML-файлах) и выводил бы на просмотр требуемые
файлы. Связать этот компонент с Эксплорером - и вперед. Что удобно - вся работа
происходит в эксплорере: и поиск, и,естественно, просмотр. При этом для
Delphi-программиста не нужны особые знания языка 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 Т.е. эта программа сама подставляет полное определение компонента (его 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) если нужно открыть на просмотр
какую либо страничку (выбранную пользователем в процессе работы из списка - см.
Ну вот пока все об этом. Надеюсь обновлять эту страничку регулярно. Если есть вопросы - |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|