TListView: o VCL perde a ordem das colunas se você adicionar uma coluna

Estou tentando adicionar uma coluna entre as colunas existentes em um TListView. Para isso, adiciono a nova coluna no final e a movo definindo seu índice para o valor designado. Isso funciona, até adicionar outra nova coluna.

O que eu fiz: adicione a coluna na última posição (Columns.Add) e adicione o subitem na última posição (Subitems.Add) também. Posteriormente, movo a coluna configurando seu índice para a posição correta. Isso funciona bem, desde que seja apenas uma coluna adicionada. Ao adicionar uma segunda nova coluna, os subitens são estragados. O novo subitem da primeira coluna é movido para a última posição, por exemplo como isso

0        |  1          |  new A       |  new B      | 3
Caption  |  old sub 1  |  old sub 3   |  new Sub B  | new sub A

Ficaria muito feliz se alguém pudesse ajudar!

Por exemplo, talvez exista um comando ou mensagem que eu possa enviar para o ListView para que ele atualize ou salve o seu Column -> Mapeamento de subitens que eu poderia usar depois de adicionar a primeira nova coluna e seus subitens para que eu pudesse lidar com a segunda nova coluna da mesma maneira que a primeir

Or isso é apenas um bug da coluna TListViews -> manipulação de subitem ou TListColumns ...?

example código para um aplicativo de formulários vcl (atribua o evento Form1.OnCreate):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    listview: TListView;
    initButton: TButton;
    addColumn: TButton;
    editColumn: TEdit;
    subItemCount: Integer;
    procedure OnInitClick(Sender: TObject);
    procedure OnAddClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  listview := TListView.Create(self);
  with listview do
  begin
    Left := 8;
    Top := 8;
    Width := self.Width - 30;
    Height := self.Height - 100;
    Anchors := [akLeft, akTop, akRight, akBottom];
    TabOrder := 0;
    ViewStyle := vsReport;
    Parent := self;
  end;

initButton := TButton.Create(self);
with initButton do
  begin
    left := 8;
    top := listview.Top + listview.Height + 20;
    Width := 75;
    Height := 25;
    TabOrder := 1;
    Caption := 'init';
    OnClick := OnInitClick;
    Parent := self;
  end;

  editColumn := TEdit.Create(self);
  with editColumn do
  begin
    left := initButton.Left + initButton.Width + 30;
    top := listview.Top + listview.Height + 20;
    Width := 120;
    Height := 25;
    TabOrder := 2;
    Parent := self;
    Caption := '';
  end;

  addColumn := TButton.Create(self);
  with addColumn do
  begin
    left := editColumn.Left + editColumn.Width + 10;
    top := listview.Top + listview.Height + 20;
    Width := 75;
    Height := 25;
    TabOrder := 1;
    Enabled := true;
    Caption := 'add';
    OnClick := OnAddClick;
    Parent := self;
  end;

end;

procedure TForm1.OnInitClick(Sender: TObject);
var col: TListColumn;
i, j: integer;
item: TListItem;
begin
  listview.Items.Clear;
  listview.Columns.Clear;

  // add items
  for I := 0 to 2 do
  begin
    col := ListView.Columns.Add;
    col.Caption := 'column ' + IntToStr(i);
    col.Width := 80;
  end;

  // add columns
  for I := 0 to 3 do
  begin
    item := ListView.Items.Add;
    item.Caption := 'ItemCaption';

    // add subitems for each column
    for j := 0 to 1 do
    begin
 ,     item.SubItems.Add('subitem ' + IntToStr(j+1));
    end;
  end;

  subItemCount := 5;
end;

procedure TForm1.OnAddClick(Sender: TObject);
var number: integer;
col: TListColumn;
i: Integer;
ascii: char;
begin
  listview.Columns.BeginUpdate;

  number := StrToInt(editColumn.Text);
  ascii :=  Chr(65 + number);

  // create the new column
  col := TListColumn(ListView.Columns.add());
  col.Width := 80;
  col.Caption := ascii;

  // add the new subitems
  for I := 0 to ListView.Items.Count-1 do
  begin
    ListView.Items[i].SubItems.Add('subitem ' + ascii);
  end;

  // move it to the designated position
  col.Index := number;

  listview.Columns.EndUpdate;

  Inc(subItemCount);
end;

end.

Obrigado

Edita: A correção sugerida de Sertac Akyuz funciona bem, embora eu não possa usá-la porque alterar o código fonte Delphi não é solução para o meu projeto. Bug reportado.

Edita: Removeu a segunda pergunta não intencional incluída na primeira postagem e abriu uma nova pergunta (consulte a pergunta vinculada e a revisão da pergunta

Atualiza: Oreported bug agora está fechado como fixo no Delphi XE2Update 4.

questionAnswers(1)

yourAnswerToTheQuestion