|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
Створення
діалогових вікон
Щоб
вивести власне діалогове вікно, створіть форму, задайте її властивостям
Controlbox, Minimizebox і Maximizebox значення False, а властивості Modal — значення
True. Форму слід виводити методом Showdialog в режимі модального діалогового
вікна. Якщо при цьому задати властивість Topmost рівним True, діалогове вікно розташовуватиметься
поверх всіх вікон на екрані (і вам вже не доведеться використовувати функцію API Setwindowpos). Проте поведінка
стандартних кнопок дещо змінилася в порівнянні з Vb6. Властивості Default
і Cancel не підтримуються, тому відповідні елементи-кнопки призначаються
властивостям Acceptbutton і Cancel Button: Me.AcceptButton = btnok Me.Cancel Button
= btncancel Після виклику
Showdialog програма може дізнатися, яка кнопка була натиснута на формі, за допомогою
властивості Dial ogresult кнопки або самої форми (натиснення кнопки із заданою властивістю
Dialogresul t приводить до автоматичного закриття форми, на якій ця кнопка
знаходиться).
Розміщення
елементів на формі під час виконання
До
виходу Vb6 існував лише один спосіб розміщення елементів на формі під час
виконання програми — масиви елементів. У Vb6 з'явився зручніший режим динамічного
додавання елементів, але і в цьому випадку не обходилося без проблем з обробкою
подій для доданих елементів. У VB .NET цей процес піддався істотним
змінам. Наприклад, створіть новий додаток Windows і включите в нього наступний
фрагмент: 1 Private Sub
Forml_load(Byval sender As System.Object,ByVal e As _ 2 System.EventArgs)
Handles Mybase.Load 3 Dim newbutton
As New System.Windows.Forms.Button() 4 '
Задати властивості newbutton 5 With
newbutton 6 .Visible =True 7 .Size =New
Size(l00.l00) 8 ' .Text ="I'm
а new button" 9 '
Зазвичай тут задаються і інші властивості 10 End
With 11 Me.Controls.Add(newbutton) 12 Addhandler
newbutton.Click.AddressOf Me.newButton_Click 13 End
Sub 14 Public Sub
newbutton_click(Byval sender As _ 15 System.Object.ByVal
e As System.EventArgs) 16 Msgbox("You
clicked on my new button") 17 End Sub У рядку Із
створюється нова кнопка, а в рядках 5-10 зручний скорочений запис With використовується для
завдання ряду властивостей об'єкту newbutton. Тільки у рядку 11 нова кнопка розміщується
на формі. Рядок 12 знову демонструє чудову гнучкість механізму обробки
подій .NET: код, що міститься в строках
14-17, призначається обробником події для кнопки. Можливий результат виконання
програми показаний на мал. 8.15.
Мал.
8.15. Створення кнопки під час виконання програми
Перш за все
слід сказати, що «візуальне спадкоємство», що часто
згадується в рекламних матеріалах по VB .NET, існує лише в хворій уяві
фахівців з маркетингу. Насправді мова йде про тому, що форми, створені в програмі, можуть
використовуватися як основа для визначення нових форм за допомогою спадкоємства.
Звичайно, це вельми зручно і корисно, але нічого принципово нового в такому
спадкоємстві не немає. Клас форми, похідний від Windows. Forms. Form і
доповнений спеціалізованими властивостями, методами і подіями, надалі може використовуватися
як базовий для визначення нових класів.[ Історія з «візуальним спадкоємством»
як не можна краще демонструє тупість фахівців з
реклами. Можливо, ефектний термін уразить некомпетентноге менеджера, але у
програмістів він лише викликає роздратування. ]
Припустимо, ви хочете створити для своєї організації вікно-заставку (splash screen),
яке окремі підрозділи доповнюватимуть своїми даними. Базова форма створюється
таким чином:
Припустимо, ви хочете перетворити стандартний додаток Windows в бібліотеку
класів, щоб відкомпілювати його в DLL замість ЕХЕ-файла. Найпростіше це робиться так:
Після побудови
бібліотеки DLL залишається лише включити посилання на неї в рішення, після чого класи
DLL використовуються в програмі нарівні з рештою класів. При виконанні команди
Project > Add Inherited Form можна доручити IDE включити в проект весь необхідний
код, для чого досить відповісти на декілька питань в діалогових вікнах.
З іншого боку, метушня з діалоговими вікнами виглядає трохи безглуздо, оскільки
після включення посилання на DLL в проект залишається лише привести перший
рядок додатку до наступного вигляду: Public
Class Form1 Inherits Splashscreenbase.
Form1 Все останнє
за вас зробить механізм спадкоємства! Цей спосіб особливо хороший тим, що робота
дизайнера автоматично синхронізується з успадкованою формою.
Побудова
нестандартних елементів на базі спадкоємства
Спадкоємство
застосовується при побудові не тільки нових форм, але і нових елементів. Допустимо,
ви хочете створити текстове поле, призначене для введення тільки цілих чисел.
Як завжди, все починається з оголошення нового класу: Public
Class Positivelntegertextbox Inherits System
. Windows . Forms . Textbox Залишається лише
запрограмувати поле на потрібну поведінку. У частині цього розділу, що залишилася,
буде показано, як клас Positi velntegertexbox наповнюється спеціалізованими
властивостями, подіями і методами. Отже, створіть нову бібліотеку класів і включите в рішення посилання на збірку Windows.Forms.dll.
Почнемо з
перевизначення подій базового класу. Наприклад, подія Onchange допоможе
запобігти введенню в полі всього, що не є цілим числом. Наступний обробник
дозволяє вводити або вставляти з буфера тільки позитивні цілі числа: 1 Public
Class Positivelntegertextbox 2 Inherits System.Windows.Forms.TextBox 3 Protected
Overrides Sub Ontextchanged(Byval e As Eventargs) 4 Mybase.OnTextChanged(e) 5 If Not (Isnumeric(Me.Text)) Then 6 Me.Text -
String.Empty 7
Else 8 Dim
temp As Decimal 9 temp = Ctype(Me.Text.Decimal) 10 If temp -
Math.Round(temp.0) <> 0 Then 11 Me.Text =
String.Empty 12 End
If 13 End
If 14 End
Sub 15 End Class У
рядках 1 і 2 оголошується спеціалізована версія звичайного текстового
поля. Оскільки при спеціалізації на базі спадкоємства зберігаються всі члени
базового класу, які не піддалися явним змінам, вам не доведеться удаватися
до послуг програми-майстра (як в Vb6), щоб вирішити питання з незмінними
властивостями — наприклад, з основним кольором. При перевизначенні подій в похідному
класі зазвичай викликається обробник базового класу, як в рядку 4.
Необхідність цього рядка пов'язана з тим, що ми не програмуємо обробку цієї події
від початку і до кінця, а хочемо скористатися успадкованими аспектами
поведінки базового класу. У рядках 5-6 запобігає введення нечислових даних типу
32skiddoo. У рядках 9-12 з текстового поля віддаляються дробові числа; за допомогою
вбудованої функції Round програма переконується в тому, що закруглене число збігається
з початковим. Слід відмітити, що просте знищення введеного тексту
виглядає декілька жорстоко по відношенню до користувача. У витонченішій програмі
слід було б зберегти попередній текст, щоб відновити його при
необхідності. В цьому випадку одна помилка введення не приводитиме до повної втрати введених
даних. На цій стадії
приведений вище фрагмент можна відкомпілювати в DLL і отримати цілком працездатний
елемент. Щоб протестувати елемент після компіляції, створіть новий додаток
Windows і помістите елемент на панель елементів:
Елемент поміщається
на вкладку .NET Framework Components (мал. 8.16).
Мал.
8.16. Нестандартний елемент на вкладці .NET Framework Components
Мал.
8.17. Нестандартний елемент на панелі елементів Нестандартний
елемент розміщується в нижній частині панелі (мал. 8.17). Двічі клацніть в рядку
Poslti velntegertextbox, і елемент з'явиться на формі. Звернете увагу: наш
простий елемент володіє всіма властивостями звичайних текстових полів і особливостями
поведінки, властивими текстовим полям в режимі конструювання. Все це було
автоматично успадковано від класу текстових полів Windows. Forms. Textbox
без щонайменших зусиль з вашого боку.
Додати
підтримку нової події в елемент нітрохи не складніше, ніж включити обробник
події в клас (ця тема розглядалася в розділі 6). Припустимо, кожного разу,
коли користувач вводить щось відмінне від позитивного цілого числа, елемент
повинен ініціювати подію Baddataentered. Новий код класу виділений жирним
шрифтом: Public Class Positivelntegertextbox Inherits System.Windows.Forms.TextBox Public Event Baddataentered(Byval Sender As Object _ Byval e As Eventargs) Protected Overrides Sub Ontextchanged(Byval e As Eventargs) Mybase.OnTextChanged(e) If Not (Isnumeric(Me.Text))
Then Me.Text = String.Empty Raiseevent Baddataentered(Me.
New System.EventArgs()) Else Dim temp As Decimal temp = Ctype(Me.Text,Decimal) If temp = Math.Round(temp.0) <> 0 Then Me.Text = String.Empty Raiseevent Baddataentered(Me, New System.EventArgs()) End If End If End Sub End Class У елементах
VB існує поняття події за умовчанням (default event). Подія за
умовчанням спрацьовує автоматично при подвійному клацанні на екземплярі елементу
в дизайнерові форм. Подія за умовчанням задається за допомогою спеціального атрибуту.
Атрибути відповідають екземплярам класу System.Attribute; атрибут Def aul
tevent входить в простір імен System. Componentmodel. У програмі атрибути
полягають в кутові дужки, а при установці атрибуту Defaul tevent указується
ім'я події в лапках. Щоб призначити подію Baddataentered подією за умовчанням
для даного елементу, приведіть початок класу до наступного вигляду: Imports System.ComponentModel <Defaultevent("Baddataentered")>
Public Class _ Positivelntegertextbox Inherits System.Windows.Forms.TextBox
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||