高見知英の技術ログ

技術関係のログをQiitaから移行してきました。プログラミングのほか、使っているアプリの細かい仕様についてなど書いていきます。

LazarusでHTMLをレンダリングする

このブログはLazarus(FreePascal)アドベントカレンダー15日目の記事です。

qiita.com

最近はなんだかんだちょっと複雑なテキストをレンダリングするには、HTMLビューアを使う というパターンが多いのではないかと思います。

LazarusでHTMLビューアを内蔵したアプリを作るには というと、標準の場合は、IProタブのTIpHtmlPanelというものを使います。

f:id:TakamiChie:20211210160515p:plain
TIpHtmlPanel

このコンポーネントを貼り付けると赤い○に「HTML」とだけ書かれた領域が表示されますので、実行時にHTMLを書き込んで、レンダリングを行ないます。

f:id:TakamiChie:20211210160900p:plain
TIpHtmlPanel(デザイン時)

f:id:TakamiChie:20211210161009p:plain
TIpHtmlPanel(実行時)

HTMLの書き込みには、TIpHtmlPanel#SetHtmlFromStr()というメソッドを使います。簡易的なCSSも解釈してくれるようなので、リソースにあらかじめCSSファイルを読み込ませておき、それをまぜてHTMLとして出力 みたいなコードを書くと楽です。

procedure TMainForm.UpdateStatus(HTML: String);
var
  r: TResourceStream;
  s: TStringStream;
begin
  try
    r := TResourceStream.Create(HINSTANCE, 'STYLE', RT_RCDATA);
    try
      s := TStringStream.Create();
      try
        s.LoadFromStream(r);
        FStatus.SetHtmlFromStr('<html>' +
          '<head>' +
          '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'+
          '<style type="text/css">' +
          s.DataString +
          '</style>' +
          '</head>'+
          '<body>' +
          HTML +
          '</body>' +
          '</html>'
          );
      finally
        s.Free;
      end;
    finally
      r.Free;
    end;
  except
    on E: Exception do MessageDlg('Error:'+ E.Message, mtError, [mbCancel], 0);
  end;
end;

TIpHtmlPanelの対応環境

では、このクラス、どの程度のHTMLに対応しているか?というと、残念ながらそんなに詳細な情報が得られず…。

とりあえずフォーラムに書き込んでみたところ「そんなによくない」とは言われました。

forum.lazarus.freepascal.org

あと、JavaScriptやアニメーションなどの比較的高度なCSS要素には対応していないようです。

このへんについてはソースコードを見てみたところ、たしかに対応してないプロパティは多いっぽい*1

とりあえずしっかりとしたHTML対応を求めるのであれば、fpCEFなどのブラウザコンポーネントの導入を検討してみましょう。

wiki.freepascal.org

wiki.freepascal.org