unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, WinSkinData, ExtCtrls, Menus;type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    pm1: TPopupMenu;
    MenuItem10: TMenuItem;
    MenuItem9: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure MenuItem9Click(Sender: TObject);
  private
{ Private declarations }
    FHeaderHandle: THandle;
    FHeaderInstance: Pointer;
    FDefHeaderProc: Pointer;
    FMouseDowned: Boolean;
    FWidths: array of Integer;
    procedure HeaderWndProc(var Message: TMessage);
  public
{ Public declarations }
    procedure Loaded; override;
    destructor Destroy; override;
  end;var
  Form1: TForm1;implementation{$R *.dfm}uses CommCtrl;destructor TForm1.Destroy;
begin
  if FHeaderHandle <> 0 then
    SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FDefHeaderProc));
  FreeObjectInstance(FHeaderInstance);
  inherited;
end;procedure TForm1.HeaderWndProc(var Message: TMessage);  procedure RecordCurWidths;
  var
    I: Integer;
  begin
    SetLength(FWidths, ListView1.Columns.Count);
    for I := 0 to High(FWidths) do
      FWidths[I] := ListView1.Columns[I].Width;
  end;  procedure CompareWidths;
  var
    I: Integer;
    j: Integer;
    ProBar: TProgressBar;
  begin
    for I := 0 to High(FWidths) do
      if FWidths[I] <> ListView1.Columns[I].Width then
      begin
    //Memo1.Lines.Add(Format('Column %d: %d --> %d', [I, FWidths[I],ListView1.Columns[I].Width]));
        if I <> 3 then
        begin
          for j := 0 to ListView1.Items.Count - 1 do
          begin
            ProBar := ListView1.Items[j].Data;
            ProBar.Left := ProBar.Left + ListView1.Columns[I].Width - FWidths[I];
          end;
        end
        else
        begin
          for j := 0 to ListView1.Items.Count - 1 do
          begin
            ProBar := ListView1.Items[j].Data;
            ProBar.Width := ListView1.Columns[3].Width;
          end;
        end;
      end;
  end;
begin
  with Message do
  begin
    Result := CallWindowProc(FDefHeaderProc, FHeaderHandle, Msg, WPARAM, LPARAM);
    if Msg = WM_LBUTTONDOWN then
    begin
      FMouseDowned := True;
      RecordCurWidths;
    end
    else if Msg = WM_LBUTTONUP then
    begin
      if FMouseDowned then
      begin
        CompareWidths;
        FMouseDowned := False;
      end;
    end
    else if Msg = WM_LBUTTONDBLCLK then
      CompareWidths;
  end;
end;procedure TForm1.Loaded;
begin
  inherited;
  FHeaderHandle := ListView_GetHeader(ListView1.Handle);
  FHeaderInstance := MakeObjectInstance(HeaderWndProc);
  FDefHeaderProc := Pointer(GetWindowLong(FHeaderHandle, GWL_WNDPROC));
  SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FHeaderInstance));
end;procedure TForm1.Button1Click(Sender: TObject);
var
  Item: TListItem;
  ProBar: TProgressBar;
  I: Integer;
begin
  Item := ListView1.Items.Add;
  Item.SubItems.Add(IntToStr(222));
  Item.SubItems.Add('->');  ProBar := TProgressBar.Create(Self);
  ProBar.Parent := ListView1;
  Item.Data := ProBar;
  ProBar.Left := Item.DisplayRect(drBounds).Left + ListView1.Columns[0].Width;
  for I := 1 to 2 do
  begin
    ProBar.Left := ProBar.Left + ListView1.Columns[I].Width;
  end;
  ProBar.Top := Item.DisplayRect(drBounds).Top;
  ProBar.Width := ListView1.Columns[3].Width;
  ProBar.Max := 10;
  ProBar.Position := 0;
end;procedure TForm1.MenuItem9Click(Sender: TObject);
var
  I: Integer;
begin
  for I := ListView1.Items.Count - 1 downto 0 do
  begin
    if ListView1.Items.Item[I].Checked then
    begin
      ListView1.Items.Item[I].Delete;
    end;
  end;
end;end.