Очередность перебора в цикле

Wallaby
Дата: 05.03.2008 14:25:36
Добрый день!

Вопрос: по какому принципу формируется очередность перебора контролов в цикле
for each ctl in frm.Controls
   .....
next ctl
- по очередности создания контролов или как-то иначе?

И можно ли как-то в эту очередность вмешаться (изменить)? И если да, то как?
vorser
Дата: 05.03.2008 14:44:02
1. Последовательно вносятся в коллекцию по мере их размещения на форме
2. Controls(i)
Wallaby
Дата: 05.03.2008 15:20:00
vorser
1. Последовательно вносятся в коллекцию по мере их размещения на форме
2. Controls(i)


А самоуправно (хотя бы разово, не систематически!) поменять индексы контролов в коллекции как-то можно? Страсть как не хочется всё убивать и заново пересоздавать в нужном порядке...
Анатолий ( Киев )
Дата: 05.03.2008 15:23:23
Можно создать свою коллекцию с сортировкой по именам или другим свойствам.
Ниже пример получения коллекции элементов в области данных формы, способных получить фокус, отсортированных в последовательности перехода по TAB.
Dim ctl As Control, col As New Collection, i As Integer, j As Integer, l As Integer
On Error Resume Next
 For Each ctl In Forms("FormName").Section(acDetail).Controls
  If ctl.Enabled Then i = ctl.TabIndex
  If Err.Number <> 0 Then Err.Clear: GoTo NextControl
  If col.Count = 0 Or i > l Then col.Add ctl: GoTo NextControl
  For j = 1 To col.Count
   If i < col(j).TabIndex Then col.Add ctl, , j: Exit For
  Next j
NextControl:
  If i > l Then l = i
 Next ctl
 
 For i = 1 To col.Count
Debug.Print col(i).Name; Tab; col(i).TabIndex
 Next
mds_world
Дата: 05.03.2008 15:46:46
Можно попроще немного. Например, тоже с сортировкой по TabIndex
Sub obhod()
    Dim i, n, k
    n = Me.Form.Controls.Count - 1
    For i = 0 To n
        k = Me.Form.Controls(i).TabIndex
        Debug.Print Me.Form.Controls(k).Name, Me.Form.Controls(k).TabIndex
    Next
End Sub

Если вместо TabIndex ввести свой массив номеров, то обход можно совершать по нему
Wallaby
Дата: 05.03.2008 16:54:29
Спасибо, Анатолий и mds_world! Это не совсем "то самое", но уже близко. Попробую приспособить для своей задачи.

А как узнать максимальный TabIndex контролов на форме?
mds_world
Дата: 05.03.2008 17:01:05
Wallaby
А как узнать максимальный TabIndex контролов на форме?
Можно узнать перебором контролов

Но, насколько я понимаю, вам TabIndex и не нужен. Создайте свой массив в котором будет хранится последовательность номеров и, в частности в моем примере, вместо переменной k, используйте его
k = arr(i)

У меня вопрос. А зачем надо менять последовательность обхода контролов, в какой задаче, для какой цели это требуется?
Wallaby
Дата: 05.03.2008 17:14:14
mds_world
Но, насколько я понимаю, вам TabIndex и не нужен. Создайте свой массив в котором будет хранится последовательность номеров и, в частности в моем примере, вместо переменной k, используйте его
k = arr(i)

как раз меня вполне бы устроил TabIndex. Но что-то у меня переклинило - не получается нормально построить перебор контролов по Tabindex'у, а не индексу.

mds_world
У меня вопрос. А зачем надо менять последовательность обхода контролов, в какой задаче, для какой цели это требуется?

Отвечаю как на духу. У меня в зависимости от того, какие поля отмечены на форме, формируется запрос, результаты которого выгружаются в Excel в качестве отчета. Контролы формы называются так же, как поля в таблице, ну и... вот. Какие именно поля и сколько будет выделено, заранее неизвестно, но хотелось бы, чтобы очередность их выгрузки была более или менее осмысленной, а не хаотичной, как сейчас. Повторяю, табиндекс бы меня устроил, но... заклинило, да. :(
mds_world
Дата: 05.03.2008 17:19:39
Если tabindex повторяется на форме у разных контролов, то к ошибке это не приводит, но вашу задачу может сильно осложнить.
Wallaby
Дата: 05.03.2008 17:23:40
mds_world
Если tabindex повторяется на форме у разных контролов, то к ошибке это не приводит, но вашу задачу может сильно осложнить.

Проверено - мин нет. Не повторяется.
Но заело. В одном шаге от финиша (на текущий день).