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ピクセルずつあって
それが表示と行の高さ取得に影響しているように思えます
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 はインストールしてないのでわからん
AAAAA さんへ
こちらで提示すべきサンプルを書かせてしまい申し訳ありません
そのサンプルでは現象は発生しないようです
サンプルに加えて変わった処理としてはOnDrawItemでテキストを自分で描画しているくらいなのですが
固定行をドラッグして表示幅を変えていくと
Delphi11以前:イメージリストで指定した画像がその表示幅で表示される(画像は隠れていく)
Delphi11.3:表示幅が画像サイズを下回った瞬間描画されなくなる 上回ると再度描画される
という感じです
11月中にわかりやすい現象を発生させるサンプルを作るよう進めてみます
すみません、ちゃんと試したところサンプルでも現象が発生し、赤い四角は表示されません
幅を広げていくと急に表示されるようになります
11.3でしか起きないのがよくわかりません
自前で描画をすれば?
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;
AAAAAさんへ
自前で描画すれば直ると思いますしそもそもDrawItemも使っているので修正出来るとは思いますが
Delphi11.3で急に挙動が変わったのが腑に落ちませんね
週末までに自分で描画してみて問題が無いか確認してその時に解決とさせていただきます
Win 11 + 11.28 + Update3 (11.3 ?) でやってみたら 普通に 描画されたけど?
こちらの環境は
Delphi 11Uupdate 3バージョン 28.0.48361.3236
Windows10 22H2 Build 19045.3693(64ビット)
Delphi 10.2でコンパイルすると正常に表示される
自分で描画するサンプルの方だと正常に表示されます
Delphi12で直るかもしれないし
そういう挙動としてあきらめます
ありがとうございました
ツイート | ![]() |