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

Ошибка "List index out of bounds" в Delphi при работе с потоковым чтением HTML: решение с использованием UTF-8

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

При работе с потоковым чтением HTML-кода в Delphi, пользователь столкнулся с ошибкой "List index out of bounds". Проблема возникла при попытке прочитать HTML-код открытой в веб-браузере страницы построчно. В коде используется TStreamReader для работы с потоком, но при чтении кода из веб-браузера Delphi XE2 происходит сбой.

Причина проблемы

Ошибка "List index out of bounds" может быть вызвана несоответствием кодировок при работе со строками. В исходном коде не указано использование конкретной кодировки для TStringStream, что приводит к использованию по умолчанию TEncoding.Default. В то время как TStreamReader создается с указанием TEncoding.UTF8. Это означает, что HTML-строка, закодированная в UTF-16, преобразуется в кодировку операционной системы, а затем пытается быть прочитанной как UTF-8, что приводит к ошибке.

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

Для решения проблемы необходимо использовать единую кодировку для всего процесса чтения. В предложенном решении используется TEncoding.UTF8 для TStringStream. Также рекомендуется использовать конструкции try-finally для корректного освобождения ресурсов.

procedure TForm2.SpeedButton2Click(Sender: TObject);
var
  iall : IHTMLElement;
  iparent : IHTMLElement;
  strumien : TStringStream;
  reader : TStreamReader;
  s: String;
begin
  if Assigned(WebBrowser1.Document) then
  begin
    iall := (WebBrowser1.Document as IHTMLDocument2).body;
    iparent := iall.parentElement;
    while iparent <> nil do
    begin
      iall := iparent;
      iparent := iparent.parentElement;
    end;
    strumien := TStringStream.Create(iall.innerHTML, TEncoding.UTF8, False);
    try
      strumien.Position := 0;
      reader := TStreamReader.Create(strumien, TEncoding.UTF8);
      try
        while not reader.EndOfStream do
        begin
          s := reader.ReadLine;
          // Используйте s как нужно...
        end;
      finally
        reader.Free;
      end;
    finally
      strumien.Free;
    end;
  end;
end;

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

Если цель состоит в том, чтобы загрузить содержимое документа в TMemo, можно обойтись без TStringStream и TStreamReader, напрямую присвоив содержимое innerHTML элемента TMemo.

procedure TForm2.SpeedButton2Click(Sender: TObject);
var
  iall : IHTMLElement;
begin
  if Assigned(WebBrowser1.Document) then
  begin
    iall := (WebBrowser1.Document as IHTMLDocument2).body;
    Memo1.Text := iall.innerHTML;
  end;
end;

Заключение

Использование единой кодировки TEncoding.UTF8 для всех операций с потоком данных позволяет избежать ошибок, связанных с несоответствием кодировок. При работе с потоковым чтением важно также корректно обрабатывать ресурсы, используя блоки try-finally для освобождения выделенной памяти.

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

При работе с потоковым чтением HTML-кода в Delphi возникла ошибка 'List index out of bounds' из-за несоответствия кодировок, которую можно решить, используя единую кодировку UTF-8.


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

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




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


:: Главная :: ActiveX ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 15:25:09/0.0031640529632568/0