Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2011, 23:03   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию TListView перемещиение(вверх-вниз) элементов списка

Всем привет!
Сабж: как реализовать перемещение элементов по списку вниз и вверх в ListView в режиме vsReport?
Человек_Борща вне форума Ответить с цитированием
Старый 10.01.2011, 11:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
ListView.Selected:=ListView.Items.Item[i];
где i от 0 до ListView.Items.Count-1
Для случая с множественным выделением не подойдет

Вроде не на то ответил. Следующую процедуру использую для перемещения строки:
Код:
procedure TFBookEdit.MoveListViewSerialBook(Up: Boolean);
var xItem1,xItem2: TListItem;
begin
  xItem1:=ListViewSerialBook.Selected;
  if Up then xItem2:=ListViewSerialBook.Items.Insert(xItem1.Index-1)
        else xItem2:=ListViewSerialBook.Items.Insert(xItem1.Index+1);
  xItem2.Caption:=xItem1.Caption;
  xItem2.Data:=xItem1.Data;
  xItem2.SubItems.Add(xItem1.SubItems.Strings[0]);
  xItem2.ImageIndex:=xItem1.ImageIndex;
  xItem1.Delete;
  ListViewSerialBook.Selected:=xItem2;
  ListViewSerialBook.Selected.MakeVisible(False);
end;
Понятно перед обращением убедиться, что:
1. ListViewSerialBook.Selected<>nil
2. ListViewSerialBook.Selected.Index > 0 для Up=True
3. ListViewSerialBook.Selected.Index < ListViewSerialBook.Items.Count-1 для Up=False
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.01.2011 в 16:31.
Аватар вне форума Ответить с цитированием
Старый 10.01.2011, 16:51   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

не получилось.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.01.2011 в 16:57.
evg_m вне форума Ответить с цитированием
Старый 10.01.2011, 20:58   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

У меня прекрасно работает в D7, правда из процедуры я выбросил не относящееся к теме. Следующие строки тоже можно выбросить (это для моей конкретной ситуации):
Код:
xItem2.Data:=xItem1.Data;
  xItem2.SubItems.Add(xItem1.SubItems.Strings[0]);
  xItem2.ImageIndex:=xItem1.ImageIndex;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.01.2011, 23:27   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А вот если у меня в selected.data храниться что-то своё?
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2011, 14:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну и перетяни ее как у меня: xItem2.Data:=xItem1.Data;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.01.2011, 18:54   #7
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Сделал, вот таким вот образом:
Код:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  TargetItem :TListItem; // строка, куда поместят новые строки
  TargetItemIndex :Integer; // индекс строки куда перемещаем
  TempItem :TListItem; // временная строка
  SelItem :TListItem; // выделенная строка
  I, II, J :Integer;
begin
 with TListView(Sender) Do
 begin
  TargetItemIndex := -1;
   // определяем новую позицию
  TargetItem := GetItemAt(X, Y);
  if Assigned(TargetItem) then
   TargetItemIndex := Items.IndexOf(TargetItem);
   //
  Items.BeginUpdate;
   try
  if TargetItemIndex >= -1 then
  begin
    II := SelCount; // выделенно
      //
    J := 0; // [J] смещение от выбранной строки назначения
    if II > 0 then
    begin
     I := 0; // сверху вниз
     while I <= Items.Count - 1 do // сверху вниз
     Begin
      if Items[I].Selected then
      begin
        // запомним строку на будущие нужды
       SelItem := Items[I];
       Inc(J);
        // можно ли поместить в конец
       if Items.Count > 0 then
       if TargetItemIndex = -1  then
       begin
        TempItem := Items.Add; // в конец списка
       end
       else
        TempItem := Items.AddItem(nil, TargetItemIndex + J); // вставим новую строку
        //
       if Assigned(TempItem) then
       begin
         // копируем исходную строку
        TempItem.Assign(SelItem);
         // удалим старую строку
        SelItem.Delete;
//         // после перемещения, шаг вверх, т.к. длина >
        Dec(I); // сверху вниз
       end;
      end;
       Inc(I); // сверху вниз
     End;
    end;
  end;
   finally
  Items.EndUpdate;
  Refresh;
   end;
 end;
end;

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
 Accept := (Source is TListView) and (Source = Sender);
end;
Вложения
Тип файла: rar ListView перетаскивание строк + multiselect.rar (311.2 Кб, 63 просмотров)
Alter вне форума Ответить с цитированием
Старый 15.01.2011, 02:24   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Примного благодарен! За пример отдельное спасибо! +
Человек_Борща вне форума Ответить с цитированием
Старый 18.01.2011, 17:55   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А допустим если items хранить в items.data какие-то данные, то автоматически и эти данные перемещаться будут?
Человек_Борща вне форума Ответить с цитированием
Старый 22.01.2011, 15:29   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Да, всё копируется
Код:
procedure TListItem.Assign(Source: TPersistent);
begin
  if Source is TListItem then
    with Source as TListItem do
    begin
      Self.Caption := Caption;
      Self.Data := Data;
      Self.ImageIndex := ImageIndex;
      Self.Indent := Indent;
      Self.OverlayIndex := OverlayIndex;
      Self.StateIndex := StateIndex;
      Self.SubItems := SubItems;
      Self.Checked := Checked;
    end
  else inherited Assign(Source);
end;
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элементов из списка. grave123 Общие вопросы C/C++ 0 10.03.2010 15:33
Заполнение матрицы по спирали (от центра влево-вниз-вправо-вверх) Баур Помощь студентам 4 03.12.2009 17:39
Нажатие клавиш на клавиатуре вверх, вниз Droid Общие вопросы Delphi 16 12.07.2009 18:13
Перемещать строки вверх-вниз, с помощью стрелок. Rio309 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 27.10.2008 21:47
как с помощью TScrollBar перемещать содержимое TMemo вверх или вниз Sanprof Общие вопросы Delphi 3 04.03.2008 00:39