Выбрать главу

 'Если превышена длина строки, усечь ее

 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

'-------------------------------------------------

'Создает и прорисовывает изображение заднего плана

'-------------------------------------------------