1

DelphiのTHtmlViewerコンポーネント内に表示したいUnicode.htmlファイルがいくつかあります。

'.LoadFromFile'を実行するだけでコードが機能するように説得できないようです-最初にUnicodeファイルをストリームにロードしてから、何らかの方法で変換する必要がありますか?

Delphi 2007、THtmlViewer v9.45

これまで、Unicodeファイル(THtmlViewer)では何もしていません。

4

3 に答える 3

2

参考までに、THTMLViewerはGoogleコードで積極的に維持されています(数分前の最後のコミット): http ://code.google.com/p/thtmlviewer/

D6-DXE2とLazarusの互換性、「元の」(9.45)バージョンからの多数の修正と改善。

于 2012-07-01T16:57:21.613 に答える
1

さて、これが私が思いついたものの根性です。建設的な批判と観察に感謝します!

//ansiまたはunicodeタイプのhtmlドキュメントをブラウザコンポーネントにロードします。
//ファイル名は既存のファイルとしてすでに確認されています
プロシージャTfrmBrowser.LoadDocument(FFileName:string);
var
  FWideText:ワイドストリング;
  FAnsiText:AnsiString;
  FRequiredLen:整数;
  FFileStream:TFileStream;
  FMemStream:TMemoryStream;
  FBuffer:バイト;
始める
  FFileStream:= TFileStream.Create(FFileName、fmOpenReadまたはfmShareDenyNone);
  // 5ダース未満のバイトは無意味ですが、...
  FFileStream.Size> 1の場合、
  始める
    //ファイルの最初のバイトをチェックして、ファイルタイプに関する手がかりを与えます
    FFileStream.Read(FBuffer、1);
    FFileStream.Position:= 0; //巻き戻し位置
    (FBuffer = $ FF)または(FBuffer = $ EF)の場合
    始める
      //おそらくUnicode
      FRequiredLen:= FFileStream.Size div 2; //文字あたり2バイト
      SetLength(FWideText、FRequiredLen);
      FFileStream.Read(FWideText [1]、FFileStream.Size);
      //それをAnsistringにキャストします
      FAnsiText:= FWideText;
      FMemStream:= TMemoryStream.Create;
      FMemStream.Write(FAnsiText [1]、FRequiredLen);
      FMemStream.Position:= 0; //位置を巻き戻します
      //ストリームをTHtmlViewerにロードします
      vwBrowse.LoadFromStream(FMemStream);  
      FMemStream.Free;
    終わり
    そうしないと
    始める
      //おそらくAnsi、元のファイルストリームをロードするだけ
      vwBrowse.LoadFromStream(FFileStream);
    終わり;
    FFileStream.Free;
  終わり;

明らかにいくつかのエラートラップが欠落していますが、それが基本的な考え方です。

于 2009-07-26T10:16:17.477 に答える
1

あなたはDelphi2007を使用しています。それはDelphiプログラミングでUnicode時代が始まる前です!

Delphiの初期バージョンでUnicodeを機能させるのは非常に面倒ですが、一部のコントロール、特にTHtmlViewコンポーネントで満足のいく結果を得るのはかなり可能です。

私のプログラムの1つからいくつかのコード例を投稿します:

//code to toggle source or WYSIWYG views
var
  htmEd: IHTMLDocument2;
begin
  htmEd := HtmlEdit.Document as IHtmlDocument2;
  if ToggleTabSet.TabIndex = 0 then
  begin
    HtmlEditContainer.PageIndex := 0; // Tab sheet index
    htmEd.body.innerHTML := Memo1.Lines.Text; // TTntMemo
    pnlEditorState.Caption := 'Design View';
  end
  else
    if ToggleTabSet.TabIndex = 1 then
    begin
      HtmlEditContainer.PageIndex := 1;
      Memo1.Lines.Text := HtmEd.body.innerHTML;
      pnlEditorState.Caption := 'Source View';
    end;

上記のコードを読むと、htmlファイルが最初にロードされるTTntMemoコンポーネントを使用していることがわかります。次に、メモの「テキスト」をHtmlViewの「body.innerHTML」プロパティにロードします。

htmEd.body.innerHTML := Memo1.Lines.Text;

  1. TntWareの「Memo1.Lines.Text;」WideStringタイプです。
  2. 'IHTMLDocument2'はTEmbeddedWBから来ています。TEmbeddedWBが優れている理由をご覧ください。

それが私にとって初期の頃はうまくいったことです。Delphi 2009に切り替えましたが、今でははるかに簡単になっています(ファイルのロード中に適切なTEncodingを設定するだけです)。

于 2009-08-11T06:15:59.503 に答える