2009-07-25 6 views
1

デルファイのTHtmlViewerコンポーネントの中に表示したいユニコードの.htmlファイルがあります。PBearのTHtmlViewerをユニコードのHTMLファイルを読み込んで表示するには?

'.LoadFromFile'を実行するコードを説得することができないようです - 私は最初にユニコードファイルをストリームにロードして何とかそれを変換する必要がありますか?

デルファイ2007、THtmlViewerのv9.45

は私が前に、Unicodeのファイル、またはTHtmlViewerで何もしていませんでした。

+0

なぜ "Unicode" htmlファイルがありますか?私はあなたがUTF-16/UCS-2エンコーディング(http://en.wikipedia.org/wiki/UCS-2)でファイルを持っているということを意味します。生成するアプリケーションをUTF-8エンコーディングで書き換える方がずっと良いでしょう。 [一般的な見解では、私はTHHTViewerで何の経験も持っていません。] – mghie

+0

@mghie - 観測に感謝します。それらはUTF-16ファイルです。なぜなら、それらを生成するプログラム(私のコントロールの外にある)がそれらを出力しているからです。だから私は現時点でそれに固執していますが、私はプロジェクトの世代部分を引き継ぎ、出力形式を適切に制御できることを願っています。 – robsoft

答えて

1

さて、ここには私が思いついたものがあります。建設的な批判と観測が評価されました!

 
// load either an ansi or unicode-type html doc into the browser component. 
// the filename has already been confirmed as an existing file 
procedure TfrmBrowser.LoadDocument(FFileName:string); 
var 
    FWideText : Widestring; 
    FAnsiText : AnsiString; 
    FRequiredLen : Integer; 
    FFileStream : TFileStream; 
    FMemStream : TMemoryStream; 
    FBuffer : Byte; 
begin 
    FFileStream := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyNone); 
    // anything less than half a dozen bytes would be pointless, but... 
    if FFileStream.Size>1 then 
    begin 
    // checking the first byte of the file to give us a clue about file-type 
    FFileStream.Read(FBuffer,1); 
    FFileStream.Position:=0; // rewind position 
    if (FBuffer=$FF) or (FBuffer=$EF) then 
    begin 
     // probably Unicode 
     FRequiredLen := FFileStream.Size div 2; // 2 bytes per char 
     SetLength(FWideText, FRequiredLen); 
     FFileStream.Read(FWideText[1], FFileStream.Size); 
     // cast it into an Ansistring 
     FAnsiText := FWideText; 
     FMemStream := TMemoryStream.Create; 
     FMemStream.Write(FAnsiText[1], FRequiredLen); 
     FMemStream.Position := 0; // rewind the position 
     // load the stream into the THtmlViewer 
     vwBrowse.LoadFromStream(FMemStream); 
     FMemStream.Free; 
    end 
    else 
    begin 
     // probably Ansi, just load original filestream in 
     vwBrowse.LoadFromStream(FFileStream); 
    end; 
    FFileStream.Free; 
    end; 

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

1

あなたはDelphi 2007を使用しています。これは、DelphiプログラミングのUnicode時代の始まりです。

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

私は私のプログラムのいずれかからいくつかのコード例を投稿:

//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'プロパティにメモの 'Text'を読み込みます。

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

  1. TntWareの 'Memo1.Lines.Text;' WideString型です。
  2. 'IHTMLDocument2'はTEmbeddedWBからのものです。理由を見るwhy TEmbeddedWB is good?

これは私の初期の仕事です。私はDelphi 2009に切り替えました。物事ははるかに簡単になりました(ファイルのロード中に適切なTEncodingを設定するだけです)!

+0

おかげでオラフ、それは面白いです。私は前にTTntMemo(etc)やTEmbeddedWBを見たことがなかった。私はTHTMLViewerの下で動作するものを手に入れることができましたが、このソリューションを使用することで、印刷(PDFファイルなどのメタファイルとしてのブラウザ表示のダイアログフリー印刷)をより多くコントロールできました。私は、TWebBrowserから印刷された出力を飽きのこない方法で制御する悪夢を抱えていました。私は時間があるときに私は近くの外観の両方のコンポーネントをブックマークします - 多くのありがとう! – robsoft

+0

@robsoft:あなたは大歓迎です! – Olaf

+0

@robsoft:TWebBrowserから印刷された出力を抑制する悪夢を抱いていました。 <<カスタム作成されたメソッドか単純な古い単純な 'HtmlEdit.PrintPreView;'を使用していますか?これは、IE自体の既製の印刷プレビューの利点を提供します! – Olaf

2

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

"オリジナル"(9.45)バージョンからの修正や改善のD6-DXE2とラザロの互換性、トン。

+0

情報ありがとう - 非常に便利です! – robsoft

関連する問題