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

解決


vram  2024-10-15 09:34:37  No: 151633

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

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

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


vram  2024-10-16 08:46:54  No: 151636

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

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

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


igy  2024-10-16 08:52:17  No: 151637

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

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


vram  2024-10-16 10:21:39  No: 151638

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

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


vram  2024-10-17 09:05:05  No: 151639

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


vram  2024-10-19 15:36:42  No: 151641

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加