Суть проблемы в том, что изначально форма была составлена без особых наворотов в виде вкладок (страниц) и фреймов, но сейчас с добавлением функций в форму, место на ней стало не хватать. Программный код зависим от TabIndex, а он на каждом новом фрейме и новой странице обнуляется. Как-то можно это обойти не переписывая код c нуля? Может как-то программно можно присвоить? Изменение в Свойствах не даёт результата
Суть проблемы в том, что изначально форма была составлена без особых наворотов в виде вкладок (страниц) и фреймов, но сейчас с добавлением функций в форму, место на ней стало не хватать. Программный код зависим от TabIndex, а он на каждом новом фрейме и новой странице обнуляется. Как-то можно это обойти не переписывая код c нуля? Может как-то программно можно присвоить? Изменение в Свойствах не даёт результатаdiJi00
ikki, в конструкторе присваивалось всё изначально [vba]
Код
Sub Class_Activate() 'Активация переменной модуля класса Dim ctl As Control, i As Byte For Each ctl In Controls If ctl.TabIndex < 42 Then i = ctl.TabIndex + 1 Set aoTxtBxes(i).oTxtBx = ctl End If Next End Sub
[/vba]
ikki, в конструкторе присваивалось всё изначально [vba]
Код
Sub Class_Activate() 'Активация переменной модуля класса Dim ctl As Control, i As Byte For Each ctl In Controls If ctl.TabIndex < 42 Then i = ctl.TabIndex + 1 Set aoTxtBxes(i).oTxtBx = ctl End If Next End Sub
Можно ещё вместо TabIndex'ов, при инициализации формы - динамически строить массив(ы) контролов, а затем работать уже с ними. Получится так, что вы вместо некоего бывшего "общего" TabIndex сможете использовать индекс в массиве(ах).
Можно ещё вместо TabIndex'ов, при инициализации формы - динамически строить массив(ы) контролов, а затем работать уже с ними. Получится так, что вы вместо некоего бывшего "общего" TabIndex сможете использовать индекс в массиве(ах).AndreTM
Не сможете. Во всяком случае так, как ожидаете. Фреймы перехватывают. Проверено. Наелся.
В качестве примера. (тему не помню)
4 тексбокса. Если они все на форме - все работает. Но если они на фрейме, то событие Exit последнего текстбокса не работает, а работает событие Exit фрейма. (Ну, или что-то вроде того, не помню точно)
Не сможете. Во всяком случае так, как ожидаете. Фреймы перехватывают. Проверено. Наелся.
В качестве примера. (тему не помню)
4 тексбокса. Если они все на форме - все работает. Но если они на фрейме, то событие Exit последнего текстбокса не работает, а работает событие Exit фрейма. (Ну, или что-то вроде того, не помню точно)RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Воскресенье, 06.10.2013, 20:38
думаю, что нет. точнее - может быть, и можно, но результат будет такой же.
чтобы не менять сильно код, попробуйте использовать свойство Tag. насколько мне помнится - оно есть у каждого стандартного контрола, а значения можно задавать произвольные. в том числе - совпадающие со значениями TabIndex. тогда вам достаточно будет один раз произвести глобальную замену в коде для всего проекта строки .TabIndex на .Tag
пс. вариант "не ахти", поэтому подождите и другие варианты.
думаю, что нет. точнее - может быть, и можно, но результат будет такой же.
чтобы не менять сильно код, попробуйте использовать свойство Tag. насколько мне помнится - оно есть у каждого стандартного контрола, а значения можно задавать произвольные. в том числе - совпадающие со значениями TabIndex. тогда вам достаточно будет один раз произвести глобальную замену в коде для всего проекта строки .TabIndex на .Tag
пс. вариант "не ахти", поэтому подождите и другие варианты.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Сообщение отредактировал ikki - Воскресенье, 06.10.2013, 20:37
Sub Class_Activate() 'Активация переменной модуля класса Dim ctl As Control, i As Byte For Each ctl In Controls If ctl.Tag < 42 Then i = ctl.Tag + 1 Set aoTxtBxes(i).oTxtBx = ctl End If Next End Sub
[/vba]
В условии ошибка
параметр .tag формула не считает [vba]
Код
Sub Class_Activate() 'Активация переменной модуля класса Dim ctl As Control, i As Byte For Each ctl In Controls If ctl.Tag < 42 Then i = ctl.Tag + 1 Set aoTxtBxes(i).oTxtBx = ctl End If Next End Sub
контролы - это не только текстбоксы. а aoTxtBxes(i).oTxtBx, видимо, имеет жестко заданный тип? нужна доп.проверка на тип контрола. вобщем, я ж говорил - "вариант не ахти". но обойти можно.
контролы - это не только текстбоксы. а aoTxtBxes(i).oTxtBx, видимо, имеет жестко заданный тип? нужна доп.проверка на тип контрола. вобщем, я ж говорил - "вариант не ахти". но обойти можно.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
ikki, у меня только текст боксы!, чекбары и опции, идут отдельно. c индекстагом все работало с минимальным кодом. а сейчас 59 позиций будет долговато расписывать)
ikki, у меня только текст боксы!, чекбары и опции, идут отдельно. c индекстагом все работало с минимальным кодом. а сейчас 59 позиций будет долговато расписывать)diJi00
Sub Class_Activate() 'Активация переменной модуля класса Dim ctl As Control, i As Byte For Each ctl In Controls If ctl.Tag > "" Then If Val(ctl.Tag) < 42 Then i = Val(ctl.Tag) + 1 Set aoTxtBxes(i).oTxtBx = ctl End If End If Next End Sub
[/vba]
у меня так заработало: [vba]
Код
Sub Class_Activate() 'Активация переменной модуля класса Dim ctl As Control, i As Byte For Each ctl In Controls If ctl.Tag > "" Then If Val(ctl.Tag) < 42 Then i = Val(ctl.Tag) + 1 Set aoTxtBxes(i).oTxtBx = ctl End If End If Next End Sub
Не сможете. Во всяком случае так, как ожидаете. Фреймы перехватывают. Проверено. Наелся.
Все равно. Нам же максимум надо перехватывать Change() в классе, хотя и Exit() понадобится Но ведь непринципиально, что там кого перехватывает - поскольку по Exit будет передача фокуса следующему объекту в массиве, код-то всё равно отработает, даже если родитель перехватит управление. А вот с Tag'ом - по Exit() надо будет заново перебирать все контролы, чтобы найти следующий... Впрочем, действительно, надо экспериментировать.
Не сможете. Во всяком случае так, как ожидаете. Фреймы перехватывают. Проверено. Наелся.
Все равно. Нам же максимум надо перехватывать Change() в классе, хотя и Exit() понадобится Но ведь непринципиально, что там кого перехватывает - поскольку по Exit будет передача фокуса следующему объекту в массиве, код-то всё равно отработает, даже если родитель перехватит управление. А вот с Tag'ом - по Exit() надо будет заново перебирать все контролы, чтобы найти следующий... Впрочем, действительно, надо экспериментировать.AndreTM
для совместного использования с выпадающим списком
заведете еще один модуль класса, аналогичный модулю clsmTxtBxes - для комбобоксов. в процедуре Class_Activate модуля формы, кроме имеющихся проверок, нужно будет добавить проверку на тип контрола: TypeName(ctl) в зависимости от результата (текстбокс или комбобокс), надо будет добавлять ссылку на контрол в соответствующий массив с элементами соответствующего типа.
для совместного использования с выпадающим списком
заведете еще один модуль класса, аналогичный модулю clsmTxtBxes - для комбобоксов. в процедуре Class_Activate модуля формы, кроме имеющихся проверок, нужно будет добавить проверку на тип контрола: TypeName(ctl) в зависимости от результата (текстбокс или комбобокс), надо будет добавлять ссылку на контрол в соответствующий массив с элементами соответствующего типа.