Изменение положения элементов поля

  • Автор темы Hravn
  • Дата начала
H

Hravn

#1
Здравствуйте.

Возникла следующая задача.
Есть computed поле на форме (имена сотрудников, которые должны согласовать документ). Пользователь заполняет его, выбирая в диалоге несколько документов (PickListCollection).
Для согласования важен порядок, в котором эти имена храняться в поле (сначала один согласует, потом другой итд.)
Меняться этот порядок, соответственно тоже может.

вопрос: можно ли как-нибудь сделать, чтобы пользователь мог нажимая, например, кнопки "вверх", "вниз" менять порядок в котором расположены значения в поле?

пока единственное, что пришло в голову - это без всяких кнопок, просто сделать dialogbox, и пусть пользователь выбирает в нужном порядке, по-одному, и жмет ОК. Выбранные значения (имена) из списка в dialogbox убираются..

p.s. про первоначальное заполнение пока можно не думать, будем говорить только для случая, когда значения в поле уже есть и надо изменить их порядок.
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Допустим, у нас есть уже аррай (возьми из айтема, работать с item.values - себя не любить)
Вот тебе процедурина для сортиовки.

Можешь чё-то менять, если хочешь, но, в целом, она работает как надо.
Про параметры, если надо спрашивай.

На каждый вызов возвращает аррай со свапнутыми элементами.

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='ls'>Const MOVE_UP = 1
Const MOVE_DOWN= 2

Function ToArray(Value As Variant) As Variant
On Error Goto Errh

If Isempty(Value) Then Exit Function

Dim rv As Variant

If Isarray(Value) Then
rv = Value
Else
Redim TmpArray(0)
TmpArray(0) = Value
rv = TmpArray
End If

ToArray = rv

Exit Function
Errh:
'Call ErrHandler
Exit Function
End Function

Function ArrayMoveElement(Array As Variant, Element As Variant, Direction As Integer, Cycle As Boolean, Swap As Boolean) As Variant
'in not swap - deplace
On Error Goto Errh

ArrayMoveElement = Array

Const CompareOption = 5

If Isempty(Array) Then Exit Function
If Isempty(Element) Then Exit Function
If Isarray(Element) Then Exit Function
If Isnull(Arraygetindex(Array, Element, CompareOption)) Then Exit Function

Dim Arr As Variant
Arr = ToArray(Array)

Dim Lbnd As Long
Dim Ubnd As Long
Lbnd = Lbound(Arr)
Ubnd = Ubound(Arr)

Dim Pos As Long
Pos = Clng(Arraygetindex(Array, Element, CompareOption))

Dim NewPos As Long

Dim ForStart As Integer
Dim ForEnd As Integer
Dim ForStep As Integer

Select Case Direction
Case MOVE_UP:
If Pos = Lbnd Then
If Cycle Then NewPos = Ubnd Else NewPos = Pos
Else
NewPos = Pos - 1
End If
ForStart = Lbnd
ForEnd = Ubnd
ForStep = 1
Case MOVE_DOWN:
If Pos = Ubnd Then
If Cycle Then NewPos = Lbnd Else NewPos = Pos
Else
NewPos = Pos + 1
End If
ForStart = Ubnd
ForEnd = Lbnd
ForStep = -1
End Select

Dim Buffer As Variant
Dim i As Integer

If Swap Then
Buffer = Arr(NewPos)
Arr(NewPos) = Arr(Pos)
Arr(Pos) = Buffer
Else
Buffer = Arr(ForStart) 'only for deplace
For i = ForStart To ForEnd Step ForStep
If i <> ForEnd Then Arr(i) = Arr(i + ForStep) Else Arr(i) = Buffer
Next
End If

ArrayMoveElement = Arr

Exit Function
Errh:
'Call ErrHandler
Exit Function
End Function[/CODE]
 

nvyush

Lotus team
22.04.2009
2 317
0
#3
Можно использовать ListBox. Список людей — это его список выбора. Выбранный человек — значение ListBox'a. Рядом кнопки Вверх/Вниз, код тривиальный: найти в массиве индекс элемента, поменять местами два элемента массива, обновить, указан выше.