'Если превышена длина строки, усечь ее
If (m_sb.Length > SSNumberLength) Then
m_sb.Length = SSNumberLength
End If
'Возвратить новую строку
Return m_sb.ToString()
End Function
Private m_in_OnChangeFunction As Boolean
Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
'------------------------------------------------------------------
'Если мы изменим свойство .Text, то будет осуществлен повторный
'вход в обработчик. В этом случае мы не хотим предпринимать никаких
'действий и должны просто выйти из функции без передачи события
'куда-то еще.
'------------------------------------------------------------------
If (m_in_OnChangeFunction = True) Then
Return
End If
'Заметьте, что сейчас мы находимся в функции OnChanged,
'поэтому мы можем обнаружить повторное вхождение (см. код выше)
m_in_OnChangeFunction = True
'Получить текущее свойство .Text
Dim oldText As String = Me.Text
'Получить текущий индекс SelectionStart
Dim selectionStart As Integer = Me.SelectionStart
'Форматировать строку, чтобы она удовлетворяла нашим потребностям
Dim newText As String = formatText_NNN_NN_NNNN(oldText, _
selectionStart)
'Если текст отличается от исходного, обновить
'свойство .Text
If (oldText <> newText) Then
'Это приведет к повторному вхождению
Me.Text = newText
'Обновить местоположение точки вставки
Me.SelectionStart = selectionStart
End If
'Мы принудительно обеспечили соответствие введенного текста правильному
'формату, поэтому, если длина строки согласуется с длиной номера
'карточки социального страхования, то мы знаем что он имеет
'формат ###-##-####.
If (Me.Text.Length = SSNumberLength) Then
'Да, мы имеем полный номер карточки социального страхования
m_inputIsFullValidEntry = True
Else
'Нет, мы пока не получили полный номер карточки социального страхования
m_inputIsFullValidEntry = False
End If
'Вызвать наш базовый класс и сообщить всем объектам, которых это может
'интересовать, что текст изменился
MyBase.OnTextChanged(e)
'Заметьте, что сейчас мы покидаем наш код и хотим отключить
'проверку повторных вхождений в него.
m_in_OnChangeFunction = False
End Sub
Protected Overrides Sub OnKeyPress( _
ByVal e As System.Windows.Forms.KeyPressEventArgs)
'Поскольку нам известно, что никакие буквы при вводе нам не нужны,
'то просто игнорировать их, если они встречаются.
Dim keyPressed As Char = e.KeyChar
If (System.Char.IsLetter(keyPressed)) Then
'Сообщить системе о том, что событие обработано
e.Handled = True
Return
End If
'Обработать нажатие клавиши обычным способом
MyBase.OnKeyPress(e)
End Sub
End Class
Листинг 13.4. Код формы для создания пользовательского элемента управления TextBox'-----------------------------------------------------------------
'Переменная для хранения нашего нового элемента управления TextBox
'-----------------------------------------------------------------
Private m_filteredTextBox As SocialSecurityTextBox
'-----------------------------------------------------------------------
'ОБРАБОТЧИК СОБЫТИЙ: Создать экземпляр нашего пользовательского элемента
' управления и поместить его в форму
'-----------------------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'Создать, позиционировать и разместить элемент управления
m_filteredTextBox = New SocialSecurityTextBox
m_filteredTextBox.Bounds = _
New System.Drawing.Rectangle(2, 2, 160, 20)
'Подключить обработчик событий
AddHandler m_filteredTextBox.TextChanged, _
AddressOf Me.textBox_TextChanged
'Задать родительский объект
m_filteredTextBox.Parent = Me
'Выделить элемент управления
m_filteredTextBox.Focus()
'Сделать данную кнопку недоступной, чтобы поверх данного объекта
'не был создан второй объект
SocialSecurityTextBox Button1.Enabled = False
End Sub
'----------------------------------------------------------------
'ОБРАБОТЧИК СОБЫТИЙ: Этот обработчик подключается динамически при
' создании элемента управления
'----------------------------------------------------------------
Private Sub textBox_TextChanged(ByVal sender As Object, _
ByVal e As System.EventArgs)
If (m_filteredTextBox.IsFullValidInput = True) Then
label1.Text = "FULL SOCIAL SECURITY NUMBER!!!"
Else
Label1.Text = "Not full input yet..."
End If
End Sub
Листинг 13.5. код формы, демонстрирующий использование прозрачности ''----------------------------------------------------------------
'Размеры наших битовых образов и экранного изображения PictureBox
'----------------------------------------------------------------
Const bitmap_dx As Integer = 200
Const bitmap_dy As Integer = 100
'-------------------------------------------------
'Создает и прорисовывает изображение заднего плана
'-------------------------------------------------