このブログはLazarus(FreePascal)アドベントカレンダー15日目の記事です。
最近はなんだかんだちょっと複雑なテキストをレンダリングするには、HTMLビューアを使う というパターンが多いのではないかと思います。
LazarusでHTMLビューアを内蔵したアプリを作るには というと、標準の場合は、IProタブのTIpHtmlPanelというものを使います。
このコンポーネントを貼り付けると赤い○に「HTML」とだけ書かれた領域が表示されますので、実行時にHTMLを書き込んで、レンダリングを行ないます。
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に対応しているか?というと、残念ながらそんなに詳細な情報が得られず…。
とりあえずフォーラムに書き込んでみたところ「そんなによくない」とは言われました。
あと、JavaScriptやアニメーションなどの比較的高度なCSS要素には対応していないようです。
このへんについてはソースコードを見てみたところ、たしかに対応してないプロパティは多いっぽい*1。
とりあえずしっかりとしたHTML対応を求めるのであれば、fpCEFなどのブラウザコンポーネントの導入を検討してみましょう。