Файл: ...\Samples\Solution\Controls\Lists\Lmover.scx

Данный пример демонстрирует перемещение элементов из одного list box в другой. Пользователь может дважды щелкнуть мышкой на элементе, чтобы переместить его, выбрать один или более элементов и перетянуть их мышкой, или нажать соответствующую кнопку, чтобы перенести элементы из одного list box в другой.

Два list boxes и четыре сопутствующие кнопки сохранены как класс: MoverLists в библиотеке Samples.vcx. Базовый класс для MoverLists - Контейнер. Чтобы была возможность добавлять и удалять элементы списка, свойства RowSourceType обоих lists должны быть равны 0 – None. Если вы хотите заполнить list box значениями из массива или таблицы, вы можете использовать следующий код:

  CopyCode imageСкопировать Код
*Массив
FOR i = 1 to ALEN(myarray)
   List.AddItem(myarray[i])
ENDFOR

*Таблица
SCAN
   List.AddItem(table.field)
ENDSCAN

Чтобы Перемещать Элементы Дважды Щелкнув Мышкой

Ниже приведенный код сопутствует событию DblClick левого list box (lstSource). Аналогичный код сопутствует событию DblClick правого list box (lstSelected).

  CopyCode imageСкопировать Код
THIS.Parent.lstSelected.AddItem(THIS.List(THIS.ListIndex))
This.RemoveItem(THIS.ListIndex)
THIS.Parent.Refresh

"THIS" относится к lstSource. "THIS.Parent" относится к классу moverlists, которым является контейнер.

Чтобы Переместить Все Элементы Одного Списка в Другой

Следующий код сопутствует событию Click кнопки cmdAddAll:

  CopyCode imageСкопировать Код
  DO WHILE THIS.PARENT.lstSource.ListCount > 0
    THIS.PARENT.lstSelected.AddItem;
        (THIS.PARENT.lstSource.List(1))
   THIS.PARENT.lstSource.RemoveItem(1)
  ENDDO
  THIS.PARENT.Refresh

Чтобы Переместить Выделенные Элементы Одного Списка в Другой

Когда вы перемещаете элемент из list box, значение свойства ListCount этого list box уменьшается, а также и индекс ListIndex всех последующих элементов этого списка. Чтобы переместить несколько выделенных элементов, вам необходимо использовать цикл DO WHILE. Следующий код относится к событию Click кнопки cmdAdd:

  CopyCode imageСкопировать Код
nCnt = 1
DO WHILE nCnt <= THIS.PARENT.lstSource.ListCount
   IF THIS.PARENT.lstSource.Selected(nCnt)
      THIS.PARENT.lstSelected.AddItem;
         (THIS.PARENT.lstSource.List(nCnt))
      THIS.PARENT.lstSource.RemoveItem(nCnt)
   ELSE
      nCnt = nCnt + 1
   ENDIF
ENDDO
THIS.PARENT.Refresh

Чтобы Перетаскивать Мышкой Элементы Одного Списка в Другой

Осуществление "перетаскивания" (drag-and-drop) между двумя list boxes включает в себя код, который сопутствует событиям MouseDown, MouseMove, DragOver и DragDrop. Три дополнительных свойства (DragThreshold, MouseX и MouseY) делают использование данного класса более удобным.

Код события MouseDown записывает X и Y координаты курсора мышки в свойства класса.

  CopyCode imageСкопировать Код
*MouseDown
Parameters nButton, nShift, nXCoord, nYCoord
THIS.PARENT.MouseX = nXCoord
THIS.PARENT.MouseY = nYCoord

Код события MouseMove проверяет, была ли нажата левая клавиша мышки до начала процедуры перетаскивания. В дополнение, чтобы предотвратить случайное перетаскивание, данный код проверяет, передвинул ли пользователь мышку на растояние больше, чем установленная пороговая величина (свойство threshold) (8 пикселов по умолчанию).

  CopyCode imageСкопировать Код
*MouseMove
Parameters nButton, nShift, nXCoord, nYCoord
IF nButton = 1 && Левая клавиша мышки
   IF ABS(nXCoord - THIS.PARENT.MouseX) > ;
      THIS.Parent.DragThreshold OR ;
         ABS(nYCoord - THIS.PARENT.MouseY) > ;
         THIS.Parent.DragThreshold
      THIS.Drag
   ENDIF
ENDIF

Код события DragOver заменяет иконку DragIcon источника, когда курсор мышки входит и покидает "пространство" list box.

  CopyCode imageСкопировать Код
*DragOver
Parameters oSource, nXCoord, nYCoord, nState
DO CASE
   CASE nState = 0 && Входит
      oSource.DragIcon = THIS.Parent.CanDropIcon
   CASE nState = 1 && Покидает
      oSource.DragIcon = THIS.Parent.NoDropIcon
ENDCASE

Код события DragDrop проверяет, чтобы источник перетаскивания не являлся бы list box-ом назначения процесса пететаскивания, и вызывает метод сопутствующий событию Click кнопки cmdAdd (в случае, если текущий список - lstSelected) или кнопки cmdRemove (если - lstSource).

  CopyCode imageСкопировать Код
*DragDrop
Parameters oSource, nXCoord, nYCoord
IF oSource.Name != THIS.Name
   THIS.PARENT.cmdAdd.Click
ENDIF

Смотрите Также