TListView: порядок подэлементов после добавления нового столбца между существующими во время выполнения - PullRequest
4 голосов
/ 30 ноября 2011

Если вы добавляете новый столбец между существующими столбцами во время выполнения, индексы подпунктов не будут такими, как я предполагаю.

например. после добавления нового столбца между вторым и третьим столбцами столбцы / подпункты выглядят так:

colums[0] |  colums[1]   |  (new) columns[2] |  columns[3]
caption   |  subitems[0] |  subitems[2]      |  subitems[1]

но я бы предположил:

colums[0] |  colums[1]   |  (new) columns[2] |  columns[3]
caption   |  subitems[0] |  subitems[1]      |  subitem[2]

Мне нужно иметь возможность динамически обновлять содержимое подэлемента при некоторых условиях. Вот почему я хотел бы полагаться на предположение, что подэлемент для столбца с Column.Index = X находится в Item.SubItems [X-1].

Как вы думаете, это поведение по умолчанию? Если это так, что бы вы предложили для обновления подпунктов в соответствии с колонками. Возможно, можно сохранить индекс подэлемента, который принадлежит недавно добавленным столбцам.

Примечание : свойство Columns.Tag уже используется.

Я использую Delphi XE и XE2, но мне нужно быть совместимым с Delphi 7 и выше.

1 Ответ

3 голосов
/ 30 ноября 2011

Вам не нужно сохранять позиции индекса, вы всегда можете задать саму панель управления списком исходную позицию столбцов:

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]».Более того, что если пользователь перетаскивает столбец «имя», он будет превращаться из элемента в подэлемент.

Я думаю, что было бы логично ожидать, что элементы / подэлементы будут следовать за своими соответствующими столбцами..

...