Страница: 1 |
|
Вопрос: Глюк с элементом SSTab
|
Добавлено: 17.04.03 10:56
|
|
Автор вопроса: Comanche
|
Расположите на форме ЭУ SSTab1. Сделайте у него 2 вкладки. На первой расположите TextBox "Text1", CommandButton "Command1" и Frame "Frame1", внутри Frame1 - OptionButton "Option1". На второй вкладке - всё то же самое (только вместо 1 будет 2, ессс-но). Ну и на самой форме (не на SSTab1) расположите пару кнопок, к примеру, - Command3 и Command4.
Затем вставьте это в код формы:Private Sub Option1_GotFocus() Me.Caption = "Option1" End Sub ' Private Sub Option2_GotFocus() Me.Caption = "Option2" End Sub И теперь, запустив форму, "походите" по её контролам с помощью клавиши Tab: вы обнаружите, что при открытой вкладке №1, когда видна только Option1, у вас заголовок формы в определённый момент установится в "Option2", хотя ЭУ Option2 находится на неактивной в этотм момент вкладке №2.
Вот такая вот фигня. Фокус, оказывается, может "убежать" с активной вкладки на любую другую, хотя должен бегать только в пределах текущей (активной) вкладки. То же самое будет, если вместо фреймов использовать PictureBox - ещё один контрол, который умеет быть "контейнером". А вот если вы удалите из примера выше оба фрейма, и OptionButton-ы посадите прямо на соотв. вкладки SSTab, то всё тип-топ.
Что это? глюк VB6? сервис-паки на VS у меня стоят все, что есть...
Ответить
|
Номер ответа: 1 Автор ответа: Comanche
Вопросов: 87 Ответов: 459
|
Профиль | | #1
|
Добавлено: 17.04.03 16:09
|
Блин, оказывается, это известный глюк контрола SSTab (http://support.microsoft.com:80/support/kb/articles/q193/0/21.asp&NoWebContent=1). Заодно я узнал, как работает SSTab: у тех элементов, что относятся как неактивным вкладкам, он устанавливает свойство Left в здоровенную отрицательную величину, тем самым "убирая их за пределы экрана".
В итоге, получился код, исправляющий мою ситуацию:Private Sub Form_Load() SSTab1.Tab = 0 Call SSTab1_Click(0) End Sub ' Private Sub Option1_GotFocus() Me.Caption = "Option1" End Sub ' Private Sub Option2_GotFocus() Me.Caption = "Option2" End Sub ' Private Sub PreventTab() Dim ctl As Control, ctl2 As Control ' On Error Resume Next For Each ctl In Me.Controls If TypeOf ctl.Container Is SSTab Then If (TypeOf ctl Is Frame) Or (TypeOf ctl Is PictureBox) Then ' нужно установить TabStop для всех контролов внутри ctl: For Each ctl2 In Me.Controls If ctl2.Container.Name = ctl.Name Then ctl2.TabStop = (ctl.Left > 0) ' If ctl.Left < 0 Then Debug.Print ctl2.Name End If Next ctl2 Else ' Свойство TabStop есть не у всех контролов, поэтому следующий ' оператор может дать ошибку - для этого и нужен On Error. ctl.TabStop = (ctl.Left > 0) End If End If Next ctl On Error GoTo 0 End Sub ' Private Sub SSTab1_Click(PreviousTab As Integer) Call PreventTab End Sub Т.е. при каждом щелчке на вкладке процедура PreventTab устанавливает свойство TabStop в False у тех контролов, которые находятся в этот момент "за пределами экрана" - т.е. которые относятся к неактивным вкладкам. Я проверил - у меня всё исправилось: фокус больше не убегает на неактивные вкладки.
Оператор "If (TypeOf ctl Is Frame) Or (TypeOf ctl Is PictureBox)" нужен для того, чтобы обрабатывать ситуации, когда на ЭУ SSTab расположен контрол, который сам является контейнером (это м.б. или Frame, или PictureBox). Т.к. свойство Left исчисляется от левой границы контейнера, то у всех ЭУ, находящихся внутри такого фрейма или картинки, Left будет всегда > 0, в то время как у самогО фрейма (картинки) Left будет < 0; поэтому без данного оператора IF контролы, лежащие внутри фрейма (картинки), не попали бы в число тех, у которых свойство TabStop установливалось в False, - а это было бы неверно!
Код необходимо модифицировать, если нужно обрабатывать более сложную ситуацию - с бОльшим числом вложенности контейнеров: например, на SSTab лежит Frame, а внутри этого фрейма - есть ещё и PictureBox, и внутри этого PictureBox-а расположены какие-то контролы. Для неограниченного уровня вложенностей нужно, наверное, использовать рекурсию.
Ответить
|
Страница: 1 |
Поиск по форуму