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

Ошибка при сохранении исходного HTML-кода в TChromium: неправильная передача обратных вызовов между классами на Delphi

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

Конечно, я помогу вам написать статью. Прежде всего, давайте определим ключевые моменты, которые нужно осветить в статье:

  1. Объяснение проблемы с TChromium и получением исходного HTML-кода.
  2. Демонстрация ошибки при передаче обратных вызовов между классами на Delphi.
  3. Подробное описание предложенного решения с использованием TCefStringVisitorOwn.
  4. Примеры кода, которые помогут читателям понять и применить решение.

Статья: Ошибка при сохранении исходного HTML-кода в TChromium

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

Проблема

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

E2009 Incompatible types: 'regular procedure and method pointer'

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

Пример кода

unit simple1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cefvcl, ceflib;
// ... остальной код интерфейса ...

type
  TForm1 = class(TForm)
    Chromium1: TChromium;
    procedure FormCreate(Sender: TObject);
    procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
      httpStatusCode: Integer);
  public
    mySource : string;
    procedure StringVisitor(const str: ustring);
  end;
// ... остальной код ...

implementation
{$R *.dfm}

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
  httpStatusCode: Integer);
begin
  Chromium1.Browser.MainFrame.GetSourceProc(StringVisitor); // ошибка на этой строке
end;

procedure TForm1.StringVisitor(const str: ustring);
begin
  mySource := str;
end;
// ... остальной код реализации ...

Решение проблемы

Чтобы решить эту проблему, был предложен подход с использованием TCefStringVisitorOwn. Создание нового класса, который наследует TCefStringVisitorOwn и реализует интерфейс ICefStringVisitor, позволяет сохранить исходный код в свойстве этого класса.

unit SourceContainerU;
interface
uses
ceflib;
// ... остальной код интерфейса ...

type
  TSourceContainer = class(TCefStringVisitorOwn, ISourceContainer)
  private
    FSource: ustring;
  protected
    procedure Visit(const str: ustring); override;
  public
    function Source: ustring;
  end;
// ... остальная часть класса и реализация ...

Пример использования TSourceContainer

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
cefvcl, ceflib, SourceContainerU;
// ... остальной код интерфейса ...

type
  TForm1 = class(TForm)
    // ... компоненты и процедуры ...
    private
      Chromium1: TChromium;
      SourceContainer : ISourceContainer;
      procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
        httpStatusCode: Integer);
    // ... другие приватные процедуры ...
  public
  end;
// ... остальной код ...

implementation
{$R *.dfm}

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
  httpStatusCode: Integer);
begin
  if Frame = nil then
    exit;

  SourceContainer := TSourceContainer.Create;
  Frame.GetSource(SourceContainer);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ... инициализация Chromium ...
end;

// ... другие публичные процедуры, включая Button1Click для отображения исходного кода ...

// ... остальная часть реализации ...

Заключение

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

Эта статья предоставляет разработчикам полезную информацию о решении распространенной проблемы и может служить примером для дальнейших исследований и применения компонентов TChromium в своих проектах на Delphi.

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

Разработчик сталкивается с проблемой сохранения исходного HTML-кода страницы, отображаемой в компоненте TChromium в среде Delphi, и находит решение с использованием класса `TCefStringVisitorOwn`.


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

Получайте свежие новости и обновления по 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 02:32:28/0.0034210681915283/0