一応メモ。
TListViewで複数行の表示などをしたい場合のやり方。
表示のプロシジャを書く
TListView#OwnerDraw を True にして置く。
OnDrawItem に描画コードを書く。
このコードは TListView のアイテム一個分についてのもので、表示されるアイテムの分だけ呼び出される。
procedure TMainForm.ResultListViewDrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var B: TBookmark; procedure DrawText(X, Y: Integer; S: String); begin Sender.Canvas.TextOut( Rect.Left + RLVI_LEFT + X, RLVI_MARGIN + Rect.Top + RLVI_HEIGHT * Y + RLVI_TEXT_MARGIN * Y, S); end; begin B := TBookmark(Item.Data); with Sender.Canvas do begin Brush.Color := IfThen(Item.Selected, clAqua, clWhite); FillRect(Rect); Font.Height := -12; Font.Style := [fsBold]; DrawText(0, 0, B.Title); Font.Style := []; DrawText(10, 1, B.Tags.Text); DrawText(20, 2, B.OneLineNote); end; end;
選択状態は Item.Selected でわかる。
と、思っていたけれど State で見た方がよさそうだ。
チェックボックスなんかにも対応できそうな予感。
Brush.Color := IfThen(odSelected in State, clAqua, clWhite);
TListItemの高さの設定方法
スマートとはいえないが…
- TImageListをぽとりと置く。ダミー用なので空で良い。
- TImageList#Height に TListItem の希望の高さを指定。
- TImageList#Width は 0。あるいは左にあけたいスペース分を指定しても良い。
- TListView.SmallImages にこのダミーの TImageList を指定。