DelphiのTHtmlViewerコンポーネント内に表示したいUnicode.htmlファイルがいくつかあります。
'.LoadFromFile'を実行するだけでコードが機能するように説得できないようです-最初にUnicodeファイルをストリームにロードしてから、何らかの方法で変換する必要がありますか?
Delphi 2007、THtmlViewer v9.45
これまで、Unicodeファイル(THtmlViewer)では何もしていません。
DelphiのTHtmlViewerコンポーネント内に表示したいUnicode.htmlファイルがいくつかあります。
'.LoadFromFile'を実行するだけでコードが機能するように説得できないようです-最初にUnicodeファイルをストリームにロードしてから、何らかの方法で変換する必要がありますか?
Delphi 2007、THtmlViewer v9.45
これまで、Unicodeファイル(THtmlViewer)では何もしていません。
参考までに、THTMLViewerはGoogleコードで積極的に維持されています(数分前の最後のコミット): http ://code.google.com/p/thtmlviewer/
D6-DXE2とLazarusの互換性、「元の」(9.45)バージョンからの多数の修正と改善。
さて、これが私が思いついたものの根性です。建設的な批判と観察に感謝します!
//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; 終わり;
明らかにいくつかのエラートラップが欠落していますが、それが基本的な考え方です。
あなたは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;
注:
それが私にとって初期の頃はうまくいったことです。Delphi 2009に切り替えましたが、今でははるかに簡単になっています(ファイルのロード中に適切なTEncodingを設定するだけです)。