如何制作PBear的THtmlViewer加载&显示一个unicode HTML文件?

时间:2009-07-25 09:43:42

标签: delphi unicode delphi-2007

我想在Delphi中的THtmlViewer组件中显示一些unicode .html文件。

我似乎无法说服代码只是做'.LoadFromFile' - 我首先需要将unicode文件加载到流中然后以某种方式转换它吗?

Delphi 2007,THtmlViewer v9.45

之前我没有对unicode文件或THtmlViewer做过任何事情。

3 个答案:

答案 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;

注意

  1. TntWare的'Memo1.Lines.Text;'是WideString类型。
  2. 'IHTMLDocument2'来自TEmbeddedWB。查看why TEmbeddedWB is good?
  3. 的原因

    这在早期对我有用。我已经切换到Delphi 2009了,现在事情要容易得多(只需在加载文件时设置合适的TEncoding)!