オーナー描画項目のサイズ変更
コントロールの利用:インデックス への移動
アプリケーションで可変オーナー描画コントロールに各項目を描画する前に,コントロールはの項目のサイズを取得するイベント(TMeasureItemEvent)を受け取ります。TMeasureItemEvent は,アプリケーションに対してコントロール上のどこに項目を表示するかを伝える働きをします。
Delphi は,項目のテキストを現在のフォントで表示できるサイズに決定します。アプリケーションはイベントを処理して,選択された長方形のサイズを変更できます。たとえば,テキストのかわりにビットマップを項目に表示する場合,ビットマップのサイズに合わせてサイズを変更します。ビットマップとテキストの両方を表示する場合は,両方を合わせた長方形のサイズにします。
オーナー描画項目のサイズを変更するには,オーナー描画コントロールの項目のサイズを取得するイベントに対して,イベントハンドラを定義します。イベントの名前はオーナー描画コントロールによって異なります。リストボックスとコンボボックスには,OnMeasureItem を使用します。グリッドにはサイズ取得イベントはありません。
サイズ取得イベントには,2 つの重要なパラメータがあります。項目のインデックス番号と項目の高さです。高さは可変です。アプリケーションで小さくすることも,大きくすることもできます。先行する項目のサイズによって,後続の項目の位置が決まります。
たとえば,可変オーナー描画リストボックスで最初の項目の高さを 5 ピクセルに設定すると,2 番めの項目は上端から 6 ピクセル目に配置されます。以下同様に続いていきます。リストボックスとコンボボックスの場合,アプリケーションで変更できるのは項目の高さだけです。項目の幅は常にコントロールの幅になります。
オーナー描画グリッドでは,描画時にセルのサイズを変更することはできません。各行と各列のサイズは,ColWidths と RowHeights の両プロパティで描画前に設定します。
次の例では,オーナー描画タブの OnMeasureItem イベントに対してハンドラを割り当て,タブ項目に関連付けたビットマップを表示するための必要な幅を設定しています。
procedure TFMForm.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer); { Height が var パラメータであることに注意}
var
BitmapHeight: Integer;
begin
BitmapHeight := TBitmap(ListBox1.Items.Objects[Index]).Height;
{ 項目の高さに十分な余裕(2 ピクセル分)があるか確認 }
Height := Max(Height, Bitmap Height +2);
end;
void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control, int Index,
int &Height) // Height が参照を使って渡されることに注意
{
int BitmapHeight = (dynamic_cast<TBitmap *>(ListBox1->Items->Objects[Index]))->Height + 2;
// リスト項目にビットマップ用の十分な余裕(2 ピクセル分)があるか確認
Height = Max(Height, Bitmap Height +2);
}
メモ: 文字列リストの Objects プロパティの項目は目的の型にキャストしなければ使用することができません。この Objects は,TObject 型のプロパティであり,このプロパティはすべての種類のオブジェクトを保持することができます。配列からオブジェクトを検索するときは,実際に使用する元の型にキャストし直す必要があります。