Vsflexgrid: программные переходы по ячейкам.

Normann

Well-Known Member
09.08.2007
168
2
#1
Если есть люди которым не жалко своего времени спроектировать алгоритм, пожалуйста отзавитесь, люди добрые, или совет какой дайте, а то знаний маловато.
Задолбался уже, пишу программу с контролом VSFlexGrid, мне нужно при корректировке индексного поля проверить на совпадение всю колонку, если совпадение есть то значение поля должно вернуться в исходное и включиться режим редактирования поля (EditCell()). Если, вписав не правильное значение, пользователь ушел с ячейки то курсор должен вернуться обратно для ввода правильного значения. Я уже задолбался с реализацией возврата на эту ячейку - не всегда получается программно вернуть фокус на нее (в чем и собственно проблема). Метод Select, которым я устанавливаю положение курсора, не срабатывает при обнаружении повторения в событии AfterEdit, срабатывает только в событии MouseDown. Поэтому курсор вернется в том случае если пользователь ушел этого поля кликом мыши, а вот с другими вариантами(клавиатура, пореря курсора) не получается никак реализовать?

Код:
Private Sub VSFlexGrid1_AfterEdit(ByVal Row As Long, ByVal Col As Long)

If Not VSFlexGrid1.Text = strBuffer1 Then ' Если содержимое ячейки было изменено
If VSFlexGrid1.Col = 1 Then ' если это индексное поле
If IndexVerify(VSFlexGrid1.Text) Then ' Проверка нового значения на повторение
' Занесение обновления в базу
RSet1.MoveFirst
RSet1.Move VSFlexGrid1.Row - 1

RSet1.Update VSFlexGrid1.Col - 1, VSFlexGrid1.Text
Else
MsgBox "Такой номер уже существует, введите другой!", vbCritical, "Ошибка"
VSFlexGrid1.TextMatrix(nCell1(0), 1) = strBuffer1 ' Возврат предидущего значения
bool1 = True ' не обращайте внимания

VSFlexGrid1.Select nCell1(0), 1  ' возврат на эту ячейку, который почему то здесь не срабатывет
VSFlexGrid1.EditCell ' редактирование
bool2 = False ' не обращайте внимания
End If
'==============================================
Else
' Обновление если это не индесное поле
RSet1.MoveFirst
RSet1.Move VSFlexGrid1.Row - 1
Beep
RSet1.Update VSFlexGrid1.Col - 1, VSFlexGrid1.Text
End If
End If

End Sub
' В этом событии не срабатывает функция VSFlexGrid1.Select для перехода на эту же ячейку (возврат)
'Пришлось "возвращаться" при других событиях, вот наример MouseDown, для чего и нужен bool1

Private Sub VSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If bool1 = True Then VSFlexGrid1.Select nCell1(0), nCell1(1)
bool1 = False
End Sub
'Но вот проблема, Select работает только в этой функции, а при нажадии на стрелку на клавиатуре
'курсор уходит с позиции и возвращаться не хочет и в этот момент безотказно срабатывает StartEdit
'
' Функция проверки на отсутсвие индекса с тким же значением
' принимает проверяемое значение
Function IndexVerify(strSource As String) As Boolean
Set Rset2 = New ADODB.Recordset
' Выборка совпавшихся значений (повторения)
Rset2.Open "SELECT НОМЕР FROM СПР_ФАМИЛИЙ WHERE НОМЕР=" & strSource _
, MainConnection, adOpenForwardOnly, adLockPessimistic

IndexVerify = Rset2.EOF And Rset2.BOF ' true если результат выборки пуст (нет совпадений)
Rset2.Close
Set Rset2 = Nothing
End Function