WithEvents – додавання нових властивостей до стандартних контролю

Михайло Ескін, VBline

Напевно, кожен зустрічався з такою ситуацією: створена форма, розташовані на ній контроли, написаний основний код. І раптом необхідно якесь невелике доповнення. Причому, це доповнення цілком могло б бути одним з властивостей розташованих на формі контролів. Однак, як показує ситуація, в 99% випадків такої властивості контрол не містить. Все набагато простіше, якщо даний ActiveX Control писали ви самі і у вас збереглися исходники. Ви просто додаєте нові властивості, методи чи події та заново компілюєте його. Зовсім не ординарна ситуація виходить якщо ви хочете додати, припустимо, якесь нове властивість до стандартного елементу управління. Вихідних кодів у вас, природно, немає і тоді постає питання: “Як бути в даній ситуації?” Чи то відмовитися від задуманого нововведення, то Чи самому написати ActiveX Control, чи то написати код для обробки даної ситуації.

Однак Visual Basic, виявляється, передбачив вихід з даної ситуації. І цей вихід WithEvents. Давайте на прикладі звичайного Label додамо до нього нову властивість.Нехай це буде відкриття броузера або поштової програми при виконанні подіїClick. Розібравшись, як це робиться, ви не будете відчувати незручності в ситуаціях, описаних вище.

    Крок 1. Створимо новий проект Standard
EXE.

Name=WithEventsSample

Змінимо ім’я форми на frmMain. Розташуємо на ній 4 Label. Їх властивості вказані в наступній таблиці:

Name Caption ForeColor Font.Underline 
lblInfo1 Відвідайте сайт: & H80000012 & False
lblHomePage http:\\www.mik.h1.ru &H00800000& True 
lblInfo2 Зв’язатися з автором & H80000012 & False
lblEMail miceskin@usa.net &H00800000& True 

NB! Адреси сайту та електронної пошти вказані тут як зразок, в своїх програмах ви можете використовувати будь-які інші коректні адреси.

    Крок 2. Додамо до проекту модуль класу.

Name=clsNewProperty

У розділі декларацій оголосимо API vфункцію ShellExecute і константу для неї SW_NORMAL. Ця функція послужить нам для відкриття броузера або поштової програми. Зробимо оголошення
WithEvents

Private WithEvents NewLabel As Label

Тепер, якщо ми натиснемо в коді класу випадаюче меню з переліком контролів, то побачимо з’явилася там новий рядок NewLabel. Якщо ми його оберемо, то з’явиться оголошення його події по замовчуванням. Так як у Label основною подією є Click, то й у NewLabel, заснованому на ньому, подією за замовчуванням буде також Click. Поки залишимо його в спокої.Створимо властивість для зв’язку Label, розташованого на формі, з нашим класом

Public Property Set LabelControl(ExternalLabel As Label)
    Set NewLabel = ExternalLabel
End Property

    Крок 3. Додамо ще одне властивість, що визначає виконувану дію: відкриття броузера, відкриття програми або нічого не робити.

NB! У даних ситуаціях переважно (хоча і необов’язково) передбачати НЕ обробку ситуації, щоб решти ідентичних контролів не торкнулися наші зміни.

Створимо цифрові константу в розділі декларацій, там же оголосимо внутрішню змінну для цієї властивості

Public Enum constTypeMsg
    None = 0
    HomePage = 1
    EMail = 2
End Enum

Private mvarTypeMsg As constTypeMsg

Тепер напишемо саме властивість.

NB! Само властивість можна створити за допомогою Class Builder
Utility.

Public Property Let TypeMsg(ByVal vData As constTypeMsg)
    mvarTypeMsg = vData
End Property

Public Property Get TypeMsg() As constTypeMsg
    TypeMsg = mvarTypeMsg
End Property

    Крок 3а. Зараз нам необхідно зробити обробку події Click для NewLabel. Спиратися ми будемо на стан властивості TypeMsg. Для стану None ми не будемо описувати ніяких змін. Стан HomePage викликає через функцію ShellExecute відкриття броузера, а стан Email v відкриття поштової програми за замовчуванням.

Private Sub NewLabel_Click()
    Select Case mvarTypeMsg
        Case None

        Case HomePage
            Dim X
            X = ShellExecute(0&,
"Open", NewLabel.Caption, &O0, &O0, SW_NORMAL)
        Case EMail
            Call ShellExecute(0&, “Open”, “mailto:” + NewLabel.Caption +
&n 1000 bsp; _
                
“?Subject=” + “About WithEventsSamples”, “”, “”, SW_NORMAL)
    End Select
End Sub

    Крок 3b. Змінимо стан курсору при попаданні його на адресу, враховуючи стан властивості TypeMsg. Для цього спочатку скопіюємо в свою папку курсор “вказуючого пальця”. Завантаження даного курсора можна виробляти через метод LoadPicture (як у нашому прикладі), або використовувати для цього файл ресурсів.

Private Sub NewLabel_MouseMove(Button As Integer, Shift As
Integer,
X As Single, Y As Single)

    Select Case mvarTypeMsg

        Case None

           
‘NewLabel.MousePointer = vbDefault

        Case HomePage
            NewLabel.MouseIcon = LoadPicture(App.Path & “/H_POINT.CUR”)
            NewLabel.MousePointer = vbCustom
        Case EMail
            NewLabel.MouseIcon = LoadPicture(App.Path & “/H_POINT.CUR”)
            NewLabel.MousePointer = vbCustom
    End Select
End Sub

Ось, власне кажучи, і все, що необхідно зробити в класі.

    Крок 4. Перейдемо в форму. У розділі декларацій оголосимо новий клас як клас clsNewProperty для кожного з
Label.

NB! Для тих контролов, у яких ми НЕ хочемо мати додатково створені нами властивості, ми клас НЕ оголошуємо.

У події Form_Load ініціалізували кожен клас, виконуємо прив’язку контрола до цього класу через подію LabelControl і для відповідних контролів виконуємо подія
TypeMsg.

Private Sub Form_Load()
    Set clsLabelHomePage = New clsNewProperty
    Set clsLabelHomePage.LabelControl = lblHomePage
    clsLabelHomePage.TypeMsg = HomePage
    Set clsLabelEMail = New clsNewProperty
    Set clsLabelEMail.LabelControl = lblEMail
    clsLabelEMail.TypeMsg = EMail
    Set clsLabelInfo1 = New clsNewProperty
    Set clsLabelInfo1.LabelControl = lblInfo1
    clsLabelInfo1.TypeMsg = None
    Set clsLabelInfo2 = New clsNewProperty
    Set clsLabelInfo2.LabelControl = lblInfo2
    clsLabelInfo2.TypeMsg = None
End Sub

Запустіть проект на виконання та перевірте отриманий результат. Сподіваюся, тепер з недоліком властивостей у стандартних контролів проблем у вас не виникне.

Лістингі приклад.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*