How to make PBear's THtmlViewer load & show a unicode HTML file?

后端 未结 3 1517
猫巷女王i
猫巷女王i 2021-01-16 11:32

I have some unicode .html files that I want to display inside a THtmlViewer component, in Delphi.

I can\'t seem to persuade the code to work just doing \'.LoadFromF

3条回答
  •  余生分开走
    2021-01-16 11:57

    Okay, well here's the guts of what I came up. Constructive criticism and observations appreciated!

    // 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;
    

    Obviously missing some error-trapping, but that's the basic idea.

提交回复
热议问题