Delphi12でTListView.Columns[n].Width の値が合わない

解決


vram  2024-10-15 09:34:37  No: 151633  IP: [192.*.*.*]

TListViewの vsReportで 2つある列の右側を最大まで広げるという処理を作っているのですが
DelphiXE5とDelphi12でコンパイルしているのですが結果が変わります

ListViewとButtonをフォームに置いて

procedure TForm1.Button1Click(Sender: TObject);
var
  d : TListColumn;
  dl : TListItem;
begin
  ListView1.ViewStyle := vsReport;
  d := ListView1.Columns.Add();
  d.Caption := 'A';
  d.Width := 100;
  d := ListView1.Columns.Add();
  d.Caption := 'B';
  d.Width := ListView1.ClientWidth - 100; // 問題の所
  dl := ListView1.Items.Add();
  dl.Caption := '1';
  dl := ListView1.Items.Add();
  dl.Caption := '2';
end;

環境A
Windows10 テキストサイズ 125%
DelphiXE5、Delphi10
結果:問題なし

環境B
Windows11 テキストサイズ 200%
Delphi12.1、Delphi12.2
結果:Width の値が想定の2倍になる

解決方法として 環境Bの場合のみ
d.Width := (ListView1.ClientWidth - 100) div 2 -2; // これで直る
としているのですが横幅の設定で何か別の方法を使わないといけないのでしょうか?

※別件になりますが縦幅も同じような現象が発生します

編集    削除
igy  2024-10-16 00:31:35  No: 151635  IP: [192.*.*.*]

試してないので、外しているかもしれませんが、

> d.Width := ListView1.ClientWidth - 100; // 問題の所
の代わりに、
ListView_SetColumnWidth(ListView1.Handle, 1, LVSCW_AUTOSIZE_USEHEADER);
を使った場合、結果は同じになりますか?

編集    削除
vram  2024-10-16 08:46:54  No: 151636  IP: [192.*.*.*]

サンプルありがとうございます

環境Aの方でためしたところ
「ListView_SetColumnWidthが定義されていません」と出ます

環境Bの方は場所が違うので後日試します

編集    削除
igy  2024-10-16 08:52:17  No: 151637  IP: [192.*.*.*]

>「ListView_SetColumnWidthが定義されていません」と出ます

uses に、CommCtrl を追加した場合は、どうなりますか?

編集    削除
vram  2024-10-16 10:21:39  No: 151638  IP: [192.*.*.*]

ComCtrlsと間違えてました
CommCtrlを追加して実行したところ環境Aの方で正常に動作しました

環境Bの方は場所が違うので後日結果を報告します

編集    削除
vram  2024-10-17 09:05:05  No: 151639  IP: [192.*.*.*]

環境Bで試したところ正常に動作したのですが
こちらが提示したサンプルの方も必要最小限のソースにしたせいか正常に動作するので
週末に改めて現象が発生しているソースに組み込んで試したいと思います

編集    削除
vram  2024-10-19 15:36:42  No: 151641  IP: [192.*.*.*]

現象が発生していた環境で試してみたところ正常に最大の幅の設定にすることができました
ありがとうございます

編集    削除