Delphi 11.3でのTListViewのImageList使用時の挙動について

解決


vram  2023-11-19 23:58:15  No: 151281  IP: 192.*.*.*

Delphi 11.3から TListViewの挙動が変わり
かなり長いその原因に悩んだのですが原因らしきものがわかりました
VCL側で修正されるのを待つか
もしかしたら過去と互換性を持たせる設定があるのかもしれません

現在はコンパイラ別での暫定対応をしているのですが
良い方法があればお願いします

Delphi12では試していません

環境 Windows10 Delphi XE5~11.3 VCL 32bitコンパイル
異常な現象が発生するのはDelphi11.3のみ 
同じ環境で過去のDelphi10.2に戻すと正常動作

【現象1】
TlistViewにTImageListを持たせ vsReportで表示
TImageListのWidthとHeightを 128
TListViewのColums.Add で生成した 先頭列の WidthとHeightを 128

これで縦横 128ピクセルの画像と画像に対するテキストを表示していましたが
Delphi11.3からは画像が表示されず
ColumsのWidthを 130ぐらいに増やすと正常表示

【現象2】
上と同じくTlistViewにTImageListを持たせ ImageListのHeightにて行の高さを設定
しかし実際にはその高さでは描画されておらず
TlistView上にTEditを配置する計算をするとズレる

以前教えていただいた方法で強制的に行の高さを設定しても
高さを指定したピクセル数とズレる

TListViewで行の高さを低く設定したときの実際の高さを取得するには
https://www.petitmonte.com/bbs/answers?question_id=29997

【推測】
TListViewの各行にBevelInnerのようなものが1ピクセルずつあって
それが表示と行の高さ取得に影響しているように思えます

編集 削除
AAAAA  2023-11-21 13:46:54  No: 151282  IP: 192.*.*.*

11.28  / 12 で

var
    BMP: TBitmap;
    ListItem: TListItem;
    ListColumn: TListColumn;
begin
    ListView1.Columns.Clear;

    ImageList1.Width  := 128;
    ImageList1.Height := 128;

    ListColumn := ListView1.Columns.Add;
    ListColumn.Width := 128;

    ListColumn := ListView1.Columns.Add;
    ListColumn.Width := 64;


    ListView1.ViewStyle   := vsReport;
    ListView1.SmallImages := ImageList1;
    BMP := TBitmap.Create;
    BMP.PixelFormat := pf32bit;
    BMP.Canvas.Brush.Color := clRed;
    BMP.SetSize(128,128);

    ImageList1.Add(BMP,nil);

    BMP.Free;

    ListItem := ListView1.Items.Add;

    ListItem.Caption := '';
    ListItem.ImageIndex := 0;
    ListItem.SubItems.Add('AAAAA');

で Columns 1個目の幅関係なく表示領域分だけ表示される
11.3 はインストールしてないのでわからん

編集 削除
vram  2023-11-27 00:59:52  No: 151283  IP: 192.*.*.*

AAAAA さんへ

こちらで提示すべきサンプルを書かせてしまい申し訳ありません
そのサンプルでは現象は発生しないようです

サンプルに加えて変わった処理としてはOnDrawItemでテキストを自分で描画しているくらいなのですが
固定行をドラッグして表示幅を変えていくと

Delphi11以前:イメージリストで指定した画像がその表示幅で表示される(画像は隠れていく)
Delphi11.3:表示幅が画像サイズを下回った瞬間描画されなくなる 上回ると再度描画される

という感じです

11月中にわかりやすい現象を発生させるサンプルを作るよう進めてみます

編集 削除
vram  2023-11-29 11:21:12  No: 151289  IP: 192.*.*.*

すみません、ちゃんと試したところサンプルでも現象が発生し、赤い四角は表示されません
幅を広げていくと急に表示されるようになります
11.3でしか起きないのがよくわかりません

編集 削除
AAAAA  2023-11-29 20:47:36  No: 151290  IP: 192.*.*.*

自前で描画をすれば?

procedure TForm6.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
    ARECT: TRECT;
    ICON: TICON;
begin
   ARECT := Item.DisplayRect(drBounds);
   ListView1.Canvas.Brush.Color := ListView1.Color;
   ListView1.Canvas.FillRect(ARECT);

   ARECT := Item.DisplayRect(drIcon);
   ICON := TICON.Create;
   ImageList1.GetIcon(ITEM.ImageIndex,ICON);
   ListView1.Canvas.Draw(ARECT.Left,ARECT.Top,ICON);
   ICON.Free;

   ARECT.Left := ListView1.Columns[0].Width;
   ARECT.Width := 9999;
   ListView1.Canvas.FillRect(ARECT);
end;

編集 削除
vram  2023-11-30 00:35:42  No: 151293  IP: 192.*.*.*

AAAAAさんへ
自前で描画すれば直ると思いますしそもそもDrawItemも使っているので修正出来るとは思いますが
Delphi11.3で急に挙動が変わったのが腑に落ちませんね

週末までに自分で描画してみて問題が無いか確認してその時に解決とさせていただきます

編集 削除
AAAAA  2023-11-30 08:34:14  No: 151295  IP: 192.*.*.*

Win 11 + 11.28 + Update3 (11.3 ?)  でやってみたら 普通に 描画されたけど?

編集 削除
vram  2023-12-01 11:13:35  No: 151298  IP: 192.*.*.*

こちらの環境は
Delphi 11Uupdate 3バージョン 28.0.48361.3236
Windows10 22H2 Build 19045.3693(64ビット)

Delphi 10.2でコンパイルすると正常に表示される

自分で描画するサンプルの方だと正常に表示されます

Delphi12で直るかもしれないし
そういう挙動としてあきらめます

ありがとうございました

編集 削除