我想在Delphi中的THtmlViewer组件中显示一些unicode .html文件。
我似乎无法说服代码只是做'.LoadFromFile' - 我首先需要将unicode文件加载到流中然后以某种方式转换它吗?
Delphi 2007,THtmlViewer v9.45
之前我没有对unicode文件或THtmlViewer做过任何事情。
答案 0 :(得分:2)
仅供参考,THTMLViewer主动维护谷歌代码(几分钟前的最后一次提交): http://code.google.com/p/thtmlviewer/
D6-DXE2和Lazarus兼容性,大量修复和“原始”(9.45)版本的改进。
答案 1 :(得分: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;
显然缺少一些错误捕获,但这是基本的想法。
答案 2 :(得分:1)
您正在使用Delphi 2007.那是在Delphi Programming的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'属性。
htmEd.body.innerHTML := Memo1.Lines.Text;
注意:
这在早期对我有用。我已经切换到Delphi 2009了,现在事情要容易得多(只需在加载文件时设置合适的TEncoding)!