Подкласове на Visual Basic в (източник) - Софтуерни продукти
Преди всичко е необходимо да кажем няколко думи за начинаещи програмисти, може би за първи път срещащи думата подклас 1 (да се чете като "подклас"). По прост начин този термин може да се обясни като създаване на някакъв вид "обвивка", която разширява вече съществуващата функционалност за вече съществуващ клас. Да предположим, че вече има такъв контрол катоTreeViewи няма много смисъл да се създава отново този контрол, много по-лесно е да се разшири съществуващият, например чрез добавяне на възможност за подчертаване с различни цветове или чрез включване на анимирани gif изображения и т.н.
В тази статия ще се опитам да опиша използването на подкласове достатъчно подробно и ясно. Статията е предназначена както за начинаещи програмисти, така и за опитниVB6програмисти, преминаващи къмVB.NET.
Основният принцип на подкласирането е предефинирането на методите и свойствата на съществуващите обекти. Предефиниране на реакцията към различни събития, които се случват за този обект. Да кажем, че има някаква контрола, която записва някаква информация във файл, като щракне върху него. Освен това се нуждаем от тази информация, която да не се записва във файл, а да се записва в системния журнал на Windows. За да направим това, предефинираме събитиетоOnClickпо такъв начин, че да се изпълняват точно необходимите действия.
По този начин можете да създадете нов контрол, сякаш съдържащ стария, но реагиращ по различен начин на събитието с щракване на мишката.
Може също да се наложи да замените някои от методите за "рисуване" на контролата, пример е cPopMenu от горния сайт http://www.vbacelerator.com/. Въз основа на стандартното меню е създаден нов контрол, който ви позволява да използвате икони срещу елементименюта и менюта за рисуване в стила на Office 2000.
ВъвVB.NETтези действия са естествени - всички елементи, форми и дори типове данни са класове. И в съответствие с концепциите на ООП те позволяват наследяване и замяна на методи и свойства.
Всичко, така че получаваме контрол върху всички събития във формата. По един или друг начин събитията се обработват от тази процедура. Ключовата думаOverridesозначава, че тази функция замества съществуваща. В този прост пример ще покажа основните принципи на прилагане на подкласове.
Да предположим, че трябва да прихванем събитието с щракване с левия бутон на мишката върху формуляра, за това пишем следния код:
Нека обясня този код. Като начало има проверка кое събитие е "улучило нашата функция". В случая ни интересува само "натискането" на левия бутон. КонстантатаWM_LBUTTONUP- обозначава точно съобщението, получено от формата при "отпускане" на левия бутон на мишката. Можете да видите пълния списък с константи в модула WindowsMessages.vb, включен в проекта, приложен към статията. В модула съм събрал най-често използваните Windows съобщения за лесно и бързо използване в проекти.
Сега нека си поиграем още малко с този код. Нека напишем следния код:
Изпълнявайки проекта, ще открием, че когато се щракне върху формуляра, се показват последователно две MsgBox. Тоест и двете събития се случват. И както трябва да бъде, първо се случва „освобождаването на бутона“, а след това събитието щракване. Сега нека добавим още един ред код:
Сега вторият MsgBox няма да се появи, което показва, че формулярът не е получил събитието, предназначено за него. Така показах как можете да прихванете събитията на формата, преди да ги получи, и да извършите някакво действие, което понякога е много удобно.
Освен отметоди, свойствата също могат да бъдат отменени. За да направите това, добавете следния код:
При щракване върху бутона текстът на заглавието на формуляра ще бъде променен на „Бутон:“ плюс кода на натиснатия клавиш, но отмененото свойство Text извършва някои операции, преди да покаже текста на екрана. Така при натискане на интервала ще се покаже заглавието "Бутон: Интервал", докато получаваме стойността на свойството, ще получим "Бутон: 32".
Този пример е доста безсмислен, но илюстрира начин за промяна на свойствата на обект.
Добавете новUserControlкъм проекта, наименувайте гоNumbersBox. И преминете направо към редактиране на кода. По подразбиране новият клас наследява отSystem.Windows.Forms.UserControl, но това не ни устройва, не искаме да добавямеTextBoxкъм нашата контрола и да създадем контрола, съдържаща TextBox. Нашата задача е да разширим директно функционалността наTextBox. Затова смело сменете реда:
Така че имаме контрола, която вече включва всички функции, методи и свойства на стандартния елементTextBox. Сега вКутията с инструментив разделаМоите потребителски контролисе показва нашатаКутия с числа. След като се възхищавахме на това чудно чудо, нека да продължим директно към изпълнението на плана. Отново по-голямата част от кода ще бъде вWndProc.
И за да забраните присвояването на стойностTextот кода (т.е. текстът може да бъде въведен само директно от клавиатурата), трябва да предефинирате свойствотоTextна основния контролTextBox. Обърнете внимание, че не можем да направим това свойствоСамо за четене, защото базовото свойство не е, но това може лесно да се заобиколи с малък трик.
Сега нека да преминем към създаването на клас за консолидиране на информацията, представена в статията. За тованека създадем ново приложение (о, наистина ли е толкова мързеливо? Е, отворете моя пример). И добавете нов клас, който ще наследим отSystem.Windows.Forms.NativeWindow.NativeWindowе специален клас, създаден да поддържа подкласове заWindows Forms, класът вече съдържа всички необходими методи и свойства за прилагане на подкласове, така че ние го използваме.
Както можете да видите, идеята е гениално проста - класът просто повдига събитието EventHappend веднага щом получи някакво съобщение. След това обвързваме обекта с бутона, поставен преди това във формуляра.
При натискане на клавиша програмата ще покаже MsgBox. По този начин подкласирането на всяка форма или контрола е много лесно - просто съпоставете дескриптора на елемента (Handle) с обекта Subclasser и напишете код за обработка на съобщения за събитиетоEventHappened.
Тази статия обхваща основите на подкласовете въвVisual Basic .NET. Както могат да видят читателите, които преди това са работили сVB6и са се опитали да приложат подкласове, стана много по-лесно и по-разбираемо. В същото време средата .NET поема по-голямата част от работата, а програмистът може да използва само "предимствата на цивилизацията".