Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Извлечение текста с веб-сайта в runtime: решение проблемы с TWebBrowser в Delphi

Delphi , Интернет и Сети , Браузер

Вопрос, который стоит перед разработчиками, использующими компонент TWebBrowser в Delphi для извлечения текста с веб-сайта, заключается в следующем: при создании TWebBrowser во время выполнения программы возникает ошибка доступа. Это происходит, когда пытаются обратиться к документу веб-браузера, который еще не полностью загружен.

Описание проблемы

Разработчик хочет скопировать весь текст с веб-сайта в строку переменной. Из-за некоторых проблем с компонентом Indy, было решено использовать TWebBrowser. Код, который работает на статически созданном компоненте, выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('www.tribalwars.nl');
  while WebBrowser1.Busy do
    Application.ProcessMessages;
  Memo1.Lines.Add((WebBrowser1.Document as IHTMLDocument2).body.innerText);
end;

Однако, когда пытаются создать TWebBrowser во время выполнения программы, возникает ошибка доступа, поскольку документ браузера не полностью загружен и не доступен для использования.

Подтвержденное решение

Проблема заключается в том, что при динамическом создании TWebBrowser и передаче nil в качестве владельца, фактически владелец также становится nil. Для отображения элементов необходим не-nil владелец. Решением является установка родительского объекта для TWebBrowser после его создания. Это можно сделать следующим образом:

procedure TForm1.Button2Click(Sender: TObject);
var
  Web: TWebBrowser;
  pnlBrowser: TPanel;
begin
  pnlBrowser := TPanel.Create(nil);
  Web := TWebBrowser.Create(nil);
  TWinControl(Web).Parent := pnlBrowser; // Установка родителя для TWebBrowser
  pnlBrowser.Parent := Self; // Установка родителя для TPanel, содержащего TWebBrowser
  Web.Navigate('www.tribalwars.nl');
  while Web.Busy do
    Application.ProcessMessages;
  Memo1.Lines.Add((Web.Document as IHTMLDocument2).body.innerText);
  // Очистка ресурсов
  pnlBrowser.Free;
end;

Важно: Использование Application.ProcessMessages считается антипаттерном, и лучше использовать другие методы ожидания завершения загрузки страницы, например, события OnDocumentComplete.

Альтернативные подходы

Если использовать TWebBrowser нежелательно, можно рассмотреть другие подходы для извлечения текста с веб-сайта, например, использование Win32 API или специализированных библиотек, таких как Indy.

Заключение

При динамическом создании TWebBrowser важно установить родительский объект, чтобы обеспечить корректное отображение содержимого. Использование TWebBrowser для программного извлечения текста из интернета не является идеальным решением, и в некоторых случаях лучше рассмотреть альтернативные методы.

Создано по материалам из источника по ссылке.

Проблема связана с извлечением текста с веб-сайта через компонент TWebBrowser в Delphi, когда он создается в runtime, и возникают ошибки доступа к не полностью загруженному документу.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:54:24/0.0020980834960938/0