Пользователи, работающие с компонентом TWebBrowser в среде разработки Delphi, иногда сталкиваются с задачей доступа к изображениям, отображаемым на веб-странице, которые не входят в коллекцию изображений самого браузера. Такая ситуация может возникнуть, например, при загрузке страницы https://www.nbbclubsites.nl/club/8000/uitslagen, где видно, что есть два изображения слева от голубой полосы заголовка.
При использовании кода для подсчета изображений:
procedure TForm1.GetImageCount;
var
Count : Integer;
Doc : IHtmlDocument2;
begin
Doc := IDispatch(WebBrowser1.Document) as IHtmlDocument2;
Count := Doc.images.length;
ShowMessageFmt('ImageCount: %d', [Count]);
end;
в сообщении об ошибке отображается счетчик 1, в то время как ожидается 2. Первое изображение можно легко получить и сохранить на диск, но второе и последующие недоступны, так как они не входят в коллекцию Images загруженной страницы.
Решение проблемы
Для доступа ко второму изображению и сохранения его на диск, необходимо учитывать, что оно может быть расположено в iframe. В этом случае, необходимо обрабатывать iframe в событии OnDocumentComplete. Вот пример кода, который демонстрирует, как можно обработать iframe и получить доступ к изображению:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, MsHtml;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; const URL: OleVariant);
procedure FormShow(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
WebBrowser1.Navigate('https://www.nbbclubsites.nl/club/8000/uitslagen');
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch;
const URL: OleVariant);
var
currentBrowser: IWebBrowser;
topBrowser: IWebBrowser;
Doc : IHtmlDocument2;
begin
currentBrowser := pDisp as IWebBrowser;
topBrowser := (ASender as TWebBrowser).DefaultInterface;
if currentBrowser = topBrowser then
begin
// Основной документ
Doc := currentBrowser.Document as IhtmlDocument2;
ShowMessageFmt('ImageCount: %d', [Doc.images.length]);
end
else
begin
// ifarme
Doc := currentBrowser.Document as IhtmlDocument2;
ShowMessageFmt('ImageCount: %d', [Doc.images.length]);
// Дополнительный код для обработки и сохранения изображений
end;
end;
end.
Важно отметить, что процесс сохранения самого изображения уже обсуждался в другом вопросе и может быть реализован с использованием соответствующих методов.
Альтернативные подходы
Также стоит учитывать, что веб-страницы могут передавать изображения клиенту двумя способами: как файлы, сохраняемые в папку временных интернет-файлов, или через специальный поток данных изображений, что часто используется для изображений, которые часто обновляются, или когда владелец сайта не хочет, чтобы их изображения копировали.
Кроме того, при работе с кросс-доменными фреймами, доступ к коллекции Frames может быть невозможен, но существуют и другие способы доступа к содержимому.
Используя представленный код, разработчики на Delphi смогут успешно решать подобные задачи, связанные с доступом и сохранением изображений на веб-страницах, используя компонент TWebBrowser.
Проблема заключается в том, что при использовании компонента `TWebBrowser` в Delphi для отображения веб-страниц не все изображения доступны через коллекцию `Images` браузера, особенно если они расположены в iframe.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.