Перейти к содержанию
Fire Monkey от А до Я
  • 0

Поменять местами итемы в ListView


sinuke

Вопрос

Доброго дня, форумчане

Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить

У кого какие мысли? Как реализовать?

Delphi 10.2 Tokyo

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
6 минут назад, Равиль Зарипов (ZuBy) сказал:

а разве не сработает?


Item1 := Item2;

 

неа, не работает. вот код, эффекта ноль:

var
  Source: TListViewItem;
  Target: TListViewItem;
  Third: TListViewItem;
begin
  ListView1.BeginUpdate;
  Source := ListView1.Items[0];
  Target := ListView1.Items[1];
  Third := Target;
  Target := Source;
  Source := Third;

  //ListView1.Items[0] := Target;
  //ListView1.Items[1] := Source;
  ListView1.EndUpdate;
end;

а если раскомментировать строчки, то вообще ошибка, потому как итемы read-only

Ссылка на комментарий
  • 0

В общем, сделал пока вот так:

var
  Source: TListViewItem;
  Target: TListViewItem;
begin
  ListView1.BeginUpdate;

  Source := ListView1.Items[0];
  Target := ListView1.Items.Insert(1);

  Target.Text := Source.Text;
  Source.Text := ListView1.Items[2].Text;
  ListView1.Items.Delete(2);

  ListView1.EndUpdate;
end;

В этом случае придется вручную копировать содержимое каждого итема. Кому интересно, вот тестовый проектик с перетаскиванием итемов мышью

Demo.zip

Ну а если кто может предложить вариант получше, не стесняйтесь

Ссылка на комментарий
  • 0

А можно ещё так:

  ListView1.Items[0].Index := 1;
  ListView1.Items[1].Index := 0;
  ListView1.Items.Sort(TComparer<TListViewItem>.Construct(
    function(const ALeft, ARight: TListViewItem): Integer
    begin
      Result := ALeft.Index - ARight.Index;
    end));

Поменять-то поменяет, только на сколько обоснован вызов Sort в этой ситуации - решать Вам.

Изменено пользователем dnekrasov
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...