TListView: VCL теряет порядок столбцов, если вы добавляете столбец

Я пытаюсь добавить столбец между существующими столбцами в TListView. Поэтому я добавляю новый столбец в конце и перемещаю его, устанавливая его индекс в указанное значение. Это работает, пока не добавится еще один новый столбец.

Что я сделал: добавьте столбец в последней позиции (Columns.Add) и добавьте подэлемент в последней позиции (Subitems.Add). После этого я перемещаю столбец, устанавливая его индекс в правильное положение. Это прекрасно работает, если только один столбец добавляется. При добавлении второго нового столбца подпункты облажаются. Новый подпункт первого столбца перемещается в последнюю позицию, например, нравится:

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

Я был бы очень рад, если бы кто-то мог помочь!

Например, есть ли команда или сообщение, которое я могу отправить в ListView, чтобы он обновлял или сохранял свое сопоставление Столбец -> Подэлемент, которое я мог бы использовать после добавления первого нового столбца и его подэлементов, чтобы я мог обработать второй новый столбец так же, как и первый.

Или это просто ошибка столбца TListViews -> обработка подэлемента или TListColumns ...?

пример кода для приложения vcl-форм (назначьте событие 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.

Спасибо!

редактировать: Предлагаемое исправление от Sertac Akyuz работает нормально, хотя я не могу его использовать, потому что изменение исходного кода Delphi не является решением для моего проекта. Об ошибке сообщается.

редактировать: Удален второй вопрос, который был непреднамеренно включен в первый пост, и открыт новый вопрос (см. Связанный вопрос и пересмотр вопроса).

Обновить:сообщенная ошибка теперь закрыт как исправлено в Delphi XE2Обновление 4.

Ответы на вопрос(1)

Ваш ответ на вопрос