Обновлять заголовки столбцов TListView программно? - PullRequest
0 голосов
/ 24 июня 2018

Создайте новое приложение VCL Forms и вставьте TListview в его форму:

object ListView1: TListView
  Left = 0
  Top = 80
  Width = 514
  Height = 150
  Align = alBottom
  Columns = <
    item
      Caption = 'Caption'
      Width = 100
    end
    item
      Caption = 'AColumn'
      Width = 100
    end
    item
      Caption = 'BColumn'
      Width = 100
    end>
  Items.ItemData = {
    055A0000000100000000000000FFFFFFFFFFFFFFFF02000000FFFFFFFF000000
    00054900740065006D0031000A5300750062004900740065006D004F006E0065
    00603449440A5300750062004900740065006D00540077006F0048334944FFFF
    FFFF}
  TabOrder = 0
  ViewStyle = vsReport
  ExplicitLeft = 192
  ExplicitTop = 128
  ExplicitWidth = 250
end

Затем поместите две кнопки Button1 и Button2 в форму, чтобы элемент формы выглядел следующим образом:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
  ListView1.Column[2].AutoSize := True;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  ListView1.Width := ListView1.Width + 1;
end;

end.

Запустите приложение.Нажмите на Button1, который устанавливает свойство AutoSize третьего столбца на True: это должно увеличить ширину третьего столбца до границы ListView.Однако это изменение становится видимым только при использовании следующих обходных путей:

  1. Чтобы увеличить ширину формы, перетаскивая край формы с помощью мыши, или:

  2. Нажмите вторую кнопку, которая делает то же самое программно.

Но как я могу программно обновить заголовки столбцов, не используя эти обходные пути?

1 Ответ

0 голосов
/ 24 июня 2018

Отправьте WM_WINDOWPOSCHANGED в ListView:

var
  wpos: TWindowPos;
begin
  ListView1.Column[2].AutoSize := True;
  FillChar(wpos, Sizeof(wpos), 0);
  ListView1.Perform(WM_WINDOWPOSCHANGED, 0, @wpos);
end;
...