0

ストリームの使用に問題があります。HTMLコードを1行ずつ読みたいと思います。ファイルを1行ずつ読み取る場合、問題はありませんが、実際に開いたドキュメントをWebブラウザーで読み取る必要があるため、次のように記述します。

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;

このコードは機能しません。ドキュメントの中心から数行だけを読み取り、「範囲外のリストインデックス」を提供します。理由は誰でも知っていますか?EmbarcaderoXE2Delphiの使用

どうもありがとう!

4

1 に答える 1

2

TStreamReader異なる文字列エンコーディングを混在させているため、すべてを正しく読み取ることができない 理由が説明されている可能性があります。D2009 +TStringStreamでも使用されますが、コンストラクターで型を指定していないため、を使用します。これは、と同じエンコーディングではありません。したがって、元のUTF-16でエンコードされたHTML文字列を取得し、それをOSのデフォルトのAnsiエンコードに変換してから、UTF-8として読み戻そうとしています。これは、データに非ASCII文字が含まれていない場合にのみ機能します。TEncodingTEncodingTStringStreamTEncoding.DefaultTEncoding.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;   

ドキュメントをにロードする特定のケースでは、またはTMemoはまったく必要ありません。TStringStreamTStreamReader

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;   
于 2012-08-29T19:08:06.600 に答える