我在使用流时遇到问题。我想逐行阅读我的HTML代码。随着逐行读取文件我没有问题但我需要用webbrowser读取实际打开的文档所以我写这个:
procedure TForm2.SpeedButton2Click(Sender: TObject);
var
iall : IHTMLElement;
strumien : TStringStream;
reader : TStreamReader;
begin
if Assigned(WebBrowser1.Document) then
begin
iall := (WebBrowser1.Document AS IHTMLDocument2).body;
while iall.parentElement <> nil do
begin
iall := iall.parentElement;
end;
Strumien:=Tstringstream.Create(iall.innerHTML);
Strumien.Position:=0;
reader:=TStreamReader.Create(Strumien, TEncoding.UTF8);
reader.OwnStream;
while not reader.EndOfStream do
memo1.Lines.Add(reader.ReadLine);
end;
end;
此代码无效。从文档中心只读取几行并给出“列表索引超出界限”任何人都知道为什么?使用Embarcadero XE2 Delphi
非常感谢!
答案 0 :(得分:2)
您正在将不同的字符串编码混合在一起,这可能会解释TStreamReader
无法正确读取所有内容的原因。 TStringStream
在D2009 +中也使用TEncoding
,但您未在TEncoding
构造函数中指定任何TStringStream
类型,因此它将使用TEncoding.Default
,而不是TEncoding.UTF8
与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;
// use s as needed...
end;
finally
reader.Free;
end;
finally
Strumien.Free;
end;
end;
end;
编码相同。因此,您将使用原始的UTF-16编码HTML字符串,将其转换为操作系统默认的Ansi编码,然后尝试将其读回为UTF-8。只有当数据中不包含任何非ASCII字符时,这才有效。
请改为尝试:
TMemo
在将文档加载到TStringStream
的特定情况下,您根本不需要TStreamReader
或procedure TForm2.SpeedButton2Click(Sender: TObject);
var
iall : IHTMLElement;
iparent : IHTMLElement;
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;
Memo1.Text := iall.innerHTML;
end;
end;
:
{{1}}