公開日:2013年02月17日(日)03:23Excelの帳票をXtraReportに移植しようとしていろいろと実験・調査したところ、セル(XRTableCell)の文字の配置についてExcelの「縮小して全体を表示する」に相当する機能がないセルの文字の配置についてExcelと同様な均等割付けができないXRTableではセルの(縦方向の)結合ができないといったことがわかりました。凝ったデザインのExcelレポートをXRTableで再現するのは難しそうなので、ラベル(XRLabel)を"セル"に見立てて、これを敷き詰めてExcelの帳票を再現することにしたのですが、このとき特に困ったのがXRLabelにも上記最初の「縮小して全体を表示する」機能がないということです。Scaling」http://www.switchonthecode.com/tutorials/csharp-tutorial-font-scalingを読んで自分で実装してちょうだい!ということらしいので、これを参考にして実装しました。//GetAutoFontSizeの引数base_fontにlabel.Fontを渡すとだめ。//base_fontとなってしまい、以降フォントサイズが小さいままになってしまう。}}上記のコードはXRLabelのBeforePrintイベントハンドラです。Scaling」を参考に作成した、ちょうどよい大きさのフォントサイズを返すメソッドです(後述)。XRLabelに表示する内容が集計の場合、集計結果でサイズを決めなくてはいけないので、6行目で分岐させています。XRLabelにスタイルが適用されていて、スタイルでフォントが指定されているような場合にはスタイルのフォントサイズも変更する必要があります。(21行目~26行目)GetAutoFontSizeメソッドの第三引数に「default_font」を引き渡していますが、これをうっかり「label.Font」を渡してしまうとサイズの自動調節がきちんと働かなくなるので注意が必要です。ReportHeaderやReportFooter「以外」のBandにこのラベルが配置されている場合には、このラベルのBeforePrintイベントは繰り返し呼び出される可能性があります。うっかり「label.Font」を渡してしまうと2回目に呼びだされた時、1回目の呼び出しで変更したフォントサイズが2回目のフォント調整の基準のサイズになってしまうので、複数回の呼び出しの後にはフォントがとても小さくなってしまうことがあります。Scaling」と同じです。hRatio、wRatioを求めるところでテキストのサイズを10倍してから割っていますが、これはレポートのReportUnit(TenthsOfAMillimeterにセットしています)をMillimeterに合わせるための措置です。以上で「縮小して全体を表示する」と同様なふるまいをするようになります。使うならいっそのことXRLabelを継承したクラスを作ってしまうといいかもしれません。