Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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  

Номер ответа: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам