Сегодня я хочу рассказать, как можно заменить некоторые элементы в стандартный TListView.
Например, у вас есть 5 пунктов и хотите поменять местами первый и третий элементы
Проблема, что стандартный компонент TListView не такой способ и вы должны понимать это сами.
Мы помним, что стандартный путь от старого Паскаля раза (для чисел):
Code: |
procedure Swap(X, Y: Integer); var s: Integer; begin s := X; X := Y; Y := X end; |
Something similar we can do with TListItem too.
But just to save all strings (caption+sub items) somewhere is not enough because TListItem class have a lot of other information (image indexes, pointer as Data, etc)
So correct way is to use Assign method:
Code: |
procedure ExchangeItems(lv: TListView; const i, j: Integer); var tempLI: TListItem; begin lv.Items.BeginUpdate; try tempLI := TListItem.Create(lv.Items); tempLI.Assign(lv.Items.Item[i]); lv.Items.Item[i].Assign(lv.Items.Item[j]); lv.Items.Item[j].Assign(tempLI); tempLI.Free; finally lv.Items.EndUpdate end; end; |
Поэтому структура такая же, как в нашем примере для целых. Все, что мы добавили несколько BeginUpdate и EndUpdate (просто позволяют уменьшить мерцание)
Так что если вы хотите обменять элементов в listview, и просто вызвать эту процедуру...
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!