TListViewで任意の表示をする。

一応メモ。
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の高さの設定方法

スマートとはいえないが…

  1. TImageListをぽとりと置く。ダミー用なので空で良い。
  2. TImageList#Height に TListItem の希望の高さを指定。
  3. TImageList#Width は 0。あるいは左にあけたいスペース分を指定しても良い。
  4. TListView.SmallImages にこのダミーの TImageList を指定。