Консультация № 62564
14.11.2006, 11:01
0.00 руб.
0 6 3
Здравствуйте.
Суть вопроса такова:
Есть форма(VB_6 Word XP), на форме есть много(предположим 30 штук, но значение может меняться) объектов CheckBox( CheckBox1, CheckBox2, CheckBox3, и т.д.).
Вопрос: как перебрать все эти CheckBox‘ы в цикле? Как показано ниже не получается, возможно дело в переменной i, какого она должна быть типа?

For i=1 to 30
CheckBox & i.caption="Тест"
next i

Возможно есть другой способ, подскажите пожалуйста?

Обсуждение

Неизвестный
14.11.2006, 11:11
общий
это ответ
Здравствуйте, Васильков Николай Петрович!
Нужно использовать массив чекбоксов. Делается так: создаете на форме чекбокс (CheckBox1), ставите у него свойство Index=0. Далее подгружаем остальные:
Load CheckBox1(1)‘1 - индекс для следующего чекбокса
CheckBox1(1).Left=...
CheckBox1(1).Top=...
CheckBox1(1).Visible=True
При необходимости можно выгрузить его так:
Unload CheckBox1(1)
Перебираем в цикле так:
For i=0 to 3
CheckBox1(i).Value=vbChecked
Next
Обработка событий такая же, только в параметре Index получим индекс чекбокса, для которого произошло событие. Удачи!
Неизвестный
14.11.2006, 11:38
общий
Спасибо Александр за ответ, не подскажешь еще, как список объекта ComboBox сделать прокручиваемым с помощью колесика мыши?
Неизвестный
14.11.2006, 21:20
общий
это ответ
Здравствуйте, Васильков Николай Петрович!
Вам необходимо сделать массив элементов. См. приложение
При этом в форме у вас будет сколько-то объектов с одинаковым именем "CheckBox1". У них автоматически появится свойство Index и в дальнейшей работе с ними вам нужно будет учитывать, что при любом событии CheckBox-а в качестве параметра в процедуру будет передаваться индекс элемента, по которому вы сможете узнать с каким элементом имеете дело

Приложение:
For i=1 to 30CheckBox1.Item(i).caption="Тест"next i
Неизвестный
15.11.2006, 12:59
общий
Дополнение:Свойства Index у CheckBox1 не существует, это первое(возможно, что вы не поняли о версии VB - Microsoft Visual Basic 6.3 встроенный в Office XP )Второе - как создать массив CheckBox‘ов - я понял, что методом копирования их на форме, но имена при копировании всё равно меняются имя на следующее по порядку - CheckBox2, CheckBox3 и т.д.Конкретно по второму ответу от Tossha - Item у CheckBox‘ов нет - компилятор ругается.Если возможно - то опишите все действия по порядку, начиная с того, что создана пустая форма UserForm1 и далее, что делать для создания массива CheckBox‘ов
Неизвестный
18.11.2006, 15:46
общий
это ответ
Здравствуйте, Васильков Николай Петрович!
При нажатии на кнопку можно перебрать все флажки вот так, например:
Private Sub CommandButton1_Click()
Dim c As Control
Static i As Long

For Each c In Me.Controls
If TypeName(c) = "CheckBox" Then
i = i + 1
c.Caption = "Это флажок #" & CStr(i)
c.Value = Not c.Value
End If
Next
End Sub

Хотя и тут не без глюков: у меня Ворд почему-то не хочет видеть видеть флажки как объекты - т. е. сравнение идет так:

If TypeOf c Is CheckBox Then
‘Далее по тексту

и всегда TypeOf c возвращает ложь. С кнопками, например, все нормально, а вот с флажками - такая ерунда творится. Но выход, как видно есть (приходится сравнивать по имени класса) и без использования массивов контролов.
Неизвестный
18.11.2006, 15:52
общий
Еще немного от себя:Так как автор вопроса хотел обращаться к флажкам - можно, но учитывая один манюсенький ньюансик: надо писать не:========================CheckBox & i.caption="Тест"========================а:========================Me.Controls("CheckBox" & CStr(i)).Caption = "Тест"========================Флажок - это ОБЪЕКТ и к нему надо обращаться культурно - по имени в коллекции либо как одному из объектов в той же коллекции Controls
Форма ответа