Я сам с идеей Extender, благодаря подсказке с этого сайта. Я нашел собственное решение:
Класс clsTextBoxExtender Определение:
Public WithEvents Control As TextBox
Private Sub Control_GotFocus()
Control.SelStart = 0
Control.SelLength = Len(Control.Text)
End Sub
Private Sub Control_LostFocus()
Control.SelLength = 0
End Sub
Модуль Module1 Определение:
Public Sub InitialiseTextBoxExtenders(ByRef myForm As Form, ByRef extenderCollection As Collection)
Dim formControl As Control
Dim oTBXExtender As clsTextBoxExtender
For Each formControl In myForm.Controls
If TypeOf formControl Is TextBox Then
Set oTBXExtender = New clsTextBoxExtender
Set oTBXExtender.Control = formControl
extenderCollection.Add oTBXExtender
End If
Next
End Sub
Форма Form1 Определение:
Private textBoxExtenderCollection As New Collection
Private Sub Form1_Load()
Module1.InitialiseTextBoxExtenders Me, textBoxExtenderCollection
End Sub
'No longer required
'Private Sub TextBox1_GotFocus()
' TextBox1.SelStart = 0
' TextBox1.SelLength = Len(TextBox1.Text)
'End Sub
Таким образом, для каждой новой формы все, что вам нужно сделать, это объявить коллекцию и вызвать код инициализатора в событии загрузки формы. Простой!
Кроме того, если у вас есть дополнительные требования, по которым вам нужно возвращаться к своему классу-расширителю, а не циклически проходить через вашу коллекцию, вы можете выбрать создание ключа, скажем, имени элемента управления при добавлении в коллекцию, однако имейте в виду, если вы используете управляющие массивы в вашей форме, возможно, ваша форма должна включать индекс в ключ.
Также обратите внимание, что если вы объявите одно и то же событие в своей форме для контроля, ваше событие и событие extender будут срабатывать одно за другим. Однако я не знаю какой-либо документации по этому вопросу, поскольку из моих экспериментов событие extender идет последним.