Delphi3 начал иметь компонент Twebbrowser, но он появился в виде управления ActiveX в то время и должен был быть введен сам по себе. Компонентная панель включена. Я часто слышу, как Delphi ругает за то, что они делают очень плохо. Будет больше.
Вот некоторые опыт использования Twebbrowser для создания программ и некоторых примеров и информации, собранных в Интернете.
1. Инициализация и завершение
Когда вы выполняете метод TwebbrowSer для выполнения желаемой операции, такой как EXECWB и т. Д., Вы, возможно, столкнулись с ошибками, такими как «пытаясь активировать незарегистрированную отсутствующую цель» или «OLE -объект, не зарегистрированный», или нет ошибки Это не сделано. Когда я использовал его для программы, я обнаружил, что EXECWB иногда работает, но иногда не работает. Это была также случайная возможность, которую я понял, что объекты OLE должны быть инициализированы и прекращены (слишком мало вещей, чтобы понять).
Я использовал метод, упомянутый в моей предыдущей статье «Анимация и решения для оконной программы Delphi для обычной плитки». Наконец -то сделал это! Причина, я думаю, это, вероятно, связано с тем, что Twebbrowser является встроенным объектом OLE и не является VCL, написанным в Delphi.
Инициализация
Олеинитиализация (ноль);
Завершение
пытаться
Олеунициализация;
кроме
конец;
Эти предложения размещаются после всех утверждений в главном окне, прежде чем «конец».
------------------------------------------------------ ---------------------------------
2. EmptyParam
В Delphi 5 метод навигации Twebbrowser перегружен несколько раз:
Процедура перемещается (const url: withestring);
Процедура перемещается (const url: widestring; флаги var:
Олеварян);
Процедура перемещается (const url: widestring; флаги var:
Olevariant;
Процедура перемещается (const url: widestring; флаги var:
Olevariant;
Олеварян);
Процедура перемещается (const url: widestring; флаги var:
Olevariant;
Олеварян;
В фактических приложениях при вызове последнего метода, поскольку мы редко используем последние параметры, но объявление функции требует переменных параметров, общий метод заключается в следующем:
вар
Т: Олеварянт;
Начинать
webbrowser1.navigate (edit1.text, t, t, t, t);
конец;
Очень трудно определить переменную T (и есть еще много мест, где можно использовать его). На самом деле, вместо этого мы можем использовать emptyParam (emptyParam - это общий вариант пустой переменной, не присваивайте ему значение), только одно предложение:
webbrowser1.navigate (edit1.text, emptyparam, emptyparam, emptyparam, emptyparam);
Хотя это немного дольше, это гораздо удобнее, чем определение переменных каждый раз. Конечно, первый метод также может быть использован.
webbrowser1.navigate (edit1.text)
------------------------------------------------------ ---------------------------------
3. Общие командные операции могут быть завершены с использованием метода execwb.
Процедура execwb (cmdid: olecmdid; cmdexecopt:
Olecmdexecopt);
Процедура execwb (cmdid: olecmdid; cmdexecopt: olecmdexecopt;
var pvain:
Олеварян);
Процедура execwb (cmdid: rolecmdid; cmdexecopt:
Olecmdexecopt;
Olevariant;
Открыть: диалоговое окно «Открыть интернет -адрес» появляется, а CommandId - OLECMDID_OPEN (если версия браузера IE5.0,
Тогда эта команда недоступна).
Сохранить как: вызовите диалоговое окно «Сохранить как».
Execwb (olecmdid_saveas, olecmdexecopt_dodefault,
EmptyParam,
EmptyParam);
Печать, предварительный просмотр и настройки страниц: вызовите диалоговые окна «Печать», «Печать предварительного просмотра» и «Настройки страницы» (IE5.5 и выше поддерживают только версии «Тип»
Предварительный просмотр печати, поэтому реализация должна проверить, доступна ли эта команда).
Execwb (olecmdid_print, olecmdexecopt_dodefault,
EmptyParam,
EmptyParam);
Если QueryStatuswb (olecmdid_printpreview) = 3 then
Execwb (olecmdid_printpreview, olecmdexecopt_dodefault,
EmptyParam, EmptyParam);
Execwb (olecmdid_pagesetup, olecmdexecopt_dodefault,
EmptyParam,
EmptyParam);
Вырезать, копировать, вставить, выбирать все: нет необходимости много говорить о функции, важно отметить, что резка и вставка не только предоставляет текст для редактирования кадров, но и не редактируя на веб-страницах.
Текст коробки редактирования также эффективен. Получите статус включения команды
Существует два способа выполнения команд (в качестве примера, вырезание, вставка и выбор всех заменит соответствующие ключевые слова.
Просто измените его, а именно вырезать, вставить и выбрать, соответственно):
A. Используйте метод QueryStatuswb Twebbrowser.
if (QueryStatuswb (olecmdid_copy) = olecmdf_enabled) или
Olecmdf_supported) тогда
Execwb (olecmdid_copy, olecmdexecopt_dodefault,
EmptyParam,
EmptyParam);
B. Используйте метод QueryCommandenedabled Ihtmldocument2.
вар
Док: ihtmldocument2;
Начинать
Doc: = webbrowser1.document как ihtmldocument2;
Если doc.querycommandenabled ('copy') тогда
Doc.execcommand ('copy', false, emptyparam);
конец;
Поиск: см. Девятую функцию «Найти».
------------------------------------------------------ ---------------------------------
4. Размер шрифта
Подобно пять элементов от «максимума» до «минимума» в меню «шрифт» (соответствует целым численным целым.
Свойства установлены на 0 ~ 4 соответственно).
A. Прочитайте размер шрифта текущей страницы.
вар
Т: Олеварянт;
Начинать
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
EmptyParam, t);
Случай t
4: самый большой. Провернут: = true;
3: больше. Провернут: = true;
2: середина. Провернут: = true;
1: маленький. Провернут: = true;
0: наименьший. Провернут: = true;
конец;
конец;
B. Установите размер шрифта страницы.
Самый большой. Провернут: = неверно;
Больше. Провернут: = false;
Middle.cecked: = false;
Small.cecked: = false;
Наименьший. Провернут: = false;
Tmenuitem (отправитель). Провернул: = true;
t: = tmenuitem (отправитель) .tag;
Webbrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
t, t);
------------------------------------------------------ ---------------------------------
5. добавить в фавориты и организовать фавориты
констант
Clsid_shelluihelper: tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
вар
P: Процедура (Руководство: Тандл; Путь: PCHAR);
Процедура tform1.organizefavorite (отправитель: tobject);
вар
H: hwnd;
Начинать
H: = LoadLibrary (pchar ('shdocvw.dll'));
Если h <> 0, то
Начинать
P: = getProcAddress (h, pchar ('doorganizefavdlg'));
Если назначено (p), то P (Application.handle,
Pchar (Favfolder));
конец;
Фрилибрика (H);
конец;
Процедура tform1.addfavorite (отправитель: tobject);
вар
Shelluihelper: Ishelluihelper;
URL, название: Olevariant;
Начинать
Название: = webbrowser1.locationName;
Url: = webbrowser1.locationUrl;
Если url <> '', тогда
Начинать
Shelluihelper: = createComObject (clSID_SHELLUIHELPER) как
Ishelluihelper;
Shelluihelper.addfavorite (URL, название);
конец;
конец;
Метод использования приведенного выше метода для открытия диалогового окна «Добавить к фаворитам» через интерфейс Ishelluihelper относительно прост, но есть недостаток, то есть открытое окно не является окном режима, но не зависит от приложения. Возможно, что если вы используете тот же метод, что и процедура OrganizeFaverite для открытия диалога, вы можете естественным образом реализовать окно режима, потому что вы можете указать ручку родительского окна (эффект такой же, как открытие «Добавить в фаворит» Диалог в Explorer и IE). Проблема, очевидно, это. Это не имело значения, было ли это окно шаблона?
Следующий процесс расскажет вам прототип функций Doaddtofavdlg. Следует отметить, что диалоговое окно, открытое таким образом, не выполняет операцию «Добавить к фаворитам». хочет разместить интернет -ярлык.
Процедура tform1.addfavorite (т.е. tembeddedwb);
Процедура CreateUrl (Aurlpath, Aurl: pchar);
вар
Urlfile: tinifile;
Начинать
Urlfile: = tinifile.create (string (aurlpath));
rlfile.writestring ('Internethortcut', 'url',
Строка (aurl));
rlfile.free;
конец;
вар
Addfav: функция (ручка: Thandle;
Urlpath: pchar;
Название: pchar;
Favidlist: Pitemidlist): Bool;
FDOC: Ihtmldocument2;
Urlpath, url, заголовок: массив [0..max_path] char;
H: hwnd;
PIDL: Pitemidlist;
Фреток: Бул;
Начинать
Fdoc: = ihtmldocument2 (ie.document);
Если fdoc = nil, тогда выйдет;
Strpcopy (заголовок, fdoc.get_title);
Strpcopy (url, fdoc.get_url);
Если url <> '', тогда
Начинать
H: = LoadLibrary (pchar ('shdocvw.dll'));
Если h <> 0, то
Начинать
Shgetspecialfolderlocation (0, csidl_favorites, pidl);
Addfav: = getProcadDress (h, pchar ('doaddtofavdlg'));
Если назначено (addfav), тогда
Fretok: = addfav (ручка, urlpath, sizeof (urlpath),
Заголовок, sizeof (заголовок), pidl)
конец;
Фрилибрика (H);
Если Фреток, тогда
CreateUrl (urlpath, url);
конец
конец;
------------------------------------------------------ ---------------------------------
6. Сделайте фокусировку WebBrowser
Twebbrowser очень особенный.
Сам исследователь имеет ярлыки клавиши, решение заключается в следующем:
Процедура tform1.setfocustodoc;
Начинать
Если WebBrowser1.document <> nil, тогда
с WebBrowser1.Application в качестве ioleobject do
Doverb (oleiverb_uiactivate, nil, webbrowser1, 0, handle,
GetClientRect);
конец;
Кроме того, я также нашел более простой способ, который перечислен здесь:
Если WebBrowser1.document <> nil, тогда
Ihtmlwindow2 (ihtmldocument2 (webbrowser1.document) .parentwindow) .focus
Только что нашел более простой способ, возможно, самый простой:
Если WebBrowser1.document <> nil, тогда
Ihtmlwindow4 (webbrowser1.document) .focus
Кроме того, вам нужно определить, получил ли документ фокус:
Если ihtmlwindow4 (webbrowser1.document) .hasfocus тогда
------------------------------------------------------ ---------------------------------
7. Нажмите кнопку «Отправить»
Так же, как в каждой форме есть кнопка «по умолчанию», каждая форма на веб -странице также имеет кнопку «По умолчанию», то есть кнопку с атрибутом «Отправить». эквивалентно щелчке «Отправить» на мышью. Тем не менее, Twebbrowser, похоже, не отвечает на ключ Enter, и даже если клавиатура формы, содержащей Twebbrowser, установлен на True, ключи, отправленные пользователем в Twebbrowser, не могут быть перехвачены в событии Keypress в форме.
Мое решение состоит в том, чтобы использовать компонент ApplicatineVents или написать событие OnMessage объекта TAPPLICATION самостоятельно, оценить тип сообщения и ответьте на сообщение клавиатуры. Что касается нажатия кнопки «Отправить», вы можете сделать это, проанализируя веб -исходный код, но я нашел более простой и более быстрый метод. Кто -то еще написал.
A. Используйте функцию SendKeys, чтобы отправить клавишу Enter в WebBrowser
В Дельфи
5 Существует файл SNDKEY32.PAS в каталоге Info/Extras/SendKeys, который содержит две функции SendKeys и AppActivate. Это очень просто.
SendKeys ('~', true); // Нажмите Клавиш возврата
Подробное описание параметра функции SendKeys и т. Д. Включено в файл SNDKEY32.PAS.
B. Передайте полученное сообщение клавиатуры Webbrowser в событии OnMessage.
Процедура tform1.applicationEvents1message (var msg: tmsg;
var обрабатывается: логический);
{Исправляет неисправность некоторых ключей в веб -брузере
контроль}
констант
Stdkeys = [vk_tab, vk_return];
Extkeys = [vk_delete, vk_back, vk_left, vk_right];
расширенные ключи}
Fexted = $ 01000000;
Начинать
Обрабатывается: = false;
с MSG DO
if ((message> = wm_keyfirst) и (сообщение <= wm_keylast)))
и
((WPARAM в Stdkeys) или
{$ Ifdef ver120} (getKeyState (vk_control) <0) или {$ endif}
(WPARAM в Extkeys) и
((LPARAM и FEXTEND) = FEXTENDED)) Затем
пытаться
Если ischild (ручка, hwnd), то {обрабатывает все браузер
Связанные сообщения}
Начинать
с {$ ifdef
Ver120} приложение _ {$ else} приложение {$ endif} as
IoleinplaceActiveObject do
Обрабатывается: = translateAccelerator (msg) = s_ok;
Если не обработано, тогда
Начинать
Обрабатывается: = true;
TranslateMessage (MSG);
DispatchMessage (MSG);
конец;
конец;
кроме
конец;
Конец; // MessageHandler
(Этот метод поступает из EmbeddedWb.pas)
------------------------------------------------------ ---------------------------------
8. Получите исходный код веб -страницы и HTML непосредственно из Twebbrowser
Давайте сначала представим чрезвычайно простой метод получения исходного кода веб -страницы, к которому доступ к Twebbrowser. Общий метод состоит в том, чтобы использовать интерфейс Impersistreminit, предоставленный объектом документа в управлении Twebbrowser для его реализации. Размер исходного кода HTML выделяйте глобальный блок памяти кучи, создайте поток, а затем напишите текст HTML в потоку. Хотя программа не является сложной, существуют более простые методы, поэтому код реализации больше не указан. На самом деле, в основном все функции IE Twebbrowser должны иметь относительно простой способ их реализации, и то же самое верно для получения исходного кода веб -страницы. Следующий код отображает исходный код веб -страницы в Memo1.
Memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outerhtml);
В то же время, очень просто сохранить HTML -файлы в качестве текстовых файлов при просмотре Twebbrowser, и никаких инструментов синтаксического анализа не требуется, поскольку Twebbrowser также завершается следующим образом:
Memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outertext);
------------------------------------------------------ ---------------------------------
9. "Найти" функцию
Диалоговое окно поиска можно вызвать, нажав клавишу Ctrl-F, когда документ получает фокус. Программа, чтобы сделать это.
вар
Док: ihtmldocument2;
Txtrange: ihtmltxtrange;
Начинать
Doc: = webbrowser1.document как ihtmldocument2;
Doc.selectall;
// Это предложение особенно важно, потому что может работать метод объекта ihtmltxtrange
// документ уже имеет область выбора текста. Поскольку следующее утверждение выполнено, он не будет
// Смотрите процесс выбора всех документов.
Txtrange: = doc.selection.createrange как ihtmltxtrange;
Txtrange.findtext ('текст для поиска », 0,0);
Txtrange.select;
конец;
Кроме того, вы можете получить в настоящее время выбранное текстовое содержимое от txt.get_text, что в какой -то момент полезно.
------------------------------------------------------ ---------------------------------
10. Извлеките все ссылки на веб -странице
Этот метод поступает от друга форума монополии, отвечающего на вопрос.
вар
Док: ihtmldocument2;
Все: ihtmlelementCollection;
Лен, я: целое число;
Предмет: Олеварянт;
Начинать
doc: = webbrowser1 .document как ihtmldocument2;
Все: = doc.get_links;
Len: = All.length;
для i: = 0 до len-1 начинается
item: = all.item (i, varempty);
memo1.lines.add (item.href);
конец;
конец;
------------------------------------------------------ ---------------------------------
11. Установите кодирование Twebbrowser
Почему я всегда упускаю много возможностей? На самом деле, я должен был думать об этом в течение долгого времени, но разница в мысли сделает его миром разницы. Если бы я думал об этом больше и попробовал это больше, это не было бы 11 -го. Вот функция, которая невообразимо проста в решении.
Процедура SetCharset (Awebbrowser: Twebbrowser; Acharset:
Нить);
вар
Обновления: олеварян;
Начинать
Ihtmldocument2 (awebbrowser.document) .set_charset (ахарсет);
Обновление: = 7; // Этот 7 должен прийти из реестра, чтобы помочь с ошибками.
Awebbrowser.refresh2 (обновление);
Конец;