Вам не нужно сохранять позиции индекса, вы всегда можете задать саму панель управления списком исходную позицию столбцов:
procedure TForm1.Button1Click(Sender: TObject);
var
ColumnOrder: array of Integer;
begin
SetLength(ColumnOrder, ListView1.Columns.Count);
ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count,
PInteger(ColumnOrder));
Для примера в вопросе будет храниться массив ColumnOrder
(0, 1, 3, 2).Если мы хотим обновить подпункт вновь вставленного столбца (3-й столбец слева), то его исходная позиция - «3».Пример кода:
var
ColumnOrder: array of Integer;
SubIndex: Integer;
begin
SetLength(ColumnOrder, ListView1.Columns.Count);
ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count,
PInteger(ColumnOrder));
SubIndex := ColumnOrder[2]; // We want to update 3rd column from left
// (visually -> SubItems[1])
// Test if the index is not 0, otherwise it holds an *item*,
// not a subitem (the first column can change position too).
if SubIndex > 0 then begin
Dec(SubIndex); // VCL subitems are 0 based
ListView1.Items[1].SubItems[SubIndex] := 'updated!';
end;
Обратите внимание, что если вы добавляете столбцы, а не просто изменяете порядок существующих, это будет работать только в том случае, если у вас есть исправление для ошибки в другом вопросе (опять же, если вы этого не сделаете, предоставляяИзменение порядка столбцов и добавление столбцов в любом случае невозможно вообще).
Относительно того, является ли поведение по умолчанию таким, каким оно должно быть, предположим, что у вас есть представление списка, в котором отображается информация о файле, имеющая столбцы «имя», «размер», «дата».Как разработчик, вы не должны беспокоиться о том, куда пользователь мог поместить столбец «size», просто поместите информацию в «SubItems [0]».Более того, что если пользователь перетаскивает столбец «имя», он будет превращаться из элемента в подэлемент.
Я думаю, что было бы логично ожидать, что элементы / подэлементы будут следовать за своими соответствующими столбцами..