И так в этой статье расмотрим возможность, которая в некоторых случаях - способна стать альтернативой сабклассингу и более предпочиттельна, а именно рассмотрм то, как поймать событие добавляемого в процессе программы контрола: И так приступим: откроем новый проект, и кинем на форму Label и Text Допуситм нам нужно, чтобы при изменении значения (пусть это будет какое-то число) в Text1 - автооматически в процессе программы добавлялись текстбоксы, количество которых - задано в Text1... Но мало того, мы хотим еще и отловить событие Change этих контролов Пусть все это происходит при событиии Change Text1, то етсь сразу же... Мы не можем заранее, в Disign-режиме добавить эти контроы и опрдеелить их события, так не знаем их количество... Полагаю, что задача ясна и нетривиальна Ну что ж напишем в коде формы следующий код: Option Explicit Private textWidt() As VB.TextBox Dim numLab As Byte Dim myTxtBox() As New Vrapper Private Sub Form_Load() Me.Show Text1.SetFocus Text1.SelLength = 1 End Sub Private Sub Text1_Change() Dim topLab As Integer topLab = Label1.Top + 600 ReDim textWidt(Val(Text1)) ReDim myTxtBox(Val(Text1)) While numLab < Val(Text1) Set textWidt(numLab) = Me.Controls.Add("VB.TextBox", "lineWidth" & numLab, Me) With textWidt(numLab) .Visible = True .Left = Text1.Left .Width = 350 .Top = topLab .FontSize = 14 .Text = 1 End With topLab = topLab + 600 myTxtBox(numLab).MkEqu = textWidt(numLab) numLab = numLab + 1 WEnd textWidt(0).SetFocus textWidt(0).SelLength = 1 End Sub | Хорошо, ну я чуть-чуть поясню: topLab - определяет вертикальную координату создаваемого контрола, и при каждом создани она увеличвается на 600 твипов... Строчка Set textWidt(numLab) = Me.Controls.Add("VB.TextBox", "lineWidth" & numLab, Me) как вы наверно уже догадались, создает тот самый контрол А эту myTxtBox(numLab).MkEqu = textWidt(numLab) я объясню немного ниже. А пока добавим в наш проект модуль класса, назовем его Vrapper и пропишем в нем следующий код Option Explicit Private WithEvents DemoTxtBox As TextBox Property Let MkEqu(DemoTxtBox2 As Object) Set DemoTxtBox = DemoTxtBox2 End Property Sub DemoTxtBox_Change() Form1.Caption = 0 End Sub | Ну а теперь поясняю: Private WithEvents DemoTxtBox As TextBox здесь ы определили текстбокс с событиями, котому в свойстве MkEqu присваиваем значение созданного контрола в коде формы, ну вобщем-то теперь и пришло время вернуться к строчке в коде формы, которую я обещал ниже пояснить: myTxtBox(numLab).MkEqu = textWidt(numLab) Если вы внимательно читали, то не могли не заметить, что еще в самом начале формы мы объявили массив позднее определенного класса: Dim myTxtBox() As New Vrapper и теперь в цикле обращаемся к текущему элементу мссива и определяем в нем свойство MkEqu, все просто Ну а теперь вернемся в наш модуль класса и увидим там: Sub DemoTxtBox_Change() Form1.Caption = 0 End Sub Вот это самое событие, которое и должно произойти при изменении значения в уже добавленных компонентах.... Как видите все просто))) Вместо Form1.Caption = 0 вы можете вставить какой-нибудь MsgBox и проверить... (гы, а пи сабклассинге такогоо нельзя), точно также можете ловить и аналогичные события.... Пример, описанный в данной статье, можно найти в разделе скачки Задавайте любые вопросы, связанные с этой статьей на нашем форуме, мы будем рады вам ответить
|