1

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

我似乎无法说服代码仅在执行 '.LoadFromFile' 时工作 - 我是否首先需要将 unicode 文件加载到流中,然后以某种方式对其进行转换?

德尔福 2007, THtmlViewer v9.45

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

4

3 回答 3

2

仅供参考,THTMLViewer 在谷歌代码上得到积极维护(几分钟前最后一次提交): 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);
变量
  FWideText:宽字符串;
  FAnsiText:AnsiString;
  FRequiredLen:整数;
  FFileStream:TFileStream;
  FMemStream:TMemoryStream;
  FBuffer:字节;
开始
  FFileStream := TFileStream.Create(FFileName, fmOpenRead 或 fmShareDenyNone);
  // 任何少于六个字节的内容都是没有意义的,但是...
  如果 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.免费;
    结尾
    别的
    开始
      // 可能是 Ansi,只需在其中加载原始文件流
      vwBrowse.LoadFromStream(FFileStream);
    结尾;
    FFileStream.Free;
  结尾;

显然缺少一些错误捕获,但这是基本思想。

于 2009-07-26T10:16:17.477 回答
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;

阅读上面的代码,您可以看到我正在使用一个TTntMemo组件,该组件首先加载了 html 文件。然后我将备忘录的“文本”加载到 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 回答