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

Проблема итерации DOM в Delphi Chromium: когда наследуемый класс TCEFDomVisitor Own игнорируется

Delphi , Технологии , DDE

При работе с веб-разработкой в среде Delphi, разработчики часто сталкиваются с необходимостью взаимодействия с элементами страницы. Одним из популярных решений для интеграции браузера в приложение является использование компонента TChromium. Однако, несмотря на его мощь и гибкость, могут возникать сложности.

Введение

Итерация DOM (Document Object Model) — это процесс обхода элементов страницы, который может быть полезен для различных задач: от простого извлечения данных до автоматизации тестирования. Для выполнения этой задачи в Delphi 2007 и выше версий, где не поддерживаются анонимные методы, разработчики создают классы, наследуемые от TCEFDomVisitorOwn.

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

Рассмотрим типичную проблему: процедура visit, определенная в классе TElementVisitor, который является наследником TCefDomVisitorOwn, не вызывается. Это означает, что несмотря на то, что разработчик создал класс и правильно инициализировал его для использования с Chromium1.Browser.MainFrame.VisitDom(visitor);, сам процесс обхода DOM не запускается.

procedure TElementVisitor.visit(const document: ICefDomDocument);
begin
  // Этот код никогда не выполняется
  ProcessNode(document.Body);
end;

Подтвержденный ответ

Проблема кроется в отсутствии RenderProcessHandler. Это ключевой компонент, который позволяет рендереру получать сообщения от главного процесса. В вашем DPR файле должен быть определен код, аналогичный следующим примерам.

type
  TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
    ...
  end;
...
initialization
  CefRenderProcessHandler := TCustomRenderProcessHandler.Create;

Альтернативный ответ

Предоставленный альтернативный код демонстрирует, как должен быть реализован TElementNameVisitor и использование сообщений для взаимодействия с рендерером.

constructor TElementNameVisitor.Create(const AName: string);
begin
  inherited Create;
  FName := AName;
end;

function TElementNameVisitor.getAttributeName: string;
begin
  // ...
end;

procedure TElementNameVisitor.visit(const document: ICefDomDocument);
var
  a_Level: integer;
begin
  // Обход элементов DOM с помощью рекурсивной процедуры ProcessNode
  a_Level := 0;
  ProcessNode(document.Body, a_Level);
end;

procedure _ElementCB(aNode: ICefDomNode; var aLevel: integer);
begin
  // Отправка данных обратно в главный процесс
  _Browser.SendProcessMessage(PID_BROWSER, a_message);
end;

function TCustomRenderProcessHandler.OnProcessMessageReceived(
  const browser: ICefBrowser;
  sourceProcess: TCefProcessId;
  const message: ICefProcessMessage): Boolean;
begin
  // Обработка сообщений от рендерера и обратная связь с ним
end;

procedure _ProcessElementsByAttribute(const aFrame: ICefFrame; aName, aAttributeName: string; aVisitor: TNotifyVisitor);
begin
  // Инициализация посетителя для обработки атрибутов элементов DOM
end;

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

Заключение

В данной статье мы рассмотрели проблему итерации DOM с использованием TChromium в среде Delphi. Мы выяснили, что ключевым моментом является правильная реализация RenderProcessHandler для обеспечения обмена сообщениями между рендерером и главным процессом. Приведенные примеры кода помогут разработчикам избежать типичных ошибок при работе с DOM в Delphi Chromium.

Необходимо помнить, что работа с Chromium требует глубокого понимания механизмов взаимодействия между процессами и правильной обработки сообщений. Следуя рекомендациям из этой статьи, вы сможете успешно интегрировать TChromium в свои проекты на Delphi.

 

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

Проблема связана с некорректной работой класса для итерации DOM в компоненте TChromium в Delphi, где отсутствует вызов метода `visit` при попытке обхода элементов страницы.


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

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




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


:: Главная :: DDE ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:51:35/0.0061638355255127/0