TListViewのカスタム描画で文字が大きくなるバグへの対処

TListViewでカスタム描画イベントを使用するとコードの書き方によっては項目の文字が妙にでかくなるバグがあります。フォームにリストビューを貼りつけて下記の二つのイベントをそれぞれセットしてプログラムを実行してみてください。文字がでかくなると思います。

procedure TForm1.FormCreate(Sender: TObject);
//FormのOnCreateイベント
var
  I: Integer;
begin
  //項目を作成する
  with ListView1.Items do
    for I := 1 to 100 do
      Add.Caption := FormatFloat('"項目"000', I);
end;


procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
//ListViewののOnCustomDrawItemイベント
var
  RC: TRect;
begin
  RC := Item.DisplayRect(drIcon);
  Frame3D(Sender.Canvas, RC, clBlue, clNavy, 2);
end;

この現象にはしばらく悩まされたのですが、以下のようにフォントの変更イベントを生成することで解決できました。

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
//ListViewののOnCustomDrawItemイベント
var
  RC: TRect;
begin
  RC := Item.DisplayRect(drIcon);
  Frame3D(Sender.Canvas, RC, clBlue, clNavy, 2);

  { フォントの変更イベントを作ってやれば文字が大きくならない }
  with Sender.Canvas do
    if Assigned(Font.OnChange) then
      Font.OnChange(Canvas.Font);
end;

Copyright 2001 Rinka Kouzuki All Rights Reserved.