При работе с потоковым чтением 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.