51452

VISUAL BASIC 6.0. Обчислювальна техніка і програмування

Книга

Информатика, кибернетика и программирование

Навчальний посібник присвячений оволодінню найпопулярнішою системою швидкої розробки програм. У методичному матеріалі описуються інструментальні засоби середовища Visual Basic.6 і розглядаються компоненти, властивості, методи та події, необхідні для розроблення широкого спектру базових програм, за допомогою яких студенти навчаються програмуванню.

Украинкский

2014-03-31

2.27 MB

9 чел.

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

Львівський поліграфічний коледж УАД

Т. А. Щесюк

Навчальний посібник

для вивчення основних тем

з дисципліни

«Обчислювальна техніка і програмування»

Розділ «VISUAL BASIC 6.0»

ч. 2 (процедури, модулі, класи, змінні)

для студентів спеціальності

5.05150104 "Дизайн друкованої продукції"

Львів  2013


Щесюк Тарас Антонович. Навчальний посібник для вивчення основних тем з дисципліни «Обчислювальна техніка і програмування». Розділ «VISUAL BASIC 6.0». — Львів, 2013,  83  с.

Розглянуто і рекомендовано до друку на засідання циклової комісії математичної та природничо-наукової підготовки. Протокол № 5 від 31 січня 2013 р.

Рецензент: доцент кафедри електронних видань,  к.т.н. Сабат В.І.

Щесюк Т. А. Навчальний посібник присвячений оволодінню найпопулярнішою системою швидкої розробки програм. У методичному матеріалі описуються інструментальні засоби середовища Visual Basic.6 і розглядаються компоненти, властивості, методи та події, необхідні для розроблення широкого спектру базових програм, за допомогою яких студенти навчаються програмуванню.


ВСТУП

Microsoft Visual Basic 6 — найостанніша версія популярної мови програмування. Середовище Visual Basic прекрасно підходить для розробки додатків практично будь-якого типу. Можна створювати потужні автономні застосування, ігри і службові утиліти, витративши на це менше часу, ніж для будь-якої іншої мови програмування. Технологія ActiveX дозволяє писати додатки з підтримкою Internet, можливості яких обмежуються тільки фантазією розробника. У поєднанні з Windows API Visual Basic перетворюється на серйозний інструмент, відповідний майже для будь-яких проектів.

Навчальний посібник для вивчення розділу «Visual Basic 6» з дисципліни «Обчислювальна техніка і програмування» побудований так, щоб допомогти вам швидко освоїти Visual Basic. Він не лише навчить користуватися Visual Basic і інструментами, що додаються до нього, — ви освоїте багато корисних і практичних прийомів програмування, про які часто забувають у світі швидкої розробки додатків. Початкуючі програмісти можуть не сумніватися: описані прийоми згодяться і для інших мов і платформ. Ви освоїте усе необхідне для проектування, програмування і поширення повноцінних застосувань — і при цьому від читача не потрібно детальне вивчення усіх нюансів програмування. Попередній досвід програмування необов'язковий; єдине, що вимагається, — загальне уявлення про середовище Windows і бажання вчитися. Книга навчить вас програмувати, використовуючи Visual Basic як основну мову.

У даній частині посібника можна навчитись створювати власні процедури і модулі, підключати відкриті контроли CPL, а також використовувати контроли OCX і DLL. Детально подана інформація про межі застосування змінних. Ви дізнаєтеся, які типи даних краще підходять для конкретних завдань, як динамічно створювати нові дані і визначати константи, що спрощують програмування.


Робота з модулями і класами

  •  Модулі і класи
  •  Створення програмної бібліотеки
  •  Процедури
  •  Функції
  •  Передача параметрів функціям і підпрограмам
  •  Робота з модулями
  •  Використання Class Builder

Досі приклади програм виглядали дуже тривіально. Увесь код, з яким нам доводилося працювати, містився в процедурах подій форм. Але для того, щоб користуватися розширеними можливостями Visual Basic, доведеться відмовитися від цього обмеженого підходу. Зокрема, ви навчитеся створювати власні процедури і модулі. У попередньому розділі нам вже зустрічався приклад простого модуля, але незабаром вам напевно захочеться доповнити його. Розширення бібліотеки класів дозволяє приділяти більше часу проектуванню програм, ніж їх безпосередньому кодуванню.

Модулі і класи

У попередніх уроках ми встигли розглянути два найважливіші "будівельні блоки" Visual Basic - форми і елементи. Настав час зайнятися третім видом "блоків" - програмними модулями (чи просто модулями). Програмний модуль є текстовий ASCII - файл, що містить підпрограми, функції, змінні і/або константи. Насправді ми вже користувалися модулями в попередніх уроках, але зараз ми детально вивчимо, як вони працюють. Програмний модуль схожий на ящик з інструментами. Уявіть собі, що у вас в одному ящику зберігаються молоток, викрутка, різні цвяхи і шурупи. Молоток і цвяхи відповідають процедурам програмного модуля, а цвяхи і шурупи - змінним (чи даним). Тепер уявіть, що цвяхи не розкладені по окремих коробках, а валяються в ящику разом з іншими інструментами. Приблизно такий влаштований простий програмний модуль.

ПІДКАЗКА. Модулі є текстові ASCII - файли з програмним кодом. У них зручно групувати взаємозв'язані процедури, які можуть використовуватися в програмі.

Код проекту може складатися з безлічі програмних модулів. Наприклад, молоток і викрутку можна зберігати в одній коробці, а цвяхи і шурупи - в іншій. Подібна структурна організація спрощує читання програми. Усе це, звичайно, добре, але уявіть собі робітника-будівельника, якому доводиться тягати з собою безліч ящиків з інструментами і коробочок з цвяхами і шурупами. Було б набагато зручніше мати один ящик для молотка і викрутки із спеціальними відділеннями для кожного типу цвяхів. Аналогічна можливість передбачена і в Visual Basic - вам знадобиться модуль класу, що частіше іменується просто класом.

Класи є основними будівельними блоками об'єктно-орієнтованого програмування (ТОП) - моделі, при якій програма описується у вигляді сукупності об'єктів. Клас не лише дозволяє виділити частину функціональних коштів програми в окремий об'єкт, але і розширює можливості базових модулів - ви можете захистити одні фрагменти програми, а інші - надати в розпорядження програми. Цей процес називається інкапсуляцією. Програмні об'єкти, що конструюються в ТОП, імітують поведінку об'єктів реального світу.

Як і елементи, про які говорилося в уроці 3, класи мають властивості, методи і події, призначені для виконання взаємозв'язаних операцій. Добре спроектований клас є цілком самостійним фрагментом програми. Це означає, що ви можете перенести клас з одного проекту в іншій, і він буде нормально працювати без яких-небудь виправлень. Об'єкти і ТОП детально розглядаються в уроці 15.

Оскільки модулі містяться в окремих файлах, їх можна включати відразу в декілька проектів. Таким чином, з'являється можливість повторно використовувати написаний код. Наприклад, у мене є декілька модулів, що містять взаємозв'язані процедури. У одному модулі зберігаються функції для роботи з діалоговими вікнами, якими я користуюся у своїх програмах. У іншому модулі об'єднані функції, що спрощують роботу з мультимедіа-пристроями. Групуючи однорідні функції в межах одного модуля, ви створюєте програмну бібліотеку. Якщо помістити модулі в один каталог або логічно пов'язаний набір підкаталогів, їх можна буде використовувати в інших проектах.

Використання програмних бібліотек економить час, оскільки вам не доведеться наново створювати вже написаний код. Продовжуючи метафору з інструментами, можна сказати, що програмна бібліотека нагадує вантажівку для перевезення інструментів і припасів. У нім поміщається багато ящиків, що містять різні інструменти; у одному ящику лежать молотки і викрутки, в іншому - пензлі і ролики для фарби. Різні типи даних знаходяться в одній бібліотеці, але при цьому не змішуються один з одним.

Інша перевага програмних бібліотек полягає в тому, що після відладки їх вміст можна сміливо використовувати в інших проектах. Ви отримуєте у своє розпорядження набір інструментів з довічною гарантією: вам вже не доведеться ходити магазинами і купувати нове устаткування для кожного нового завдання! Перш ніж приступати до модулів і класів, давайте створимо програмну бібліотеку, в якій ви почнете колекціонувати свої власні програмні засоби.

Створення програмної бібліотеки

Програмні модулі, якими ми незабаром займемося, треба буде десь зберігати. Створіть на жорсткому диску спеціальний каталог. У нім ми зберігатимемо програмні модулі, які використовуватимуться в майбутніх проектах.

Програмна бібліотека створюється так:

1. Запустіть Провідник Windows за допомогою кнопки Пуск або ярлика на робочому столі Windows.

2. Створіть каталог (чи теку) Codelib. Місцезнаходження теки слід вибрати так, щоб при необхідності її можна було легко знайти і скопіювати. Вміст бібліотеки не повинен пропасти при переустановленні програмного забезпечення.

3. Закрийте Провідник Windows.

Якщо написаний вами програмний модуль досить універсальний і містить засоби, які можуть використовуватися в інших застосуваннях, збережете його в каталозі Codelib. Коли ви захочете включити модуль в інший проект, поступите так:

1. Клацніть правою кнопкою миші у вікні проекту Visual Basic.

2. Виберіть з контекстного меню команду Add > Add File.

3. У діалоговому вікні Add Module виберіть потрібний модуль з каталогу Codelib.

Створення модулів

Щоб включити в програмний модуль нову процедуру, виконаєте команду Tools > Add Procedure і виберіть потрібні параметри в діалоговому вікні Add Procedure (мал. 4.1). Ця команда доступна лише при відкритому вікні програми.

Мал. 4.1. Діалогове вікно Add Procedure.

Після створення каталогу для зберігання модулів можна приступати до написання першого модуля. У наступних розділах ми наділимо його деякими корисними функціями. Створення модуля відбувається так:

1. Створіть новий проект командою File > New Project.

2. Клацніть правою кнопкою миші у вікні проекту і виконаєте команду Add > Module.

3. Виберіть в діалоговому вікні Add Module значок Module. Натисніть кнопку Open -в проекті створюється порожній модуль.

Прискорений спосіб додавання процедур

Замість виконання команди Tools > Add Procedure існує і інший, швидший, спосіб включення процедури в модуль:

1. Введіть текст Public Sub ProcedureName (де ProcedureName - ім'я вашої процедури) де-небудь в порожньому рядку вікна програми.

Крім того, можна ввести Private Sub ProcedureName для створення закритої процедури або просто Sub ProcedureName - така процедура за умовчанням буде відкритою.

2. Натисніть клавішу Enter; Visual Basic автоматично створює шаблон процедури

Зразковий вид вікна програми Visual Basic показаний на наступному малюнку.

4. У вікні властивостей задайте властивості Name тільки що створеного модуля значення MyLibrary.

5. Збережете файл командою File > Save MyLibrary або скористайтеся поєднанням клавіш Ctrl+S. У діалоговому вікні Save File As, що відкрилося, збережете файл в каталозі Codelib, створеному в попередньому розділі. Він покладе початок вашій програмній бібліотеці.

Процедури

У попередніх уроках ви познайомилися з процедурами, які приймають деякі аргументи, виконують програмний код і змінюють значення аргументів. Аргументами називаються змінні, які передаються процедурі. Наприклад, методу Addltem списку передаються аргументи з даними, що заносяться в список, і позицією рядка, що додається, в списку. Наступна команда:

Istltems.Addltem "Widgets"

викликає метод Addltem з аргументом "Widgets" і додає цей рядок в кінець списку. Зверніть увагу: аргументи можуть відноситися практично до будь-якого типу. Конкретний тип залежить від того, як працює ця процедура.

Як ви незабаром переконаєтеся, процедури допомагають організувати багатократне використання коду. Замість того щоб наново вводити кожен рядок в декількох місцях програми для виконання одних і тих же завдань, можна створити одну процедуру і викликати її з декількох місць програми. Це не лише скоротить об'єм тексту, що вводиться, але і гарантує однакову роботу процедури при кожному виклику.

Щоб ви краще зрозуміли, як написати процедуру і використовувати її в програмі, ми створимо процедуру, яка замінює стандартний покажчик-стрілку пісочними годинами. Її слід викликати перед тим, як ваша програма займеться виконанням якого-небудь тривалого завдання. Покажчик у вигляді пісочного годинника підкаже користувачеві, що програма не "зависла", а робить щось корисне.

1. Відкрийте проект з попереднього розділу, якщо він не був відкритий раніше.

2. Якщо модуль MyLibrary відсутній в проекті, додайте його - для цього слід клацнути правою кнопкою миші у вікні проекту і виконати команду Add > Module з контекстного меню. Коли з'явиться діалогове вікно Add Module, перейдіть на вкладку Existing. Потім знайдіть файл MyLibrary.Bas і натисніть кнопку Open, щоб включити модуль в проект.

3. Двічі клацніть на файлі My Library. Bas у вікні проекту. Відкривається вікно програми.

4. У вікні програми введіть наступний код:

Public Sub ShowHourglass()

Screen.MousePointer = 11 End Sub

Процедура створює покажчик миші у вигляді пісочного годинника. Проте після того, як покажчик був змінений, ми повинні мати можливість повернути йому колишній вид.

5. Додайте в модуль наступний фрагмент:

Private Sub ShowMousePointer()

Screen.MousePointer = 0

End Sub

6. Виконаєте команду File > Save MyLibrary в меню Visual Basic.

Процедури ShowHourglass і ShowMousePointer згодяться в тих випадках, коли програма зайнята, а користувачеві доводиться чекати її звільнення. Викличте ShowHourglass на початку, a ShowMousePointer - у кінці періоду очікування, наприклад:

ShowHourglass

IndexLargeDatabase

ShowMousePointer

В майбутньому, коли ви почнете писати власні процедури і функції, їх теж можна буде додати в цей модуль.

Функції

Функції багато в чому схожі на процедури. Існує лише одна принципова відмінність - при виклику вони повертають значення. Функція отримує один або декілька об'єктів даних, званих аргументами, і виконує з ними деякі дії. Їх результат повертається функцією. Можливо, це звучить декілька туманно, але насправді у функціях немає нічого складного. Краще всього розглянути роботу функцій на конкретному прикладі. Давайте напишемо функцію для обчислення кубічного кореня:

1. Створіть новий проект командою File > New Project.

2. Якщо модуль My Libгагу відсутній в проекті, додайте його - для цього слід клацнути правою кнопкою миші у вікні проекту і виконати команду Add > Module з контекстного меню.

3. Коли з'явиться діалогове вікно Add Module, перейдіть на вкладку Existing. Потім знайдіть файл MyLibrary.Bas і натисніть кнопку Open, щоб включити модуль в проект.

4. Двічі клацніть на файлі MyLibrary.Bas у вікні проекту. Відкривається вікно програми. Вставте наступний фрагмент в секцію(Declarations):

Public Function CubeRoot

Visual Basic автоматично створює шаблон наступного виду:

Public Function CubeRoot()

End Function

5. Вставте в шаблон наступний фрагмент (мал. 4.2):

Public Function CubeRoot(x as Double) As Double

If x = 0 Then

CubeRoot = 0

Exit Function

End If

CubeRoot = 10 ^ ((Log(Abs(x)) / Log(10)) / 3)

If x < 0 Then

CubeRoot = - CubeRoot

End If

End Function

Мал. 4.2. Вікно програми з функцією для обчислення кубічного кореня.

6. Виконайте команду File > Save MyLibrary.

Перш ніж розглядати цей приклад, давайте коротко розглянемо приведений вище код. Функція отримує аргумент х і намагається вичислити його кубічний корінь. Тип значення, який повертається функцією (у нашому прикладі Double - числовой тип, який може працювати з дуже великими і дуже малими, а також дробовими числами), вказується в заголовку функції після ключового слова As. Текст функції закінчується командою End Function, а не End Sub. Зверніть увагу на три рядки, в яких привласнюється значення змінної CubeRoot. Значення функції повертається у вигляді змінної, ім'я якої співпадає з ім'ям функції (у нашому прикладі - CubeRoot). Якби наша функція називалася TimesTwo(), то і значення поверталося б в змінній TimesTwo (наприклад, TimesTwo = х*2).

Перш ніж приступати до обробки аргументу, бажано перевірити отримані дані. Спочатку ми перевіряємо, чи рівний аргумент 0 - як відомо, кубічний корінь з 0 дорівнює 0, тому ми можемо відразу присвоїти змінній CubeRoot, яка повертає значення та вийти із функції, не виконуючи подальших обчислень. Для виходу з функції застосовується команда Exit Function.

Математичне обґрунтування нас зараз не цікавить. Команда CubeRoot = 10 ^ ((Log(Abs(x)) / Log(10)) / 3) повертає кубічний корінь аргументу х.

Нарешті, ми перевіряємо, чи не являється аргумент функції негативним числом. Приведена вище формула завжди повертає позитивний результат, тому для негативного аргументу необхідно змінити знак значення на протилежний. У Visual Basic це робиться командою

CubeRoot = - CubeRoot

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

7. Двічі клацніть на формі Form1 у вікні проекту - форма з'являється у вікні конструктора.

8. Задайте властивості Caption значення Робота з програмною бібліотекою.

9. Створіть на формі кнопку. Задайте її властивості Name значення cmdCubeRoot, а властивості Caption - значення Кубічний корінь.

10. Двічі клацніть на кнопці cmdCubeRoot - відкривається вікно програми з процедурою події cmdCubeRoot_Click().

11. Вставте в процедуру наступний фрагмент:

Dim Y As Double

Y = CubeRoot(27)

Print Y

Зразковий вид вікна програми показаний на мал. 4.3.

Мал. 4.3. Код виклику функції CubeRoot.

12. Запустіть додаток і натисніть кнопку. Зразковий вид форми показаний на мал. 4.4. У нашому прикладі повертане значення друкується прямо на формі.

Мал. 4.4. Функція повертає кубічний корінь 3.

Зазвичай значення яке повертається відображується в одному з елементів форми, наприклад в текстовому полі (мал. 4.5). Це робиться так:

Мал. 4.5. Змінене вікно програми і форма.

13. Зупините програму, натиснувши кнопку [х] у правому верхньому кутку форми. Ви знову опинитеся в режимі конструктора.

14. Двічі клацніть на формі Form1 у вікні проекту.

15. Створіть на формі текстове поле, задайте його властивості Name значення txtText1. Видалите поточний вміст властивості Text.

16. Видалите з процедури події Click() кнопки cmdCubeRoot останній рядок (Print Y) і заміните її наступній:

txtText1.Text = Y

Результат показаний на мал. 4.6.

Крім того, можна видалити увесь вміст процедури і обмежитися всього одним рядком:

txtText1.Text = CubeRoot(27)

В цьому випадку значення яке повертається привласнюється елементу без використання проміжної змінної.

Мал. 4.6. Новий варіант додатка.

Тестування у вікні відпадки

Роботу процедур і функцій можна перевірити у вікні відладки.

Запустіть проект, потім виконаєте команду Run > Break. На передній план виходить вікно відладки, показане на наступному малюнку.

Якщо ви втратите його, виконаєте команду View > Immediate Window. Зараз ви працюєте в режимі відладки. Щоб запустити процедуру з вікна відладки, введіть її ім'я і натисніть Enter. Якщо процедура викликається з параметрами, їх також слід ввести. Наприклад:

AlterCaption "Новий заголовок"

У функціях вас в основному цікавить значення, яке можна вивести у вікні відладки. Це робиться, наприклад, так:

Print CubeRoot(27)

чи так:

? CubeRoot(27)

Оновлення програмної бібліотеки

Давайте доповнимо нашу бібліотеку новою функцією, яка перевіряє, чи існує на диску файл із заданим ім'ям. Цю функцію слід викликати перед спробою відкрити файл або створити його (щоб запобігти випадковому знищенню існуючого файлу):

1. Якщо проект з попереднього розділу не зберігся, створіть новий проект командою File > New Project.

2. Якщо модуль MyLibrary.Bas не був включений в проект, клацніть правою кнопкою миші у вікні проекту і виконаєте команду Add > Module з контекстного меню.

3. У діалоговому вікні Add Module перейдіть на вкладку Existing, знайдіть файл MyLibrary.Bas і натисніть кнопку Open. Програмний модуль включається в проект.

4. Двічі клацніть на файлі MyLibrary.Bas у вікні проекту. У вікні програми, що відкрилося, вставте наступний фрагмент в секцію(Declarations):

Public Function IsFile(FileName As String) As Boolean

If Len(Dir(Filename))> 0 Then

'Файл існує

IsFile = True

Else

'Файл не існує

IsFile = False

End If

End Function

5. Збережете бібліотеку командою File > Save MyLibrary. Уся основна робота виконується в рядку

If Len(Dir(Filename))> 0 Then

У ній викликаються ще дві функції, які формують одне підсумкове значення. Функція Dir() отримує один параметр - Filename. Вона перевіряє, чи існують файли, відповідні заданому критерію (наприклад, *. txt), і повертає перший відповідний файл, якщо він існує. Наприклад, якщо в теці Мої документи існує файл FooBar.txt і змінній Filename буде присвоєне значення З:\Мої документи\FооВаг.txt, функція повертає текстовий рядок FooBar, txt. Якщо файл не існує, Dir() повертає порожній рядок. Після функції Dir() викликається функція Len(). Вона повертає довжину рядка, переданого їй як аргумент. Наприклад, функція Len("abc") повертає значення 3, тому що рядок abc складається з трьох байтів. Оскільки Diг() повертає ім'я файлу, відповідного переданому критерію, ланцюжок Len(Dir()) еквівалентний виклику Len("FooBar. txt"), який повертає значення 10. Нарешті, ми перевіряємо, чи повернула функція Len() позитивне число. Довжина FooBar. txt дорівнює 10; поза сумнівом, це число більше нуля, тому змінною IsFile привласнюється значення True - воно показує, що файл дійсно існує. Якщо Dir() поверне порожній рядок, функція Len() повертає 0. Це число не є позитивним, тому IsFile привласнюється значення False - відповідно, файл не існує.

Перший модуль готовий, і тепер ви можете включати його у свої проекти для виконання деяких простих завдань. Функція IsFile перевіряє, чи існує на жорсткому диску файл із заданим ім'ям. Подібну перевірку слід виконувати перед спробою відкриття файлу в програмі. Від вас вимагається лише вказати, який файл вас цікавить:

If IsFile("C:\CONFIG.SYS") Then

... .. дії вашої програми ..

End If

Передача параметрів

Щоб процедура працювала з різними початковими даними, їй можна передавати параметри, які також іноді називаються аргументами. Передача параметрів функціям має очевидний сенс: ви хочете, щоб функція виконувала одні і ті ж дії з різними даними. Сказане відноситься і до процедур, за одним виключенням: процедура не повертає значення. Одну і ту ж процедуру можна викликати знову і знову, що стає першим кроком на шляху до повторного використання коду.

Щоб краще зрозуміти, як працює цей механізм, уявіть собі соковижималку. Усе, що вона уміє робити, - вичавлювати сік з фруктів і овочів. Покладіть в неї морквину, і ви отримаєте морквяний сік. Покладіть апельсин - і отримаєте апельсиновий сік. Замініть соковижималку деякою функцією, "покладете" в неї деякий параметр, і ви отримаєте відповідний тип соку, тобто, результат.

Будь-яку процедуру або функцію слід звести до виконання конкретного завдання. Це завдання може складатися з декількох підзадач, але усі вони працюють разом і дають загальний результат. Наприклад, наступна процедура змінює властивість форми Caption:

1. Створіть новий проект типу Standard EXE.

2. Помістите кнопку на форму Form"). Задайте її властивості Name значення cmdCaption, а властивості Caption - значення Змінити заголовок.

Private Sub AlterCaption(X As String)

Caption = X

End Sub

Зразковий вид вікна програми показаний на наступному малюнку.

Процедурі передається всього один аргумент - X. Його ім'я не має ніякого значення, проте процедура буде правильно працювати лише у тому випадку, якщо їй буде передано строкове (текстове) значення. Наприклад, ви можете створити строкову змінну з ім'ям MyTitleText і присвоїти їй значення Новий заголовок, після чого передати MyTitleText як параметра процедури. Іншими словами, процедурі можна передати ім'я строкової змінної або звичайний текст, поміщений в лапки (строкову константу).

Щоб викликати процедуру (скажімо, з процедури події Click кнопки), спробуйте ввести наступний фрагмент (див. вікно програми на наступному малюнку):

Текст після імені процедури утворює строкову константу - звернете увагу на навколишні лапки. Строкова константа і є параметром, який ставиться у відповідність аргументу X. Передача строкової змінної може бути продемонстрована на наступному прикладі (див. вікно програми далі):

Як бачите, цього разу лапки не використовуються. Також слід звернути увагу на відсутність дужок навколо параметра (хоча аргумент, якому він передається, поміщений в дужки). Ваша форма має бути схожа на мал. 4.8.

Параметри, що передаються функціям, повинні полягати в дужки. Параметри процедур в дужки не полягають. Крім того, якщо передається декілька параметрів, їх слід розділяти комами. Наприклад, у вас є процедура CreateUser, яка отримує два параметри - ім'я користувача і пароль. Її виклик в програмі може виглядати таким чином:

CreateUser "Джон Доу", "123456"

Чи

Dim UserlD As String

Dim Password As String

UserlD = "Джон Доу"

Password = "123456"

CreateUser UserID, Password

Як бачите, код обох прикладів виглядає дуже просто. У першому випадку потрібні значення параметрів передаються процедурі безпосередньо - це називається "Жорстке кодування". Хоча цей варіант можливий, при створенні декількох користувачів в програмі з'явиться багато зайвих рядків. Альтернативний варіант - використовувати змінні, присвоїти їм потрібні значення і один раз викликати процедуру (як це зроблено в другому прикладі).

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

Dim UserlD As String

Dim Password As String

UserlD = "Джон Доу"

Password = "123456"

If ValidUser(UserID, Password) = True Then

'Зробити щось корисне

Else

'Вивести повідомлення про помилку

End If

Зверніть увагу на те, що параметри поміщені в дужку і розділені комами. Кількість параметрів визначається при оголошенні функції. Одні функції викликаються з декількома параметрами, інші - взагалі без параметрів.

Ключове слово Optional

При визначенні функції можна вказати, що деякі з параметрів є необов'язковими. Для цього перед визначенням параметра ставиться ключове слово Optional:

Public Function CreateUser (UserlD As String, Password As String, Optional Description As String) As Boolean

Третій параметр, Description, необов'язковий. За бажання функції CreateUser можна передати опис користувача, але функція працюватиме і без нього. Єдине, про що слід пам'ятати при оголошенні необов'язкових параметрів, - всі наступні аргументи теж мають бути необов'язковими і оголошуватися з ключовим словом Optional.

Перед ім'ям оголошуваного параметра можуть вказуватися ще три префікси -

ByRef, ByVal і ParamArray.

Ключове слово ByRef

Префікс ByRef означає, що параметр передається по посиланню (за умовчанням в Visual Basic використовується саме такий спосіб передачі). Коли змінна передається по посиланню, функція або процедура отримує її адресу в пам'яті і може змінити фактичне значення змінної. Передача по посиланню дозволяє передати або отримати декілька результатів при одному виклику функції. Синтаксис виглядає таким чином:

Function FunctionName(ByRef AVariable As String) As Boolean

чи

Function FunctionName(AVariable As String) As Boolean

Ключове слово ByVal

Префікс ByVal говорить про те, що параметр передається за значенням. В цьому випадку Visual Basic передає копію поточного вмісту змінної замість її адреси в пам'яті, і функція або процедура не зможе безпосередньо модифікувати початкове значення. Синтаксис виглядає таким чином:

Function FunctionName(ByVal AVariable As String) As Boolean

Ключове слово ParamArray

Ключове слово ParamArray дозволяє передати функції невизначена кількість параметрів. Наприклад, з його допомогою можна передати функції CreateUser зведення про довільну кількість користувачів. Одна з вимог, пов'язаних з ключовим словом ParamArray, полягає в тому, що масив даних який передається повинен мати тип Variant. Оголошення функції повинне мати наступний синтаксис:

Function FunctionName(ParamArray AnArray() As Variant) As Boolean

В цьому випадку функція може викликатися так:

Dim rc As Boolean

rс = FunctionName("Джон", "Джейн", "Джим", "Джені")

rс = FunctionName("Джеймс")

rс = FunctionName("Джері", "Джеки")

Зверніть увагу: таку функцію можна викликати з будь-якою кількістю параметрів, вам не доведеться включати в програму декілька окремих викликів. Ключове слово ParamArray робить функції більше універсальними, але за це доводиться розплачуватися швидкістю виконання програми: дані типу Variant обробляються повільніше, ніж інші типи Visual Basic.

Ключові слова Public і Private

Напевно, ви звернули увагу на ключові слова Private або Public, які зустрічалися при роботі з програмними модулями в попередніх уроках і прикладах. Ці ключові слова визначають зону видимості процедури. Ключове слово Private робить процедуру доступною тільки на рівні модуля - це означає, що працювати з нею можуть лише об'єкти, що знаходяться в тих же формі або модулі. Процедури і функції, оголошені з ключовим словом Public, доступні на рівні усього проекту, тобто мають глобальну зону видимості. Зони видимості чинять значний вплив на будову і функціональні можливості ваших програм. Зараз ми розберемося, чому і як це відбувається.

Закриті процедури (Private)

Програмні модулі складаються з процедур, що забезпечують роботу форм і елементів, що знаходяться на них. У процедурах подій для форм з попередніх прикладів часто траплялося ключове слово Private, що знаходиться перед ключовим словом Sub. Необов'язкове ключове слово Private описує процедуру, доступну лише для інших процедур з тих форми або модуля, де вона оголошена. Такі процедури називаються закритими, тому що їх не можна викликати поза цією формою.

Якщо відкрити проект прикладу з каталогу \MSN\98vs\1033\Samples\ VB98\Controls, у вікні проекту ви побачите сім форм (мал. 4.9). Кожен файл форми описує форму і елементи, що знаходяться на ній.

Мал. 4.9. Сім форм у вікні проекту.

Файли форм також містять тексти процедур подій, пов'язаних з формою; вони називаються кодом форми (code behind form - СВF). Код форми називається модулем форми. Модуль є самостійним набором процедур, які можуть викликатися з процедур подій цієї форми або з будь-якої іншої процедури того ж модуля.

Усі процедури подій починаються з ключового слова Private. Воно означає, що процедура не може бути викликана за межами модуля форми. Її зона видимості обмежується модулем, і поза формою вона недоступна - іншими словами вона є локальною, або закритою, процедурою. За умовчанням усі процедури подій оголошуються з ключовим словом Private. Проте ви можете включити у форму власні процедури і зробити їх доступними на рівні додатка (тобто відкритими, або глобальними), скориставшись ключовим словом Public. Такі процедури можна викликати з будь-якої іншої форми (чи стандартного модуля) проекту. Якщо ключове слово Private або Public не вказане, за умовчанням процедура вважається відкритою.

Відкриті процедури (Public)

У деяких ситуаціях процедура має бути доступна за межами форми - допустимий, ви хочете додати кнопки на форму панелі інструментів вашого власного застосування. Один з можливих варіантів - помістити процедуру в програмний модуль, в якому будь-хто форма, елемент або процедура зможуть дістати до неї доступ. Інший варіант - залишити процедуру в тому модулі, якому вона належить, і вказати ключове слово Public перед її оголошенням. В цьому випадку процедура також буде доступна для інших компонентів вашого застосування.

Ви можете виконати будь-яку відкриту (чи закриту) процедуру форми, включивши її ім'я в іншу процедуру тієї ж форми. Наприклад, якщо у вас є процедура з ім'ям Test, вона виконується наступним рядком:

Test

Строго кажучи, сказане відноситься тільки до процедур Sub; функції викликаються трохи інакше. Крім того, існують процедури третього типу - процедури властивостей. Про них мова піде в розділі "Робота з модулями класів" цього уроку.

Робота з модулями класів

Інший тип модулів, що заслуговує на нашу увагу, - модулі класів, або просто класи. Класи є фундаментальними "будівельними блоками" в так званому об'єктно-орієнтованому програмуванні (ТОП). Одні і ті ж об'єкти використовуються на всіх стадіях розробки проекту. Детальніша інформація про ТОП приведена в уроці 15.

Класи дозволяють виділити частину функціональних можливостей програми в один об'єкт, що полегшує проектування і розробку програм. При оптимізації окремих об'єктів знижується вірогідність небажаного впливу на інші фрагменти програми. У ТОП об'єкти в першу чергу служать для моделювання реальних ситуацій.

Visual Basic дозволяє вставляти класи в проект або компілювати їх, перетворюючи на елементи ActiveX - бібліотеки динамічного компонування (DLL) або нестандартні елементи, які раніше називалися OCX. Елемент ActiveX можна використовувати в програмі або впровадити в документ World Wide Web (зазвичай звані документами HTML). Приклад з уроку 10, "Діалогові вікна", показує, як створити клас нестандартного діалогового вікна і відкомпілювати його в ActiveX DLL. У уроці 17, "Використання ActiveX", приведена конкретніша інформація по ActiveX. Як ви переконаєтеся, класи лежать в основі багатьох нових можливостей Visual Basic. А доки ми розглянемо модулі класів і їх роль у ваших проектах, не вдаючись до теоретичних тонкощів ТОП.

Клас містить властивості і методи, які виконують деякі взаємозв'язані операції. Клас є самостійним фрагментом програми. Це означає, що клас можна перенести з одного проекту в іншій, і він буде правильно працювати без всяких модифікацій. Об'єкти Visual Basic створюються на основі класів. Наприклад, об'єкт-кнопка насправді створюється на основі спеціального класу. Кнопка працюватиме в будь-якому застосуванні, при цьому її не доводиться змінювати. Проектовані вами класи повинні поводитися так же.

Класи, як і стандартні модулі, зберігаються в окремих файлах, проте вони обов'язково включають дві процедури - Class_Initialize() і Class_Terminate():

  •  Процедура Class_Initialize() задає значення властивостей за умовчанням або виконує інші підготовчі дії. Наприклад, створений вами клас на початку роботи може виводити діалогове вікно з повідомленням або переглядати системний реєстр у пошуках деякого параметра.
  •  Процедура Class_Terminate() містить код для виконання завершуючих дій. Можливо, ваш клас створює тимчасові файли на жорсткому диску -в кінці роботи їх слід видалити. Для подібних дій і призначена процедура Class_Terminate.

Методи

Методи класів виконують майже ті ж завдання, що і процедури модулів. Ім'я методу може мати модифікатор Private або Public залежно від його зони видимості. Відкриті (Public) методи утворюють програмний інтерфейс класу, і програми можуть працювати з ними без всяких обмежень. Закриті (Private) методи використовуються класами для виконання внутрішніх операцій, недоступних за межами класу.

Прикладом закритого методу може послужити метод для витягання інформації з бази даних персоналу. Доступ до таких даних має бути обмежений, тому вони витягаються закритим методом. Потім ви можете написати відкритий метод, усередині якого викликатиметься закритий. Наступний приклад - клас, що імітує роботу банкомату:

Private Function GetBalance(AccountNo As String) As Double

GetBalance = 10000000

End Function

Public Function DisplayAccountInfo(AccountNo As String, PIN As _

String) As Double

If AccountNo = "123456" And PIN = "5551289" Then

DisplayAccountlnfo = GetBalance(AccointNo)

End If

End Sub

Функція GetBalance оголошена закритій, оскільки стороннім абсолютно немає чого знати про стан чужих рахунків. Тільки уявіть собі, як багато друзів у вас з'явиться, коли усі дізнаються про ваш рахунок в 10 мільйонів доларів! Щоб обмежити доступ до інформації, користувач повинен пройти через процедуру DisplayAccountlnfo. У цій процедурі перед отриманням інформації про стан рахунку перевіряються номер рахунку і особистий ідентифікатор (PIN).

Властивості

Як ви дізналися з уроку 3, властивості - це змінні, призначені для отримання і повернення цих класів. Властивості, як і методи, бувають закритими і відкритими. Відкриті властивості можуть використовуватися процедурами, що знаходяться поза зоною видимості цього класу. Відкриті властивості утворюють частину інтерфейсу класу. Закриті властивості використовуються для зберігання інформації, що не входить в інтерфейс. Вони запобігають навмисній або випадковій зміні даних, що забезпечують нормальну роботу класу. Ці дані можна отримати тільки за допомогою спеціальних функцій відкритого інтерфейсу. Робота з властивостями класів здійснюється за допомогою операторів Property Get, Property Let і Property Set. Оператор Property Get утворює відкритий інтерфейс для набуття значень змінних класу, до яких програма не може звернутися безпосередньо. Оператор Property Let виконує протилежне завдання - він дозволяє задавати значення змінних класу. Оператор Property Set дозволяє передати об'єкт по посиланню. Така можливість може згодитися, якщо модуль класу повинен безпосередньо працювати із зовнішнім елементом (у наступному прикладі буде показано, як це робиться). Властивості також можна створювати, оголошуючи їх відкритими в цьому класі. Оператори Property Get і Property Let дозволяють створити просту модель безпеки для властивостей класу. Повернемося до нашого прикладу з банкоматом. Там є два хороші претенденти на роль властивостей - змінні AccountNo і PIN. Давайте переробимо наш клас так, щоб ви могли задати потрібні значення властивостей і потім викликати методи без всяких параметрів. Наприклад:

Public AccountNo As String

Public PINNo As String

Private Function GetBalanceO As Double

GetBalance = 10000000

End Function

Public Function DisplayAccountlnfo() As Double

If AccountNo = "123456" And PINNo = "5551289" Then

DisplayAccountlnfo = GetBalance()

End If

End Function

А ось як виглядає той же фрагмент з використанням операторів Property Let і Property Get:

Private AcctNo As String

Private PINNo As String

Private Property Let AccountNo(x As String)

AcctNo = x

End Property

Public Property Let PIN(x As String)

PINNo = x

End Property

Private Function GetBalance() As Double

GetBalance = 10000000

End Function

Public Function DisplayAccountlnfo() As Double

If AccountNo = "123456" And PIN = "5551289" Then

DisplayAccountlnfo = GetBalance()

End If

End Function

Події

Події утворюють найцікавішу частину моделі класу. Вони дозволяють класу обмінюватися інформацією з додатком при дотриманні певних умов. Говорять, що програма управляється подіями - це означає, що її робота визначається виникаючими подіями і не залежить від того, в якій момент виконується те або інша умова. Додаток само повідомить вас про це, ініціюючи подію.

Усі стандартні процедури, що відображуються у вікні програми, відносяться до подій. Наприклад, процедура Form_Load є подією.

Для визначення подій в класі використовуються ключові слова Public Event в секції(Declarations) модуля. Синтаксис виглядає таким чином:

Public Event EventName(napaметри)

Зверніть увагу: в цьому рядку міститься лише оголошення події, а не його конкретна процедура. Для створення події у формі використовується синтаксис наступного виду:

Private WithEvents x As ClassName

Наприклад, рядок

Private WithEvents p As Person

оголошує закритий об'єкт р, створений на основі класу Person (людина). Якби наша "людина" могла говорити, клас міг би містити подію Speak. При оголошенні події головну роль грає ключове слово WithEvents. Без нього ви могли б звертатися до відкритих властивостей і методів класу, але не до його подій.

Чому ж подіям приділяється так багато уваги? Тому що вони позбавляють ваше застосування від необхідності активного опитування даних. Активним опитуванням називається багатократна перевірка деякої величини до тих пір, поки не буде виконано певну умову. Цикл активного опитування поглинає ресурси процесора і уповільнює роботу програми. Завдяки подіям ваша програма може зайнятися рішенням інших завдань до того моменту, поки не буде ініційовано відповідну подію.

Наше знайомство з основними концепціями класів добігає кінця. Форми, програмні модулі і елементи є основними будівельними блоками в додатках, написаних на Visual Basic. Тепер давайте заглянемо чим глибше і подивимося, як з цих блоків побудувати що-небудь корисне.

Створення класу SmartForm

Наступний приклад допоможе вам краще зрозуміти, як проектуються класи. Я використовую клас SmartForm для зберігання і отримання інформації про положення і розмір форм на екрані. Такі форми "запам'ятовують" своє положення і стан між запусками додатка. Коли усе буде готове, ви можете включити цей клас у свою програмну бібліотеку і використовувати його в майбутніх проектах!

1. Створіть новий проект командою File > New Project або поєднанням клавіш Ctrl+N.

2. У діалоговому вікні New Project, що відкрилося, виберіть значок Standard EXE.

3. Включите в проект новий модуль класу - для цього клацніть правою кнопкою миші у вікні проекту і виберіть команду Add > Class Module з контекстного меню.

4. У діалоговому вікні Add Class Module виберіть значок Class Module і натисніть кнопку Open.

5. У вікні властивостей задайте властивості Name створеного класу значення Smart Form.

6. Двічі клацніть на формі Smart Form у вікні проекту, щоб відкрити для неї вікно програми.

7. Вставте наступний фрагмент в секцію(Declarations) модуля класу:

Option Explicit

'Закриті змінні

Private mForm As Object

Private mLeft As Long

Private mTop As Long

Private mWidth As Long

Private mHeight As Long

Private mWS As Integer

Public Event ErrorMessage(Message As String)

Ці закриті змінні відносяться тільки до цього класу і недоступні за його межами. Працювати з ними можна тільки через інтерфейс класу. Подія

ErrorMessage оголошене відкритим (Public).

8. Додайте в клас нову властивість командою Tools > Add Procedure.

9. Коли на екрані з'явиться діалогове вікно Add Procedure, введіть в поле Name рядок Form.

10. Встановіть перемикач Property і залиште перемикач Scope в положенні Public.

11. Завершіть створення властивості кнопкою ОК. У програмний модуль будуть додана дві процедури подій: Public Property Get Form() і Public Property Let Form(ByVal vNewValue As Variant).

12. У рядку

Property Let Form(ByVal vNewValue As Variant)

замініть ключове слово Let на Set. Рядок набере наступного вигляду:

Property Set Form(ByVal vNewValue As Variant)

13. Вставте наступний рядок в процедуру Property Get Form():

Form = mForm

14. Вставте наступний рядок в процедуру Property Set Form..:

Set mForm = vNewValue

Оскільки в наших процедурах параметри мають тип Variant, ми скористаємося засобами пошуку і заміни IDE і замінимо його типом Object.

15. Натисніть Ctrl+H, щоб викликати діалогове вікно пошуку і заміни тексту.

16. Введіть в поле Find What слово Variant.

17. Введіть в поле Replace With слово Object.

18. Якби пошук і заміну вимагалося виконати в усьому застосуванні, ми б встановили перемикач Current Project. Оскільки нас цікавить тільки поточний модуль класу, Встановіть перемикач Current Module.

19. Натисніть кнопку Replace All, щоб замінити в цьому модулі усі типи Variant типами Object. В результаті будуть здійснена дві заміни.

20. Закрийте діалогове вікно кнопкою Cancel.

21. Додайте наступний метод в секцію(Declarations):

Private Sub SaveSettings()

Dim mAppName As String

' Присвоїти змінній ім'я ЕХЕ-файлу

mAppName = App.EXEName

'Інформацію можна зберегти лише при відомому

' імені додатка і імені форми..

With mForm

If .Name <> "" Then

SaveSetting mAppName, .Name, _

""WindowState", Str$(.WindowState)

If .WindowState = vbNormal Then

SaveSetting mAppName, .Name, _

""Left", Str$(.Left)

SaveSetting mAppName, .Name, _

""Top", Str$(.Top)

SaveSetting mAppName, .Name, _

""Width", Str$(.Width)

SaveSetting mAppName, .Name, _

""Height", Str$(.Height)

End If

Else

' Ініціювати подію ErrorMessage

RaiseEvent ErrorMessage("Необхідно задати " _

""об'єкт форми"!)

End If

End With

End Sub

Основна частина роботи виконується за допомогою команди SaveSetting. Ця вбудована команда Visual Basic дозволяє зберегти значення в системному реєстрі, не звертаючись до Windows API.

22. Додайте наступний метод в секцію(Declarations) класу:

Private Sub GetSettings()

Dim mAppName As String

'Присвоїти змінній ім'я ЕХЕ-файлу

mAppName = App.EXEName

With mForm

If .Name <> "" Then

mLeft = Val(GetSetting(mAppName, _

..Name, "Left", .Left))

mTop = Val(GetSetting(mAppName, _

..Name, "Top", .Left))

mWidth = Val(GetSetting(mAppName, _

..Name, "Width", .Left))

mHeight = Val(GetSetting(mAppName, _

..Name, "Height", .Left))

'Змінити розмір форми

..WindowState = mWS

..Move mLeft, mTop, mWidth, mHeight

Else

'Ініціювати подію ErrorMessage

RaiseEvent ErrorMessage("Необхідно задати "

""об'єкт форми"!)

End If

End With

End Sub

Щоб наш клас дозволяв змінювати розміри форм, в секцію(Declarations) модуля класу слід включити метод Resize:

Public Sub ResizeO

' Усе, що від нас потрібно -

' зберегти координати форми

SaveSettings

End Sub

23. Вставте наступний фрагменті секцію(Form [Property Set]):

Public Property Set Form(ByVal vNewValue As Object)

'Створити посилання на реальний об'єкт форми

Set mForm = vNewValue

'Отримати збережені координати

GetSettings

'Виконати першу зміну розміру

Resize

End Property

24. Залишається лише навчити клас зберігати значення параметрів і знищувати посилання при вивантаженні об'єкту форми. Для цього в процедуру події Class_ Terminate() вставляється наступний фрагмент:

Private Sub Class_Terminate()

'Зберегти параметри форми

SaveSettings

'Знищити локальне посилання на об'єкт

Set mForm = Nothing

End Sub

25. Ми ввели досить великий об'єм коду - настав час зберегти файл. Натисніть Ctrl+S, і коли на екрані з'явиться діалогове вікно Save As, вкажіть в полі Save In ім'я каталогу своєї програмної бібліотеки (якщо ви створили її).

26. Натисніть кнопку Save, щоб зберегти клас.

Поздоровляю! Ви тільки що створили універсальний модуль класу. Цей модуль можна використовувати в будь-яких проектах, що містять форми, а його підключення до форм вимагає мінімального об'єму коду. Давайте подивимося, як це робиться:

1. Двічі клацніть на формі Form! у вікні проекту, щоб відкрити вікно програми для форми.

2. Вставте наступний рядок в секцію(Declarations) форми:

Option Explicit

Private WithEvents sf As SmartForm

Як говорилося раніше, ключове слово WithEvents повідомляє Visual Basic про необхідність виведення подій класу у вікні програми. В результаті ви зможете вибрати sf із списку Object, що розкривається, в лівому верхньому кутку вікна програми.

3. Перейдіть до процедури події ЕггоrMessage і вставте в неї наступний рядок:

Private Sub sf_ErrorMessage(Message As String)

MsgBox Message

End Sub

По команді MsgBox Visual Basic створює діалогове вікно повідомлення для виведення інформації. Змінна Message передається цій функції як параметр.

4. Щоб скористатися об'єктом класу SmartForm (sf), необхідно його створити. Інакше кажучи, об'єкт має бути створений на базі шаблону, описаного в модулі класу. Для цього в процедуру події Form_Load() форми Form1 додається наступний фрагмент:

Private Sub Form_Load()

Set sf = New SmartForm

Set sf.Form = Me

End Sub

5. При зміні розмірів форми треба наказати об'єкту SmartForm запам'ятати розмір і положення форми. Вставте наступний фрагмент в процедуру події Form_Resize:

Private Sub Form_Resize()

sf.Resize

End Sub

6. Нарешті, при закритті форми слід знищити об'єкт sf. Вставте наступний рядок в процедуру Form_Unload():

Private Sub Form_Unload(Cancel As Integer)

Set sf = Nothing

End Sub

7. Клацніть на рядку Projectl у вікні проекту і задайте властивості Name значення Перевірка.

Збережете і Запустіть проект. На перший погляд, наше застосування не справляє особливого враження. Спробуйте змінити розміри форми і змістити її в кут екрану, після чого натисніть кнопку [х] і поверніться в IDE. Запустіть додаток наново. Якщо усе було зроблено вірно, форма знаходитиметься в тому ж місці і матиме ті ж розміри, які вона мала на момент закриття. Повторюючи кроки 1-5, ви зможете користуватися "інтелектуальними формами" у своїх застосуваннях.

А тепер я розповім про один інструмент, який спрощує процес візуального проектування і створення класів.

Використання Class Builder

Коли я уперше працював над створенням класу, мене переслідувала думка: "Повинен існувати простіший шлях"! На щастя для вас і для мене, він дійсно існує. У комплект Visual Basic входить Class Builder - утиліта для візуального проектування класів. Class Builder (мал. 4.10) дозволяє розробити структуру класу в графічному режимі і вставити основу коду в проект. Утиліта Class Builder оформлена у вигляді надбудови (add - in). Це означає, що утиліта не входить в стандартну конфігурацію IDE, а підключається як зовнішнє доповнення. Як видно з мал. 4.10, вікно Class Builder нагадує вікно проекту - зліва знаходиться ієрархічне дерево, в основі якого знаходиться поточне ім'я проекту. Рядок меню, як і розташована під нею панель інструментів, виглядає цілком стандартно. Ми розглянемо роботу з Class Builder на практичному прикладі:

1. Виконаєте команду Add - Ins > Ad - In Manager.

2. У діалоговому вікні Add, що відкрилося, - In Manager (мал. 4.11) двічі клацніть в рядку VB Class Builder Utility, щоб завантажити утиліту в IDE.

3. Закрийте діалогове вікно кнопкою ОК.

Після того, як утиліта Class Builder буде додана в IDE, нею можна користуватися для створення класів. У наступному прикладі Class Builder використовується для створення простого класу Person. Незважаючи на відносну простоту, цей клас наочно показує, як працювати з цією корисною утилітою.

1. Створіть новий проект командою File > New Project. У діалоговому вікні New Project виберіть тип проекту Standard EXE і натисніть кнопку ОК.

2. Запустіть Class Builder командою Add - Ins > Class Builder Utility.

3. Створіть новий клас командою File > New > Class з меню Class Builder. На екрані з'являється діалогове вікно Class Module Builder.

4. Введіть ім'я класу Person в поле Name. У списку Based On залиште вибране за умовчанням значення (New Class). Натисніть кнопку ОК, щоб створити клас.

5. Натисніть кнопку Add New Property to Current Class на панелі інструментів. На екрані з'являється діалогове вікно Property Builder (мал. 4.12).

6. Введіть в поле Name рядок PersonName. В даному прикладі ця властивість буде використана для ідентифікації об'єктів класу.

7. Виберіть рядок String в списку Data Type.

8. Залиште встановленим перемикач Public Property (Let Get Set). Щоб властивість входила в інтерфейс класу, воно має бути відкритим (Public).

9. Натисніть кнопку ОК, щоб завершити створення властивості.

10. Створіть нову подію в класі Person - для цього натисніть кнопку Add New Event to Current Class на панелі інструментів (кнопка із зображенням жовтої блискавки). На екрані з'являється діалогове вікно Event Builder (мал.4.13).

11. Введіть рядок Say в поле Name. Наша "людина" (Person) дійсно "заговорить"!

12. Для події треба створити параметр, щоб "людина" знала, що він повинен сказати. Натисніть кнопку Add a New Argument (кнопка зі знаком "плюс").

13. На екрані з'являється чергове діалогове вікно. У нім вам пропонується ввести ім'я параметра. Введіть рядок Sentence в поле Name.

14. Виберіть в списку Data Type рядок String і закрийте діалогове вікно кнопкою ОК.

15. Закрийте діалогове вікно Event Builder кнопкою ОК. У класі Person з'являється подія Say.

16. Додайте в клас Person метод WhoAreYou. Він не має параметрів.

17. Натисніть кнопку ОК, щоб включити метод в клас. Вікно Class Builder повинне виглядати так, як показано на мал. 4.14.

Мал. 4.14. Клас Person з властивостями, подіями і методами.

18. Базова структура класу Person готова. Включите її в проект Visual Basic командою File > Update Project або клавішами Ctrl+S.

19. Закрийте вікно Class Builder командою File > Exit.

Після невеликої паузи в проекті з'являється новий клас. Залишається лише додати код в базову структуру, щоб зробити його функціональним. Якщо заглянути в код властивості PersonName (процедури Property Let і Property Get), з'ясовується, що Class Builder згенерував шаблон властивості за нас. Залишається лише написати код, який виконуватиме конкретне завдання, - ідентифікувати нашу "людину".

Вставте наступний фрагмент в процедуру WhoAreYou():

Public Sub WhoAreYou()

RaiseEvent Say ("Moe ім'я" & mVarPersonName)

End Sub

Зверніть увагу: уся процедура складається з одного рядка. Щоб ініціювати подію, необхідно викликати в класі команду RaiseEvent. У нашому випадку ініціюється подія Say. Для передачі інформації можна було також скористатися функцією, але я хочу привчити вас до роботи з подіями. Вони згодяться вам пізніше, при розробці додатків, керованих подіями. А зараз ми доповнимо форму Form1 кодом для тестування класу Person:

1. Двічі клацніть на рядку Form1 у вікні проекту, щоб активізувати форму. Потім двічі клацніть на формі, щоб відкрити вікно програми.

2. Вставте наступний фрагмент в секцію(Declarations) форми:

Option Explicit

Private WithEvents p As Person

3. Для виведення інформації ми скористаємося вікном повідомлення. Вставте в процедуру події р_Sау() наступний фрагмент:

Private Sub p_Say(Sentence As String)

MsgBox Sentence

End Sub

4. Залишається лише написати код, в якому створюватиметься наш об'єкт,:

Private Sub Form_Load()

Set p = New Person

p.PersonName = "Джон Доу"

p.WhoAreYou

Set p = Nothing

End

End Sub

Звичайно, змінному р. PersonName можна присвоїти довільне ім'я.

5. Запустіть програму клавішею F5.

Звичайно, утиліта Class Builder має і інші можливості, проте більшість з них не вимагають пояснень, а найважливіші ми розглянули. Не шкодуйте часу і поекспериментуйте з вашими власними класами - як простими, так і складними. Практика - вірний шлях до досконалості. На сторінках цієї книги ми ще неодноразово зустрінемося з класами. Ваших знань в області модулів і класів цілком вистачить для самостійної роботи. Ви повинні неодмінно освоїти ці концепції, оскільки програмні модулі "склеюють" різні частини вашого застосування і об'єднують форми і елементи для вирішення корисних завдань.

Що нового ми дізналися?

  •  Користуватися модулями для створення коду форм і елементів.
  •  Створювати власні процедури і функції.
  •  Передавати параметри процедурам і функціям.
  •  Проектувати прості класи.
  •  Відкривати властивості і методи за допомогою ключового слова Public.
  •  Ізолювати властивості і методи за допомогою ключового слова Private.
  •  Створювати модулі класів.
  •  Створювати класи за допомогою утиліти Class Builder.


5. Створення і використання меню і панелей інструментів

  •  Для чого потрібні меню і панелі інструментів
  •  Створення і використання меню
  •  Робота з редактором меню
  •  Проектування структури меню
  •  Створення панелей інструментів
  •  Використання нестандартних елементів в панелях інструментів
  •  Зображення і списки зображень
  •  Вдосконалені панелі

У більшості Windows - програм користувачі можуть виконувати необхідні дії за допомогою меню і панелей інструментів. Оскільки ці компоненти є невід'ємною частиною багатьох застосувань, в цій главі детально розглядається процес їх створення і використання.

Для чого потрібні меню і панелі інструментів

Ви напевно встигли помітити, що більшість Windows - додатки мають стандартний інтерфейс. Майже в кожному застосуванні є заголовок і віконне меню, а розміри головного вікна можна змінювати мишею. Крім того, в багатьох застосуваннях є меню і панелі інструментів, що спрощують роботу з нестандартними функціями програм. Сам Visual Basic містить меню і панелі інструментів, що полегшують вашу роботу (мал. 5.1).

Мал. 5.1. Меню і панелі інструментів Visual Basic.

Меню відкриває доступ до різних, іноді досить неочевидним, можливостям додатка. Команди в нім можна блокувати і розблоковувати, позначати і навіть відображувати залежно від контексту об'єкту. Крім того, можна створити список вікон - меню з командами для переходу до дочорнимо MDI - формам поточної форми. У середовищі Visual Basic зустрічаються приклади меню, закріплених за іншими елементами, а також контекстних і таких, що розкриваються безпосередньо над об'єктом. У цьому уроці нам належить створити перше меню (див. розділ "Створення меню в редакторові меню").

Панелі інструментів, у свою чергу, призначені для швидкого виклику команд меню. Наприклад, вам напевно доводилося бачити панелі з кнопками Cut, Copy і Paste. Користувачеві набагато простіше натиснути кнопку, чим виконувати команду Edit > Сміттю. Панелі інструментів опиняються ще зручніше в тих ситуаціях, коли команди приховані глибоко у вкладених підміню. У цьому уроці ви навчитеся створювати панелі інструментів (див. розділ "Створення панелей інструментів").

Працюючи над великим застосуванням, неодмінно подумайте, як найефективніше організувати структуру меню і панелей інструментів.

Об'єкт меню

Як згадувалося в попередньому розділі, меню представляє функції додатка в чіткому і, як правило, зручному для користувача виді. Для створення меню в Visual Basic застосовується елемент меню. Він нічим не відрізняється від будь-якого іншого елементу, що знаходиться на формі, за винятком того, що ви не знайдете його на панелі елементів. Замість цього треба запустити редактор меню командою або кнопкою на панелі інструментів Visual Basic і розробити меню за допомогою цього інструменту.

Елемент меню має декілька властивостей і підтримує одну подію, але у нього немає жодного методу. Щоб помістити елемент меню на форму, слід зробити форму, що цікавить вас, активною. Виділивши її, виконаєте команду Tools > Menu Editor або Запустіть редактор меню кнопкою на панелі інструментів (мал. 5.2).

Саме у редакторові відбувається конструювання меню. Меню складається з одного або декількох заголовків верхнього рівня. Кожен заголовок складається з однієї або декількох команд (наприклад, Exit). У меню можна навіть включати роздільники, щоб згрупувати взаємозв'язані команди. В результаті замість одного елементу меню у вас з'являється ціла серія. Кожен заголовок меню і кожна команда (у тому числі і роздільники) є окремими елементами з окремими наборами властивостей і подією Click.

Властивості меню

Перераховані далі властивості доступні в режимі конструювання, проте працювати з ними доводиться через редактор меню, а не через вікно властивостей.

Найважливіші властивості (виділені напівжирним шрифтом) такі:

Appearance

Index

Tag

Caption

Name

Visible

Checked

NegotiatePosition

WindowList

Enabled

Parent

 

HelpContextID

Shortcut

 

  •  Властивість Caption визначає текст, що відображується в меню. Символ "амперсенд" (&) в назві команди задає клавішу прискореного виклику.
  •  Властивість Checked поміщає (чи видаляє) маркер -"галочку" поряд з командою. З його допомогою буває зручно перемикати стан команди. Задаючи значення властивості Checked, можна "включати" або "вимикати" команди меню під час виконання програми.
  •  Властивості Enabled іноді привласнюється значення False, якщо в поточному контексті команда меню не має сенсу. Наприклад, команду Save можна заблокувати до тих пір, поки користувач не введе які-небудь дані. Значення властивості Enabled також можна змінювати під час виконання програми.
  •  Замість того щоб блокувати непотрібну команду меню, можна скористатися властивістю Visible і приховати її - з іншого боку, блокування команд викликає менше непорозумінь.
  •  Властивість Name, як завжди, повинно визначатися в першу чергу. За поширеною угодою, імена елементів меню починаються з префікса mnu.
  •  Властивість Shortcut визначає акселератор - альтернативний спосіб виклику команди з клавіатури. Не слід плутати акселератор з клавішами прискореного виклику (які створюються за допомогою символу "амперсенд"). Для виклику акселератора зазвичай використовуються службові клавіші Ctrl і Alt у поєднанні з іншими клавішами (наприклад, F1).

Меню, створені в редакторові, можна відкрити на формі в режимі конструювання. Щоб проглянути код процедури події Click, клацніть на команді меню в режимі конструювання. Існує і інший спосіб - виберіть ім'я елементу меню із списку Object, що розкривається, у вікні програми. Проглянути властивості елементу меню також нескладно, для цього слід ще раз відкрити редактор меню і вибрати команду меню із списку, розташованого в нижній частині вікна редактора. Властивості елементів меню можна також проглянути, вибираючи їх імена із списку, що розкривається, у верхній частині вікна властивостей.

Подія Click

Це єдина подія, підтримуване елементами меню; воно також генерується при використанні клавіш прискореного виклику і акселераторів. Дії, що виконуються при виборі команди меню, програмуються в процедурі події Click.

Кожен заголовок меню теж має подію Click. Зазвичай ця подія ігнорується - коли користувач клацає на заголовку, він просто хоче відкрити меню. Проте досвідчені програмісти на Visual Basic часто використовують цю подію у поєднанні з властивістю Index для динамічного додавання або видалення команд з меню, що відкривається. Динамічні меню насправді є масивами елементів меню. Усі команди меню мають однакову структуру і знаходяться в одному і тому ж блоці пам'яті. Отже, замість того щоб звертатися до команди меню по імені, ви можете посилатися на неї по індексу в масиві. Детальніша інформація про масиви приведена в уроці 7, "Типи даних".

Методи меню

Елементи меню не мають ніяких методів, тому ми рухаємося далі і переходимо до створення власних меню.

Створення меню в редакторові меню

Велика частина роботи із створення меню виконується в редакторові меню. Запустіть його командою Tools > Menu Editor (мал. 5.2). Зверніть увагу на наступні моменти:

  •  Як неважко здогадатися, значення властивостей Caption і Name вводяться в перших двох текстових полях редактора меню.
  •  Ви також можете вибрати акселератор для поточного елементу меню.
  •  Прапорці Checked, Enabled і Visible зазвичай залишаються в тому стані, в якому вони знаходяться за умовчанням.
  •  Кнопки із стрілками вліво і управо призначені для зміни відступів елементу меню. Заголовки меню вирівнюються по лівому краю списку в нижній частині вікна. Команди меню зазвичай забезпечуються одиничним відступом. Другий відступ створює команду підміню, що відкривається попередньою командою (каскадні меню).
  •  Кнопки із стрілками вгору і вниз змінюють порядок дотримання заголовків і команд меню в списку.
  •  Число, введене в поле Index, дозволяє перетворити меню на масив елементів. Така можливість може згодитися для створення списку файлів (на кшталт того, який виводиться в нижній частині меню File багатьох застосувань), що нещодавно відкривалися.
  •  В поле HelpContextID вводиться довідковий контекст - унікальний ідентифікатор, що зв'язує меню з довідковим файлом. Детальніші відомості про довідкові файли приведені в уроці 13, "Створення і використання довідкових файлів".
  •  Поле NegotiatePosition визначає те, що має в розпорядженні меню верхнього рівня при розгортанні дочірньої форми MDI, коли обидві форми повинні спільно використовувати рядок меню батьківської форми MDI.

При створенні заголовка або команди меню потрібно як мінімум визначити значення властивостей Caption і Name. Спочатку створюється заголовок, а потім в нього додаються команди. Усі команди меню повинні мати одиничний відступ. Потім вводиться наступний заголовок і команди, що входять в нього, і т. д. Для додавання чергового об'єкту (заголовка або команди) натисніть кнопку Next. Якщо ви пропустите який-небудь об'єкт, введіть його у кінці списку і перемістите в потрібну позицію кнопкою із стрілкою вгору або виділите об'єкт, розташований після потрібної позиції, і натисніть кнопку Insert. Об'єкти віддаляються кнопкою Delete. Щоб включити в меню роздільник, занесіть в полі властивості Caption символ "дефіс" (-). Проте ви зобов'язані задати значення властивості Name для роздільника. Відступ роздільника повинен співпадати з відступом команд, що розділяються.

У іменах заголовків і команд меню використовується префікс mnu. Наприклад, заголовок меню File зазвичай має ім'я mnuFile. Імена команд, як правило, включають ім'я заголовка; наприклад, команда Exit з меню File отримує таким чином ім'я mnuFileExit, а перший роздільник - mnuFileSepl. Напевно, імені типу mnuExit для команди Exit недостатньо - при читанні або відладці коду буде незрозуміло, до якого меню належить ця команда. А якщо вказати додатковий префікс File, усе стане ясно.

Давайте створимо просте меню, щоб потренуватися в роботі з цим об'єктом:

1. Створіть новий проект командою File > New Project.

2. Виберіть тип проекту Standard EXE.

3. Клацніть на формі Form1, щоб зробити її активною.

4. Запустіть редактор меню командою Tools > Menu Editor або поєднанням клавіш Ctrl+E.

5. Створіть меню File - введіть рядок &File в поле Caption і рядок mnuFile в полі Name.

6. Натисніть кнопку Next, щоб перейти до наступної команди меню.

7. Наступна команда повинна знаходитися в меню File, тому натисніть кнопку із стрілкою управо, щоб створити відступ потрібного розміру.

8. Задайте властивості Caption наступної команди значення &Exit, а властивості Name - значення mnuFileExit.

9. Перше меню готове. Створіть меню Edit і Help разом з командами, задайте перераховані нижче значення властивостей. Після введення чергової властивості Name натискайте кнопку Next:

Меню Edit:

Caption:

Name:

&&Edit

mnuEdit

Команди меню Edit:

Caption:

Name:

u&t &Copy &Paste

mnuEditCut mnuEditCopy mnuEditPaste

Меню Help:

Caption:

Name:

&&Help

mnuHelp

Команди меню Help:

Caption:

Name:

&&About

mnuHelpAbout

Зразковий вид редактора меню з готовим меню показаний на мал. 5.3. Ви можете внести будь-які виправлення, клацнувши на потрібному об'єкті в списку і змінивши його властивості. Коли меню набере вигляду, зображеного на мал. 5.3, натисніть кнопку ОК. Тепер можна подивитися, як виглядає і поводиться наше меню. Якщо клацнути в меню Edit, з'являється перелік команд цього меню (мал. 5.4). Якщо клацнути на команді Paste, ви потрапляєте прямо в процедуру події mnuEditPaste_Click() у вікні програми. У ній слід запрограмувати вставку інформації з буфера.

Виберіть з тільки що створеного меню команду File > Exit, щоб перейти до процедури mnuFileExit_Click(). Включите в неї оператор End і Запустіть додаток. Усі меню повинні правильно розкриватися і закриватися, а команда Exit - завершувати роботу додатка.

Проектування меню

Windows - операційна система, що використовує графічний інтерфейс користувача (GUI). Така назва обумовлена тим, що в основному доводиться працювати з графікою, формами і значками, а не вводити текстові команди. Саме GUI робить систему і її програми зручною для користувача. Замість того щоб запам'ятовувати загадкові команди з численними параметрами (ключами), ви запам'ятовуєте зручні графічні позначення. Щоб графічний інтерфейс міг використовуватися ефективно, він має бути стандартним. Усі елементи і форми схожого призначення повинні виглядати і працювати схожим чином.

Перш ніж зайнятися панелями інструментів, давайте розглянемо один аспект проектування Windows -приложений, якому часто не приділяють належної уваги, - стандарти. При проектуванні меню ви повинні по можливості дотримуватися існуючих стандартів. Хоча детальний розгляд стандартів GUI виходить за рамки цієї книги, бажано із самого початку встати на правильний шлях.

Проектуючи меню, прагніть створювати їх за зразком стандартних Windows -приложений. Хоча вам навряд чи вдасться знайти два застосування з однаковими меню, ви можете скопіювати загальну структуру іншого меню, щоб ваше застосування було ближче до загальноприйнятих норм.

Можливо, ви встигли помітити, що меню File майже завжди розташоване в лівому краю рядка меню, а меню Help - в правому. Зберігайте таке розташування у своїх застосуваннях. Меню Edit майже завжди розташоване праворуч від меню File, a меню Window - зліва від Help. Якщо у вашій програмі будуть присутній меню Edit і Window, збережете цей порядок. Досвідчені користувачі звикають викликати меню певним рухом миші, і перестановка меню перешкодить їм працювати. Оскільки структура меню підкоряється певним стандартам, клавіші прискореного виклику і акселератори також мають бути стандартними. Наприклад, в команді Cut підкреслюється буква t Першим спонуканням було б поставити амперсенд, але в цьому випадку користувач, який захоче скопіювати текст в буфер, буде спантеличений несподіваним зникненням половини свого документу! Щоб дізнатися, які поєднання клавіш слід використовувати, Запустіть будь-яке Windows -приложение і вивчите його меню.

Створення панелей інструментів

Панелі інструментів виявляються надзвичайно корисним доповненням до меню - вони прискорюють виклик команд.

При проектуванні панелей інструментів також слід дотримуватися стандартних рішень. Бажано використовувати кнопки стандартного розміру або стандартні значки, щоб користувачі могли розібратися з функціями кнопок, не удаючись до документації або довідкової системи. Структуру панелей інструментів, як і структуру меню, можна запозичувати з інших застосувань. Давайте створимо панель інструментів, яка удосконалить меню з розділу "Створення меню в редакторові меню". Перш ніж починати роботу з панеллю інструментів, необхідно помістити її на панель елементів.

1. Якщо потрібний елемент відсутній, клацніть на панелі елементів правою кнопкою миші і виберіть в контекстному меню команду Components. Коли на екрані з'явиться діалогове вікно Components, Встановіть прапорець поряд з рядком Microsoft Windows Common Controls 6.0.

2. Помістите елемент панелі інструментів на форму. Задайте властивості Name значення tbrToolbaг, а властивості Align - значення 1 - vbAlignTop. 3. У вікні властивостей клацніть на рядку (Custom).

4. У діалоговому вікні Property Pages, що відкрилося, перейдіть на вкладку Buttons.

Зверніть увагу - панелі інструментів зазвичай злегка відсовуються від лівого краю екрану. Щоб ваше застосування виглядало так само, вставте роздільник перед першою кнопкою.

5. Натисніть кнопку Insert Button, щоб помістити першу кнопку на панель інструментів.

6. Відкрийте список Style і виберіть з нього рядок 3 - tbrSeparator (мал. 5.5).

Мал. 5.5. Завдання властивості Style.

Створення кнопок на панелі інструментів

На панель інструментів необхідно помістити кнопки:

1. Натисніть кнопку Insert Button, щоб додати нову кнопку. Присвойте властивості Key значення New, а властивості Style - значення 0 - tbrDefault.

2. Знову натисніть Insert Button і створіть ще одну кнопку. Задайте властивості Key значення Open, а властивості Stу 1е - значення 0 - tbrDefault.

3. Востаннє натисніть Insert Button і додайте на панель останню кнопку. Задайте властивості Key значення Save, а властивості Style - значення 0 - tbrDefault.

4. Натисніть кнопку OK, і ви побачите готову панель інструментів.

Якщо усе було зроблено правильно, вона має бути схожа на зображення на мал. 5.6. Зверніть увагу на роздільник в лівій частині панелі - він створює необхідний відступ.

Мал. 5.6. Форма із панеллю інструментів.

Створення малюнків на кнопках

Тепер на кнопки слід помістити значки. На жаль, це неможливо зробити простим завданням властивості Picture. Доведеться зв'язати панель із списком зображень. Це робиться так:

1. Додайте на форму список зображень і задайте його властивості Name значення imlToolbar. Відповідний елемент з'явився на панелі елементів, коли ви додали Microsoft Common Control 6.0.

2. Відкрийте діалогове вікно Property Pages, клацаючи на рядку Custom у вікні властивостей.

3. У вікні Property Pages перейдіть на вкладку Images, щоб приступити до додавання значків.

4. Список зображень в нашому прикладі починатиметься із зображення пустої сторінки, зазвичай відповідного команді New. Натисніть кнопку Insert Picture.

5. Виберіть файл New.bmp з каталогу Graphics\Bitmaps\Tblr_w95.

6. Коли в списку з'явиться порожня сторінка, клацніть на ній, щоб наступний значок був вставлений після неї.

7. Натисніть кнопку Insert Picture, відкрийте файл Ореn.bmp. Коли значок з'явиться в списку, клацніть на зображенні жовтої теки.

8. Ще раз натисніть кнопку Insert Picture і виберіть файл Save.bmp. Список зображень набирає вигляду, показаного на мал. 5.7. Закрийте діалогове вікно Property Pages кнопкою ОК.

Мал. 5.7. Вставка растрових зображень в список зображень.

9. Виділите tbrToolbar і знову відкрийте діалогове вікно Property Pages, вибравши рядок Custom у вікні властивостей.

10. На вкладці General задайте властивості ImageList значення imlToolbar (мал. 5.8).

Мал. 5.8. Зв'язування панелі інструментів із списком зображень.

11. Перейдіть на вкладку Buttons.

12. Задайте властивості Index значення 2, а властивості Image - значення 1. Тим самим ви поміщаєте значок уперше позиції списку (порожній документ) на другу кнопку. Пам'ятайте, що першою кнопкою є роздільник.

13. Задайте властивості Index значення 3, а властивості Image - значення 2. Значок у вигляді теки поміщається на кнопку Open.

14. Задайте властивості Index значення 4, а властивості Image - значення 3. Значок у вигляді дискети поміщається на кнопку Save.

15. Натисніть кнопку ОК. Панель інструментів повинна виглядати так, як показано на мал. 5.9.

Проектування панелі закінчене, на кнопках з'явилися значки, але це ще не усе. Необхідно додати код обслуговування панелі - без нього програма не знатиме, яка кнопка натиснута користувачем. Двічі клацніть на панелі інструментів, щоб відкрити процедуру події tbrToolbar_ButtonClick(). Звернете увагу на параметр Button - він визначає номер натиснутої кнопки.

Додайте в процедуру події наступний фрагмент:

Private Sub tbrToolbar_ButtonClick(ByVal Button As ComctlLib.Button)

Select Case Button, Key

Case Is = "New"

MsgBox "Натиснута кнопка New"

Case Is = "Open"

MsgBox "Натиснута кнопка Open"

Case Is = "Save"

MsgBox "Натиснута кнопка Save"

End Select

End Sub

Погляньте на оператор Select Case, використовуваний для визначення натиснутої кнопки. Він трохи схожий на оператор If..Then, проте має більшу гнучкість при обробці списку умов. Як видно з приведеного вище фрагмента, замість трьох блоків If..Then використовуються три оператор Case Is. Під час створення панелі інструментів не забудьте правильно задати значення властивості Key - по ньому ви зможете визначити, яка кнопка була натиснута.

Познайомившись з основами створення панелей інструментів, можна переходити до нового компонента, який поставляється з Visual Basic 6, - вдосконаленій панелі (CoolBar). Саме цей компонент був використаний в панелях інструментів середовища Visual Basic. Збережете свій проект, продовжуйте читати - і ви навчитеся користуватися цим чудовим інструментом у своїх застосуваннях!

Використання вдосконаленої панелі

Один з нових елементів, що входять в комплект Visual Basic 6, - вдосконалена панель (CoolBar). Цей елемент зустрічається в програмах сімейства Microsoft Office (мал. 5.10), Internet Explorer і IDE VisualBasic. Вдосконалена панель є закріплюваним контейнером, в якому можуть знаходитися інші елементи - панелі інструментів, комбіновані поля і написи. Найхарактерніша риса цього елементу - кнопки, які "підводяться", якщо затримати над них покажчик миші (схожа можливість передбачена в деревах і табличних списках).

Вдосконалена панель складається з однієї або декількох смуг (bands), причому в кожній смузі може знаходитися один елемент.

Рис.5.10. Вдосконалена панель.

На жаль, документація Microsoft по цьому елементу дуже бідна. Та все ж я відшукав шлях, який спростить навчання. Давайте спробуємо:

1. Відкрийте проект з попереднього розділу, якщо це не було зроблено раніше. Ми відновимо його для роботи з вдосконаленою панеллю.

2. Клацніть на панелі елементів правою кнопкою миші і виберіть в контекстному меню команду Components.

3. Прокрутите список в діалоговому вікні Components і Встановіть прапорці поряд з рядками Microsoft Windows Common Controls 6.0 і Microsoft Windows Common Controls - 3 6.0. Елемент вдосконаленої панелі відноситься до Common Controls - 3. Нам також знадобляться елементи Common Controls 6.0 для роботи з панеллю інструментів і списком зображень.

4. Натисніть кнопку OK, щоб додати елементи на панель. 5.Помістите елемент вдосконаленої панелі на форму frmMain.

6. Клацніть на елементі панелі інструментів, щоб зробити його активним.

7. Натисніть Ctrl+X, щоб вирізувати елемент з форми.

8. Клацніть на вдосконаленій панелі і вставте в нього панель інструментів клавішами Ctrl+V.

9. У вікні властивостей задайте властивості Name вдосконаленої панелі значення сbrСоо 1Ваг, а властивості Align - значение1 - Align Top.

10. Клацніть в рядку (Custom), щоб викликати діалогове вікно із сторінками властивостей вдосконаленої панелі (мал. 5.11).

Мал. 5.11. Вкладка General в сторінках властивостей вдосконаленої панелі.

11. На вкладці General нам робити практично нічого, тому клацніть на вкладці Bands.

На рис 5 12 показані загальні властивості елементу вдосконаленої панелі Щоб панель інструментів добре виглядала, її необхідно зробити дочірнім елементом першої смуги вдосконаленої панелі.

12. Простежите за тим, щоб в полі Index було вказане значення 1, і виберіть із списку Child рядок tbrToolbar.

13. Закрийте діалогове вікно властивостей кнопкою ОК.

Наша панель інструментів (мал. 5.13) виглядає досить дивно - вона виводиться над вдосконаленою панеллю, а не на ній. Крім того, усі кнопки знаходяться в "піднятому" стані. Щоб панель виводилася правильно, нам доведеться змінити деякі з її властивостей.

14. Натисніть кнопку на панелі інструментів, щоб зробити її активним елементом.

15. Двічі клацніть в рядку (Custom) вікна властивостей, щоб викликати діалогове вікно із сторінками властивостей цього елементу.

16. На вкладці General задайте властивості Арреаrаnce значення 0 - ccFlat. Haтисніть кнопку Apply, і ви побачите, як панель інструментів "зануриться" у вдосконалену панель.

5.12. Вкладка Bands в сторінках властивостей вдосконаленої панелі.

17. ЗaдaйтecвoйcтвyStyleзнaчeння1 - tbrFlat. Натисніть кнопку Арр1у кнопки "занурюються" в панель інструментів.

18. Закрийте діалогове вікно властивостей кнопкою ОК.

19. Запустіть проект клавішею F5. Проведіть покажчиком миші над кнопками - ви побачите, як вони "піднімаються" з панелі інструментів (мал. 5.14).

Мал. 5.14. Вдосконалена панель у дії.

Напевно, ви помітили, що у вдосконаленій панелі залишилися дві порожні смуги. Оскільки вдосконалена панель є контейнером для елементів-смуг, а смуги можуть містити інші елементи, нашу вдосконалену панель можна доповнити!

1. Зупините роботу програми кнопкою [x] чи командою File > Exit з її меню.

2. Помістите на вдосконалену панель комбіноване поле. Переконаєтеся в тому, що поле знаходиться саме на панелі, а не на формі.

3. Помістите прапорець на вдосконалену панель. Задайте його властивості Caption значення Встанови мене!

4. Виділите панель cbrCoolbar і відкрийте діалогове вікно із сторінками властивостей, клацаючи на рядку (Custom).

5. Перейдіть на вкладку Bands і введіть в поле Index значення 2 - для цього досить клацнути на кнопці із стрілкою / що знаходиться праворуч від поля. В результаті сторінка властивостей відноситиметься до другої смуги вдосконаленої панелі.

6. Виберіть в списку Child рядок Combo1, а в полі Caption введіть рядок Шрифт. 1. Застосуєте внесені зміни кнопкою Apply.

8. Перейдіть до третьої смуги (вкажіть 3 в полі Index). Виберіть в списку Child рядок Checkl.

9. Закрийте діалогове вікно кнопкою ОК.

10. Запустіть проект і простежите за внесеними змінами.

Зверніть увагу - тепер ви можете захопити мишею корінець (вертикальні риски в лівій частині смуги) і перемістити смугу в потрібне місце. Втім, це лише одна з приємних можливостей, властивих вдосконаленим панелям.

От і все, що я хотів розповісти про меню і панелі інструментів! Пам'ятайте, меню і панелі інструментів надають простий і зручний шлях для розширення можливостей додатка. Стандартні меню дають вашій програмі перевагу перед іншими, невдало спроектованими застосуваннями. З вашим застосуванням зручніше працюватиме, і користувачі напевно це оцінять.

Що нового ми дізналися?

  •  Визначати, коли слід користуватися меню і панелями інструментів.
  •  Створювати меню за допомогою редактора.
  •  Проектувати меню по аналогії з іншими Windows - додатками.
  •  Створювати панелі інструментів за допомогою спеціального елементу.
  •  Створювати зображення на кнопках за допомогою списку зображень.
  •  Писати код для обслуговування панелей інструментів.
  •  Об'єднувати елементи у вдосконаленій панелі.


Урок 6. Логіка і послідовність виконання програми

  •  Як "думає" комп'ютер?
  •  Логічні оператори
  •  Порівняння
  •  Ухвалення рішень в програмі
  •  Виконання дій, що повторюються

Ви досить добре уявляєте собі, як створити візуальне застосування з компонентів, що поставляються разом з Visual Basic. Тепер вам належить дізнатися, як змусити ці компоненти спільно працювати.

Урок починається з короткого викладу основ комп'ютерної логіки. Потім ми познайомимося з умовними операторами, що дозволяють програмувати складніші алгоритми з ухваленням рішень. Нарешті, ви навчитеся програмувати дії, що повторюються, за допомогою різноманітних циклів.

Як "думає" комп'ютер?

Багато людей, погано знайомих з комп'ютерами, розділяють загальну помилку - вони вважають, що комп'ютери розумні. Ніщо не може бути далі від істини. Комп'ютер в самому кращому випадку розумний в тій же мірі, що і програміст. Комп'ютер може прийняти рішення, але для цього його доведеться запрограмувати. Код ухвалення рішень значною мірою обмежується тими рішеннями, які програміст може передбачити у своєму застосуванні. Логічні порівняння потрібні для виконання комп'ютером корисних завдань. Вони використовуються при роботі програм, обробці помилок, роботі з файлами і в усіх інших операціях. Комп'ютерна програма приймає рішення по тих же принципах, що і людина: вона формулює деяку умову і обчислює його, щоб отримати результат. Потім вона бере результат і порівнює його з набором заздалегідь заданих правил, щоб дізнатися, як їй діяти далі. Наприклад, банкомат повинен визначити, чи правильно введений код клієнта. Для цього він порівнює введений код з базою цих відомих номерів. Якщо знайдений номер співпадає з профілем клієнта в банківській базі даних, клієнт дістає доступ до рахунку. Аналогічним чином приймаються практично будь-які комп'ютерні рішення.

Логічні оператори

Щоб ваші застосування "порозумнішали", необхідно передусім зрозуміти, як комп'ютер обробляє інформацію.

Хочете - вірте, хочете - ні, але уся інформація в комп'ютері складається з одиниць і нулів, званих двійковими числами. Будь-які математичні або логічні операції можуть бути виражені на мові двійкової логіки. Математичні операції виконуються в двійковій системі - це означає, що якщо результат перевищує 1, він знову скидається в 0, а до наступного по порядку біта додається 1. Ми з вами звикли вважати в десятковій системі - якщо розряд виявляється більше 9, він обнулюється, а наступна цифра збільшується на 1 і т. д. Оскільки комп'ютер працює з нулями і одиницями, він може використовувати їх для представлення умов "істина" і "брехня". Двійковий нуль означає умову "брехня", а 1 - умова "істина". На цьому принципі побудована логічна алгебра. Використовуючи різні комбінації виразів і логічних операторів, можна виконувати різноманітні складні дії - виводити графіку високого розділення, створювати спеціальні ефекти і здійснювати шифрування. З найближчих розділів ви дізнаєтеся про п'ять логічних операторів: AND, EQV, OR, XOR і NOT.

Логічний оператор AND

Логічний оператор AND використовується для логічного об'єднання (кон'юнкції) двох виразів. Простіше кажучи, програма перевіряє, що обидва вираження істинні одночасно. Згадаєте приклад з банкоматом. Якщо на вашому рахунку є гроші, для їх отримання вам знадобляться діюча магнітна карта і правильний код. Якщо хоч би одна з цих умов не буде виконано, грошей ви не отримаєте. Якщо обидві умови істинні, ви зможете сходити в кафе і ку-**пити собі каву з пампушкою.

Логічний оператор AND працює дуже просто. Якщо обидва вираження істинні, результат також є істинним. Якщо хоч би один з виразів помилково, результат теж буде помилковим. У таблиці. 6.1 перераховані деякі комбінації виразів і результати, отримані при їх об'єднанні операцією AND.

Таблиця 6.1. Результати виконання логічної операції AND для двох виразів

Вираз 1

Вираз 2

Результат

Істина

Істина

Істина

Істина

Брехня

Брехня

Брехня

Істина

Брехня

Брехня

Брехня

Брехня

Цей логічний оператор часто використовується в нетривіальних графічних алгоритмах. Якщо в порозрядній операції біт рівний 1, говорять, що він встановлений; вважається, що цей біт має значення "істина". Якщо біт дорівнює 0, він вважається "помилковим". При виконанні порозрядних логічних операцій відбувається логічне порівняння відповідних бітів, а результуючі значення сумуються для отримання числа.

Щоб краще зрозуміти, як це робиться, погляньте на таблицю. 6.2. Ми беремо два числа, 217 і 106, і об'єднуємо їх логічною операцією AND. Бітам в розрядах від 128 до 1 в двійковій математиці відповідають біти від 7 до 0. Оскільки двійкові операції виконуються по модулю 2, можна сказати, що перший біт дорівнює 2°, або 1. Другий біт дорівнює 21, або 2. Третій біт дорівнює 22, або 4. Аналогічно визначаються значення усіх інших бітів.

Можливо, ви звернули увагу на те, що біти нумеруються справа наліво. Річ у тому, що в двійкових операціях старший біт завжди знаходиться ліворуч, а молодший - справа. Крім того, найправіший біт завжди вважається нульовим. Така нумерація спрощує представлення чисел в двійковій системі. У наступній таблиці представлені значення розрядів 8-бітових чисел, які найчастіше використовуються в обчисленнях. Біти таких чисел нумеруються від 0 до 7.

Таблиця 6.2. Застосування логічної  операції AND для двох чисел

Номер біта

7

6

5

4

3

2

1

0

Двійкове значення

27

26

25

24

23

22

21

Ціле значення

128

64

32

16

8

4

2

1

Вираження 1

1

1

0

1.

1

0

0

1

217

Вираження 2

0

1

1

0

1

0

1

0

106

Вираз 1 AND Вираз 2

0

1

0

0

1

0

0

0

72

Якщо скласти усі значення, представлені одиницями в четвертому рядку цієї таблиці (128+64+16+8+1), вийде 217. Підсумовування значень для п'ятого рядка дає 106. Якщо об'єднати значення кожної пари бітів операцією AND, ми отримаємо послідовність бітів, приведену в шостому рядку таблиці. Підсумовування їх значень дає 72. Відповідно до цієї таблиці

217 AND 106 = 72

Щоб перевірити правильність обчислень, розглянемо наступний приклад:

1. Відкрийте вікно безпосередніх обчислень клавішами Ctrl+G.

2. У вікні, що відкрилося, введіть наступні рядки:

A=217; B=106

? A AND B

У повній відповідності з таблицею результат дорівнюватиме 72.

3. Спробуйте виконати операцію AND для інших пар чисел:

? 163 AND 8

? 55 AND 12

? 37 AND 7

? 72 AND 255

? 255 AND 0

Результати мають дорівнювати 0, 4, 5, 72 і 0.

Щоб перевірити результати обчислень, спробуйте відтворити структуру таблиці. 6.2 для інших чисел. Запишіть значення окремих бітів і вичислите результат вручну. Це допоможе вам опанувати основи двійкової логіки.

Логічний оператор EQV

Оператор Visual Basic EQV перевіряє еквівалентність двох виразів. Якщо їх логічні значення співпадають, результат операції буде істинним. Якщо значення відрізняються, результат буде помилковим. У таблиці. 6.3 приведені різні комбінації виразів і відповідні результати.

Таблиця 6.3. Результати виконання логічної операції ЕQV для двох виразів

Вираз 1

Вираз 2

Результат

Істина

Істина

Істина

Істина

Брехня

Брехня

Брехня

Істина

Брехня

Брехня

Брехня

Істина

Початкуючим програмістам цей оператор зазвичай не потрібний.

Логічний оператор OR

Якщо ви хочете переконатися в тому, що хоч би один з виразів істинно, скористайтеся оператором OR. Якщо хоч би один з виразів істинно, результат буде істинним. Якщо обидва вираження помилкові, результат буде помилковим. У таблиці. 6.4 приведені різні комбінації виразів і результати операції OR.

Таблиця 6.4. Результати виконання логічної операції OR для двох виразів

Вираз 1

Вираз 2

Результат

Істина

Істина

Істина

Істина

Брехня

Істина

Брехня

Істина

Істина

Брехня

Брехня

Брехня

Два числа можна об'єднати логічною операцією OR, як це робилося для операції AND. Приклад показаний в таблиці. 6.5.

Таблиця 6.5. Застосування логічної операції OR для двох чисел

Номер біта

7

би

5

4

3

2

1

0

Двійкове значення

27

26

25

24

23

22

21

Ціле значення

128

64

32

16

8

4

2

1

Вираз 1

0

1

0

0

1

0

0

1

73

Вираз 2

1

1

1

0

1

0

0

0

232

Вираз 1 OR Вираз 2

1

1

1

0

1

0

0

1

233

Щоб перевірити правильність обчислень, розглянемо наступний приклад:

1. Відкрийте вікно безпосередніх обчислень клавішами Ctrl+G.

2. У вікні, що відкрилося, введіть наступний рядок:

? 73 OR 232

Результат, як і в таблиці, дорівнюватиме 233.

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

55 OR 12

37 OR 7

72 OR 255

255 OR 0

Результати мають дорівнювати 63,39,255 і 255. Як бачите, при об'єднанні операцією OR будь-якого числа з 255 результат дорівнюватиме 255.


Логічний оператор XOR

Якщо ви хочете переконатися в тому, що істинно лише один з двох виразів, скористайтеся оператором XOR (операція OR, що виключає). На відміну від OR він дає істинний результат лише у тому випадку, якщо істинне одне вираження, але не обоє. У цьому неважко переконатися по таблиці. 6.6.

Таблиця 6.6. Результати виконання логічної операції XOR для двох виразів

Вираз 1

Вираз 2

Результат

Істина

Істина

Брехня

Істина

Брехня

Істина

Брехня

Істина

Істина

Брехня

Брехня

Брехня

Давайте використаємо операцію XOR для чисел з попереднього прикладу (см 6.7). Це наочно показує, чим відрізняються ці дві операції.

Таблиця 6.7. Застосування логічної операції XOR для двох чисел

Номер біта

7

6

5

4

3

2

1

0

Двійкове значення

27

26

25

24

23

22

21

Ціле значення

128

64

32

16

8

4

2

1

Вираження 1

0

1

0

0

1

0

0

1

73

Вираження 2

1

1

1

0

1

0

0

0

232

Вираз 1 XOR Вираз 2

1

0

1

0

0

0

0

1

161

Перевірте правильність обчислень:

1. Відкрийте вікно безпосередніх обчислень клавішами Ctrl+G.

2. У вікні, що відкрилося, введіть наступний рядок:

? 73 XOR 232

Результат, як і в таблиці, дорівнюватиме 161.

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

55 XOR 12

37 XOR 7

72 XOR 255

255 XOR 0

Результати мають дорівнювати 59, 34,183 і 255.

Логічний оператор NOT

Логічний оператор NOT повертає зворотне логічне значення. Він може згодитися при перевірці умови, протилежної до вказаного. Розглянемо наступний фрагмент:

Dim Successful As Boolean

Successful = True

If Not Successful Then

MsgBox "Операція завершилася невдало"

End If

Ми оголошуємо змінну Successful, що має логічний тип даних, і привласнюємо їй значення True (істина). Перевіряючи умову If Not Successful, ми фактично хочемо дізнатися, чи є ця змінна помилковою. У програмі змінну Successful можна замінити функцією, яка повертає True або False, і перевірити значення яке повертається. Як видно з таблиці. 6.8, результат операції NOT завжди протилежний до значення початкового вираження.

Таблиця 6.8. Результати виконання логічної операції NOT

Вираз

Результат

Істина

Брехня

Брехня

Істина

На практиці операція NOT зазвичай використовується для перевірки виняткових станів і, як ви незабаром переконаєтеся, при перевірці помилок. А доки розглянемо роботу оператора NOT в Visual Basic на наступному простому прикладі:

1. Введіть у вікні безпосередніх обчислень наступний рядок:

? NOT True

Результат буде рівний False.

2. Перевіримо протилежну умову:

? NOT False

Результат буде рівний True.

Порівняння

При перевірці умов використовуються не лише логічні оператори, але і оператори порівняння. З їх допомогою можна дізнатися, чи рівні числа або рядки і в якому відношенні вони знаходяться один до одного, чи належать вони інтервалу допустимих значень і т. д. Порівнювати можна слова, імена, числа і взагалі усе, що вам захочеться. Давайте подивимося, як це робиться.

Перевірка умови "рівно"

Майже в кожному застосуванні вимагається порівняти два вираження і дізнатися, чи співпадають їх значення. У Visual Basic це завдання вирішується оператором =. Він зустрічався в багатьох прикладах, приведених раніше. Перевірка рівності виконується так:

If x = 3 Then

MsgBox "Значення x дорівнює 3"

End If

Оцініть красу Visual Basic - програма виходить дуже схожою на простий англійський текст. Цей фрагмент можна було б сформулювати словами:

Якщо значення x дорівнює 3, то вивести діалогове вікно.

Як правило, програмістові доводиться вирішувати протилежну задачу і перетворювати слова на текст програми. На щастя, програма приносить більше користі, чим простий текст на листку паперу!

Щоб наочно познайомитися з тим, як виконується перевірка дати, розглянемо наступний приклад. У нім ми перевіряємо дату і виводимо відповідне повідомлення:

1. Створіть новий проект командою File > New Project.

2. У діалоговому вікні New Project виберіть значок Standard EXE. Натисніть кнопку ОК.

3. Задайте властивості Name форми Form1 значення frmMain, а властивості Caption - значення Виберіть число.

4. Створіть на формі дві кнопки.

5. Задайте властивості Name першої кнопки значення cmdGetSecretNumber, а властивості Caption - значення Загадати &число.

6. Задайте властивості Name другої кнопки значення cmdGuess, a властивості Caption - значення &Вгадати.

7. Двічі клацніть на формі frmMain, щоб відкрити вікно програми.

8. Вставте наступний фрагмент в процедуру події Load форми frmMain:

Private Sub Form_Load()

Загадати число

SecretNumber = GetSecretNumber()

End Sub

9. Вставте наступний рядок в секцію(Declarations) форми frmMain:

Option Explicit

Private SecretNumber As Integer

10. Перейдемо до створення функції GetSecretNumber(), яка є одним з найважливіших компонентів додатка. Вставте наступний фрагмент в секцію(Declarations):

Private Function GetSecretNumber() As Integer

' Загадати число від 1 до 10

Randomize

GetSecretNumber = Int(Rnd(1) * 10) + 1

End Function

11. Вставте наступний фрагмент в процедуру події Click кнопки cmdGetSecret Number:

Private Sub cmdGetSecretNumber_Click()

' Загадати число

SecretNumber = GetSecretNumber()

End Sub

12. Нарешті, вставте наступний фрагмент в процедуру події Click кнопки cmdGuess:

Private Sub cmdGuess_Click()

Dim guess As Integer

Dim msg As String

Dim cap As String

' Створити повідомлення

msg = "Введіть число від 1 до 10"

' Отримати число від користувача

guess = CInt(InputBox(msg))

' Число вгадане вірно?

If guess = SecretNumber Then

' Так! Користувач вгадав!

msg = "Ви вгадали"!

cap = "Вірно"!

' Вивести повідомлення

MsgBox msg, vbExclamation, cap

' Закінчити гру

End

Else

' Ні. Наступна спроба..

msg = "Невірно".

cap = "Спробуйте знову"!

MsgBox msg, vbInformation, cap

End If

End Sub

Ця процедура - найважливіша частина нашого прикладу. Знак = вперше зустрічається в рядку msg = "Введіть число."., проте порівняння відбувається лише в рядку If guess = SecretNumber Then. Ми перевіряємо, чи співпало введене значення із загаданим числом.

13. Збережете проект. Ми змінимо його в декількох найближчих прикладах.

14. Запустіть проект клавішею F5. Якщо натиснути кнопку Загадати число, програма загадує випадкове число від 1 до 10. Натисніть іншу кнопку і спробуйте вгадати це число!

При кожній спробі програма повідомляє, чи було число названо вірно або ні (рис.6.1).

Перевірка умови "більше"

Для перевірки умови "більше" в програмуванні, як і в алгебрі, використовується символ >. Розглянемо наступний фрагмент:

if x > 3 Then

MsgBox "x більше 3"

End If

У своїх програмах ви можете перевірити деяку величину і дізнатися, чи більше вона іншої величини. Перевірки такого роду зазвичай зустрічаються у разі, коли введене користувачем значення повинне належати конкретному діапазону. Втім, усе залежить від додатка.

Відкрийте проект з попереднього прикладу і виконаєте наступні дії:

1. Відкрийте вікно програми, двічі клацнувши на формі frmMain.

2. Відредагуйте процедуру події Click кнопки cmdGuess і приведіть її до наступного виду:

Private Sub cmdGuess_Click()

Dim guess As Integer

Dim msg As String

Dim cap As String

' Створити повідомлення

msg = "Введіть число від 1 до 10"

' Отримати число від користувача

guess = CInt(InputBox(msg))

' Число вгадане вірно?

Select Case guess

Case Is = SecretNumber

' Так! Користувач вгадав!

msg = "Ви вгадали"!

cap = "Вірно"!

' Вивести повідомлення

MsgBox msg, vbExclamation, cap

' Закінчити гру

End

Case Is > SecretNumber

' Ні. Наступна спроба..

msg = "Невірно. Загадане число менше".

cap = "Спробуйте знову"!

MsgBox msg, vbInformation, cap .

End Select

End Sub

3. Збережете і Запустіть проект.

Спробуйте вгадати число. Якщо введене вами число буде більше за загадане, програма повідомить вас про це (мал. 6.2).

Мал. 6.2. Назване число більше за загадане.

Основні зміни в програмі знаходяться в блоці, який починається з рядка Саsе Is > SесretNumber. Програма перевіряє, що введене число більше SecretNumber. Якщо ця умова не виконується, наступний логічний крок - переконатися в тому, що введене число менше SecretNumber.

Перевірка умови "менше"

Для перевірки умови "менше" використовується символ <:

if x < 3 Then

MsgBox "x менше 3"

End If

Цей оператор доповнює оператор "більший". Досить часто вони використовуються разом і перевіряють, що величина належить деякому діапазону. Далі ми продовжимо працювати з попереднім прикладом. Відкрийте проект і виконаєте наступні дії:

1. Відкрийте вікно програми, двічі клацнувши на формі frmMain.

2. Відредагуйте процедуру події Click кнопки cmdGuess і приведіть її до наступного виду:

Private Sub cmdGuess_Click()

Dim guess As Integer

Dim msg As String

Dim cap As String

' Створити повідомлення

msg = "Введіть число від 1 до 10"

' Отримати число від користувача

guess = CInt(InputBox(msg))

' Число вгадане вірно?

Select Case guess

Case Is = SecretNumber

' Так! Користувач вгадав!

msg = "Ви вгадали"!

cap = "Вірно"!

' Вивести повідомлення

MsgBox msg, vbExclamation, cap

' Закінчити гру

End

Case Is > SecretNumber

' Ні. Наступна спроба..

msg = "Невірно. Загадане число менше".

cap = "Спробуйте знову"!

MsgBox msg, vbInformation, cap

Case Is < SecretNumber

' Ні. Наступна спроба..

msg = "Невірно. Загадане число більше".

cap = "Спробуйте знову"!

MsgBox msg, vbInformation, cap

End Select

End Sub

3. Збережете і Запустіть проект.

Спробуйте вгадати число. Якщо введене вами число буде менше за загадане, програма повідомить вас про це (мал. 6.3).

Мал. 6.3. Назване число менше за загадане.

Перевірка умови "не рівно"

Якщо ви хочете переконатися в тому, що одне значення відмінне від іншого, слід скористатися оператором <>:

if x <> 3 Then

MsgBox "x не дорівнює 3"

End If

Цей оператор буває особливо корисним в ситуаціях, коли вимагається перевірити, що користувач ввів значення. Щоб зрозуміти, чому це так, Запустіть програму з попереднього прикладу:

1. Натисніть кнопку Загадати число, щоб згенерувати випадкове число від 1 до 10.

2. Натисніть кнопку Вгадати.

3. У вікні введення, що відкрилося, натисніть кнопку OK або Cancel

З'являється повідомлення про помилку – не співпадіння типів. Натисніть кнопку End, щоб завершити роботу програми. Не вдаючись до подробиць процесу відладки, скажу, що помилка виникла в наступному рядку:

guess = CInt(InputBox(msg))

Річ у тому, що функція CInt() повинна отримувати дані, що перетворюються в ціле число. Якщо функція викликається для порожнього рядка, видається повідомлення про помилку.

Щоб запобігти помилці, перед перевіркою слід переконатися в тому, що користувач ввів деяке значення. Оператор <> ідеально підходить для цієї мети! Перевірку можна виконати наступною командою:

If rс <> "" Then

У перекладі людською мовою це означає: "Якщо значення guess не рівно порожньому рядку, то зробити щось".

4. Відредагуйте процедуру події Click кнопки cmdGuess і приведіть її до наступного виду:

Private Sub cmdGuess__Click()

Dim guess As Integer

Dim msg As String

Dim cap As String

Dim rc As String

'Створити повідомлення

msg = "Введіть число від 1 до 10"

'Отримати число від користувача

rс = InputBox(msg)

'Переконатися в тому, що користувач ввів значення..

If rс <> "" Then

'Перетворити рядок в ціле число

guess = CInt(rc)

' Число вгадане вірно?

Select Case guess

Case Is = SecretNumber

' Так! Користувач вгадав!

msg = "Ви вгадали"!

cap = "Вірно"!

' Вивести повідомлення

MsgBox msg, vbExclamation, cap

' Закінчити гру

End

Case Is > SecretNumber

' Ні. Наступна спроба..

msg = "Невірно. Загадане число менше".

cap = "Спробуйте знову"!

MsgBox msg, vbInformation, cap

Case Is < SecretNumber

' Ні. Наступна спроба..

msg = "Невірно. Загадане число більше".

cap = "Спробуйте знову"!

MsgBox msg, vbInformatidn, cap

End Select

Else

msg = "Ви повинні ввести число"!

cap = "Введіть число"!

MsgBox msg, vbInformation, cap

End If

End Sub

5. Збережете і Запустіть проект

Перевірка умови "більше або рівно"

Іноді доводиться перевіряти, що деяка величина більше іншої або дорівнює їй. Для цієї мети використовується оператор >=:

if x >= 3 Then

MsgBox "x більше або рівне 3"

End If

Приведений фрагмент надзвичайно простий. Якщо значення x більше або рівне 3, програма виводить вікно повідомлення.

Ймовірно, ви вже зрозуміли, як користуватися цим оператором. Припустимо, ви пишете програму для управління пасажирським літаком. Звичайно, якщо пілот летить занадто швидко, його необхідно попередити. Перевищення швидкості може привести до перевантаження і викликати катастрофічні ушкодження літака. Проте на літаку працює ваша (звичайно ж, чудова!) програма; вона перевіряє швидкість і переконується в тому, що пілот не перевищив максимальну рекомендовану швидкість. Виконаєте наступні дії:

1. Створіть новий проект командою File > New Project.

2. У діалоговому вікні New Project виберіть значок Standard EXE. Натисніть кнопку ОК.

3. Задайте властивості Name форми значення frmMain, а властивості Caption - значення Датчик швидкості.

4. Створіть на формі вертикальну смугу прокрутки і задайте її властивості Name значення vscThrottle. Розташуєте смугу в правій частині форми і розтягніть її на усю висоту форми.

5. Задайте властивості Мах смуги vscThrottle значення 100.

6. Створіть на формі frmMain напис. Задайте її властивості Name значення lbl Airspeed, а властивості Caption - значення Поточна швидкість:.

7. Двічі клацніть на формі frmMain в конструкторі форм, щоб відкрити вікно програми.

8. Вставте наступний фрагмент в секцію(Declarations) форми frmMain:

Option Explicit

Private Throttle As Integer ' Поточне значення газу

Private Const VNE = 427  ' Гранична швидкість

9. Ініціалізуйте значення газу в наступному фрагменті, який необхідно вставити в процедуру події Load форми frmMain,:

Private Sub Form_Load()

vscThrottle.Value = 100

End Sub

10. Вставте наступний фрагмент в процедуру події Change елементу vscThrottle:

Private Sub vsc_Throttle_Change()

Dim ias As Integer ' Поточна швидкість

' Відстань до верхньої позиції смуги прокрутки

Throttle = 100 - vscThrottle.Value

' Вичислити поточну швидкість за значенням газу

ias = Throttle * 4.5

' Відновити датчик швидкості

lblAirspeed.Caption = "Поточна швидкість: " & Trim$(Str$(ias))

' Перевірити поточну швидкість і переконатися, що вона не перевищує граничної

If ias >= VNE Then

MsgBox "Зменшити газ"!, vbCritical, "Перевищення швидкості"

End If

End Sub

Цю процедуру варто розглянути детальніше. Перша частина, в якій ми обчислюємо значення Throttle, потрібна через те, що при знаходженні бігунка у верхній позиції смуги прокрутки її властивість Value за умовчанням дорівнює 0. Максимальному газу на літаку, навпаки, відповідає верхнє положення руків'я ("від себе"). Наша програма імітує літакове руків'я газу за допомогою смуги прокрутки.

Рядок, в якому розраховується поточна швидкість (ias), не занадто точний. Обчислення швидкості справжнього літака - завдання складна і така, що виходить далеко за рамки цієї книги. Я скористався простою формулою, яка дозволяє літаку розганятися до 400 вузлів. Попередження виводиться в наступному фрагменті:

' Перевірити поточну швидкість і переконатися,

' що вона не перевищує граничної

If ias >= VNE Then

MsgBox "Зменшити газ"!, vbCritical, "Перевищення швидкості"

End If

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

11. Збережете і Запустіть проект. Переміщайте бігунок на смузі прокрутки і стежите за тим, як росте поточна швидкість. Коли вона досягне граничної, з'являється попередження (мал. 6.5).

Мал. 6.5. Перевищення граничної швидкості.

Перевірка умови "менше або рівно"

Іноді вимагається перевірити, що деяка величина менше або рівна (але не більше) іншої величини. Для перевірки цієї умови застосовується оператор <=. Наступний фрагмент показує, як виконуються подібні перевірки:

if x <= 3 Then

MsgBox "x менше або рівне 3"

End If

Ми скористаємося новим оператором в новому варіанті попереднього прикладу. Якщо літак летить занадто повільно, він може увійти до штопора і впасти. Haш датчик швидкості повинен повідомляти пілота про те, що він летить занадто повільно. Продовжимо роботу над прикладом:

1. Відкрийте приклад з попереднього розділу, якщо він не був відкритий раніше.

2. Вставте наступний рядок в секцію(Declarations) форми frmMain:

Private Const VSTALL = 73 ' Мінімальна швидкість

3. Припустимо, ви в даний момент летите і руків'я газу встановлене на 77 відсотків. Відредагуйте процедуру події Form_Load і приведіть її до наступного виду:

Private Sub Form_Load()

vscThrottle.Value = 23

vscThrottle_Change

End Sub

Нарешті, відредагуйте процедуру події Change елементу vscThrottle:

Private Sub vsc_Throttle_Change()

Dim ias As Integer ' Поточна швидкість

' Відстань до верхньої позиції смуги прокрутки

Throttle = 100 - vscThrottle.Value

' Вичислити поточну швидкість за значенням газу

ias = Throttle * 4.5

' Відновити датчик швидкості

lblAirspeed.Caption = "Поточна швидкість: " & _ Trim$(Str$(ias))

' Перевірити поточну швидкість і переконатися, '

що вона не перевищує граничної

If ias >= VNE Then

MsgBox "Зменшити газ"!, vbCritical, "Перевищення швидкості"

End If

' Переконатися, що літак не входить в штопор

If ias <= VSTALLThen

MsgBox "Збільшити газ"!, vbCritical', "Вхід в штопор"!

End If

End Sub

5. Збережете і Запустіть проект. Якщо зменшити газ нижче за порогове значення датчик швидкості видає попередження.

Отже, ви навчилися користуватися різними операторами для ухвалення рішень в програмах. Після знайомства з азами комп'ютерної логіки ми переходимо до наступної теми - як використовувати цю логіку для управління виконанням програми і як приймати прості рішення в додатках.

Ухвалення рішень в програмі

Логіка - лише одна складова "мислячого" застосування. Вам також знадобляться засоби її практичного використання. Наведені в цьому уроці приклади наочно показують, як приймаються рішення в програмах.

Оператор If..Then..Else

Оператор If..Then..Else є простою, але і найпоширенішою формою перевірки умов в Visual Basic. Його скорочена форма - оператор If..Then - має наступний синтаксис:

If Выражение1 Оператор Вираження 2 Then

' Виконати деякі дії

End If

В даному прикладі Оператор може бути будь-яким з операторів, розглянутих раніше,: AND, OR, =, <>і т. д. Выражение1 і Выражение2 - змінні або константи, що допускають порівняння цим оператором. Наприклад, порівняння рядків виконується таким чином:

PIN = "123456"

If PIN = "123456" Then

MsgBox "Вірне значення PIN"

End If

В цьому випадку PIN порівнюється із заздалегідь відомим значенням, "123456". Якщо умова істинна, на екран виводиться повідомлення.

Іноді ми реагуємо лише на виконання умови, але частіше доводиться обробляти і протилежну ситуацію. Для обробки протилежних ситуацій використовується оператор Else. Синтаксис виглядає так:

If Выражение1 Оператор Вираження 2 Then

Виконати деякі дії

Else

Виконати інші дії

End If

Усе, що вам доведеться зробити, - включити секцію Else після першого виконуваного блоку. Потім наступний виконуваний блок розміщується між ключовими словами Else і End If. У нім виконуються дії для умови, протилежної до того, що перевіряється. У попередньому прикладі це виглядало б так:

PIN = "654321"

If PIN = "123456" Then

MsgBox "Вірне значення PIN"

Else

MsgBox "невірне значення PIN"!

End If

Отже, тепер ви знаєте, як обробити умову і виключення з нього. Цей корисний прийом допоможе зменшити кількість помилок в програмі. Якщо вам потрібно буде вичислити декілька умов, оператор If..Then..Else можна помістити усередині іншого оператора (вкладена перевірка). Вкладені оператори If..Then дозволяють виконати серію перевірок в певному порядку. Наприклад:

If ValidUserID(UserID) Then

If ValidPassword(UserID, Password) Then

MsgBox "невірний пароль"!

Else

MsgBox "Користувач зареєстрований"!

End If

Else

MsgBox "невірне ім'я користувача"!

End If

Спочатку ми перевіряємо, що користувач ввів правильне ім'я. Перевірка виконується функцією ValidUserID(). Якщо функція повертає True (правильне ім'я), програма переходить до перевірки пароля. Інакше вона сповіщає користувача про те, що він ввів невірне ім'я.

Якщо функція ValidPassword() повертає True, користувачеві дозволяється увійти до системи. Інакше спроба реєстрації завершується невдачею. Вкладені оператори If..Then можна створити і іншим способом - за допомогою конструкції ElseIf:

If x = 1 Then

Виконати деякі дії

ElseIf x = 2 Then

' Виконати інші дії

End If

Вибір між цими конструкціями - питання смаку і/або звички. Обидва способи працюють однаково добре.

Функція IIf

Замість блоку If..Then..Else можна скористатися конструкцією безпосереднього If, або IIf. Єдина відмінність полягає в тому, що IIf обчислює обидва вирази які повертаються. Розглянемо наступний фрагмент:

Function TasteIt (Food As String) As String

CheckIt = IIf(Food = "Гамбургер". "Ні, спасибі", "Смачно"!)

End Function

Значення другого і третього параметрів, "Немає, спасибі" і "Смачно"!, будуть вичислені незалежно від того, яке з них буде повернено функцією IIf.

Функція TasteIt() надзвичайно проста. Вона перевіряє, чи має змінна Food значення "Гамбургер", і якщо має - повертає рядок "Немає, спасибі". Інакше повертається рядок "Смачно"!

Як значення, функції, що повертається IIf, можуть вказуватися як константи, так і обчислювані вирази.

Оператор Select Case..End Select

Для ухвалення складніших рішень (особливо за наявності декількох умов) можна скористатися блоком Select Case..End Select. Його синтаксис простий:

Select Case x

Case Is =3

' Виконати деякі дії

Case Is > 17

‘ Виконати інші дії

Case Else.

‘ Дії для випадку, коли не виконано

‘ жодна з попередніх умов

End Select

Для кожного оператора Select Case в програмі має бути відповідний оператор End Select. Кількість секцій Case між Select Case і End Select може бути будь-ким.

Для кожної умови, що перевіряється, створюється окрема секція Case. Якщо ви хочете окремо обробити ситуацію, коли не виконується жодна з умов, створіть секцію Case Else. Вона багато в чому схожа на секцію Else оператора If..Then.

У операторові Select Case можна перевіряти строкові літерали, змінні і діапазони значень. Наприклад, наступний фрагмент перевіряє, що число належить інтервалу від 1 до 10:

Select Case guess

Case 1 to 10

Припущення вірне

Case Else

Припущення невірне

End Select

Секція Саsе 1 to 10 виконується для змінної guess, яка належить інтервалу від 1 до 10. Секція Case Else обробляє інші ситуації.

Оператор Select Case..End Select застосовується і для рядків. Наприклад, у вашій програмі може бути присутній наступний фрагмент:

Select Case x

Case Is = "3"

Виконати деякі дії

Case Is > "17"

Виконати інші дії

Case Else

Дії для випадку, коли не виконано

жодна з попередніх умов

End Select

Програмний код, що виконується при виконанні умови, знаходиться у відповідній секції Case. Секція Case може містити декілька команд (див. приклад з вгадуванням чисел). Зверніть увагу: для завершення секції Case не використовується оператор End. Стає зрозуміло, чому так важливо структурувати програмний код за допомогою символів табуляції і пропусків - це дозволяє візуально згрупувати взаємозв'язаний код. Такий підхід не лише спрощує читання програми, але і знижує вірогідність помилок.

При перевірці строкових значень слід пам'ятати про те, що користувач може вводити дані у верхньому, нижньому або змішаному регістрах. Отже, ваша програма повинна обробляти можливі ситуації. Для цього необхідно вирішити два завдання. По-перше, ви повинні видалити з рядка усі ведучі і завершуючі пропуски. Іноді користувач випадково вводить пропуски до або після даних. Щоб видалити їх, слід передати рядок функції Trim$(). По-друге, текст необхідно перетворити до одного регістра, верхнього або нижньому. Для цього можна скористатися функцією UCase$() або LCase$(,). Можливі варіанти виглядають так:

If Trim$(UCase$(txtInput.Text)) = "АДМІНІСТРАТОР" Then

‘ Виконати деякі дії

End If

If Trim$(LCase$(txtInput.Text)) = "адміністратор" Then

‘ Виконати деякі дії

End If

Обидва оператори If..Then призводять до одного результату. Зверніть увагу: рядок в правій частині умови повинен знаходитися в тому ж регістрі, до якого перетвориться вираження в лівій частині.

Виконання дій, що повторюються

Можливості комп'ютера краще всього проявляються при багатократному виконанні одних і тих же дій. Оскільки комп'ютер вважає швидше, ніж людський мозок, на нього слід покласти якомога більше роботи, що повторюється, нетворчої.

Цикл For..Next

Основна форма циклів в Visual Basic - цикл For,.Next. Він використовується для виконання визначеного кількість ітерацій. Цикли For..Next зазвичай використовуються для роботи з лічильниками і в інших ситуаціях, коли кількість ітерацій відома заздалегідь. Вони мають наступний синтаксис:

For «Лічильник=ПочатковеЗначення» To «КінцевеЗначення»

Дії, що повторюються

Next Лічильник

Незважаючи на простоту цього фрагмента, зверніть увагу на деякі обставини:

  •  Змінна Лічильник має числовий тип (Integer або Long) і вказується програмістом (наприклад, I).
  •  Початкове Значення визначає стан змінної, з якого починається відлік.
  •  Кінцеве Значення визначає стан змінної, в якому відлік припиняється.

Наприклад, щоб змінна x в циклі набувала значень від 1 до 5, Лічильник замінюється на x, ПочатковеЗначення - на 1, а КінцевеЗначення - на 5. У першому рядку циклу For..Next може бути присутній ключове слово Step. Воно дозволяє змінити приріст лічильника (за умовчанням воно дорівнює 1). Наприклад, якщо значення лічильника кожного разу збільшується на 3, рядок For завершуватиметься Step 3. Якщо лічильник збільшується на 2, рядок завершується Step 2. У наступному фрагменті лічильник змінюється від 10 до 100 з приростом 5:

For I = 10 To 100 Step 5

‘ Дії, що повторюються

Next

Після ключового слово Next можна не вказувати ім'я змінної-лічильника. В цьому випадку цикл For..Next просто завершується ключовим словом Next. Більше того, тести показали, що без вказівки імені змінній програма виконується швидше. Проте код має бути структурований, щоб ви могли легко знайти відповідність між різними For і Next.

Лічильник навіть може змінюватися у зворотному напрямі. Для цього слід задати початкове значення більше кінцевого і вибрати негативний приріст після ключового слова Step. Наприклад, в наступному фрагменті лічильник змінюється від 10 до 1:

For I = 10 To 1 Step - 1

Дії, що повторюються

Next

А тут лічильник змінюється від 100 до 0 із зменшенням на 10:

For I = 100 To 0 Step - 10

‘ Дії, що повторюються

Next

Щоб вийти з циклу до того, як лічильник досягне кінцевого значення, скористайтеся командою Exit For. Наприклад:

For I = 1 To 100 Step 5

X = I * 10

If X > 100 Then

Exit For

End If

Next

Цикли For..Next зустрічаються в багатьох прикладах цієї книги. Так же часто він використовуватиметься і у вашій майбутній роботі.

Цикл Do..Loop

Інший тип циклів реалізується за допомогою конструкції Do..Loop. Ця конструкція використовується в тих ситуаціях, коли точна кількість повторень заздалегідь невідома або ви хочете дочекатися виконання деякої умови. Наприклад, можна в циклі перебирати вміст набору записів, отриманого з бази даних. Швидше за все, точна кількість записів буде невідома заздалегідь, та зате можна визначити, що ви досягли кінця набору. Цикл Do..Loop прекрасно справляється з цим завданням.

Цикл Do..Loop може виконуватися нескінченно:

Do

‘ Дії, що повторюються

Loop

Цикл з умовою завершення виглядає так:

Do While X < 10

X = X + 1

Loop

Він продовжує виконуватися до тих пір, поки значення змінної залишається менше 10. Оскільки X не привласнювалося конкретного значення, цикл виконуватиметься 10 разів. Замість ключового слова While можна скористатися ключовим словом Until, але тоді замість умови продовження обчислень формулюється умова завершення. Наш фрагмент еквівалентний наступному:

Do Until X = 10

X = X + 1

Loop

Для виходу з циклу можна використовувати практично будь-яку логічну умову, сформульовану на Visual Basic. Воно може містити логічні оператори і оператори порівняння, а також логічні змінні.

Цикл While..Wend

Інша форма циклу, схожа на конструкцію Do..Loop, - цикл While..Wend. У нім послідовність команд виконується до тих пір, поки залишається істинною вказана умова. Наприклад, наступний цикл:

While X < 10

X = X + 1

Wend

Виконується до тих пір, поки значення X не досягне 10. Оскільки цикл While - Wend еквівалентний конструкції Do..Loop, вибір між ними є справою смаку.

Перебір колекцій

У Visual Basic існує ще один тип циклів, призначений для переборів колекцій. Для цієї мети використовуються цикли For Each..Next. Такий спосіб особливо корисний за ситуації, коли точна кількість об'єктів в колекції невідомо заздалегідь.

Цикл для перебору усіх об'єктів колекції може виглядати так:

Dim cmd As CommandButton

*

For Each cmd In Form1

With cmd

If .Index <> Index Then

MsgBox "Кнопка " & Trim$(Str$(.Index)) &_

не була натиснута"

End If

End With

Next

У першому рядку оголошується об'єкт класу CommandButton. У другому рядку Visual Basic перебирає усі об'єкти CommandButton на формі Form1. Далі слідує оператор With cmd, який повідомляє про те, що операції блоку With..End With виконуються з поточним об'єктом колекції cmd.

Цикли по елементах колекцій використовуються в багатьох завданнях, серед яких перебір елементів дерев і табличних списків, дочірніх форм додатків MDI і об'єктів, що належать документам DHTML (див. урок 18, "Програмування для Інтернету на Visual Basic").

Приклад використання циклів

Наступний приклад наочно показує, як організовується спільна робота циклів, умов і логічних операторів. У нім описані раніше різновиди циклів використовуються для заповнення декількох текстових полів на формі. Хоча така програма не має особливої практичної цінності, вона добре демонструє роботу різних циклів.

1. Створіть новий проект командою File > New Project.

2. У діалоговому вікні New Project виберіть значок Standard EXE і натисніть кнопку ОК.

3. Задайте властивості Name форми Form1 значення frmMain, а властивості Caption - значення Цикли.

4. Відкрийте редактор меню клавішами Ctrl+E. 5. Створіть меню верхнього рівня, вказуючи в полі Caption значення &Цикл. Введіть в поле Name значення mnuLoop.

6. Створіть новий об'єкт меню (натисніть кнопку Next в редакторові меню).

7. Натисніть кнопку із стрілкою /, розташовану прямо над списком (мал. 6.7), щоб забезпечити створений об'єкт одиничним відступом. При цьому він стає командою меню верхнього рівня.

Мал. 6.7. Створення команди меню.

8. Введіть в поле Caption значення &For.. Next, а в поле Name - значення mnuLoop ForNext.

9. Натисніть кнопку Next, щоб створити наступну команду меню. Зверніть увагу: вона вже забезпечена необхідним відступом, тому натискати кнопку із стрілкою не треба.

10. Введіть в поле Caption значення &Do.. Loop, а в полі Name - значення mnuLoopDo - Loop.

11. Натисніть кнопку Next, щоб створити наступну команду меню. Введіть в поле Caption значення &While.. Wend, а в поле Name - значення mnuLoopWhileWend.

12. Натисніть кнопку Next, щоб створити наступну команду меню. Введіть в поле Caption значення "-" (дефіс), а в поле Name - значення mnuLoopSep1.

13. Створіть наступну команду меню, введіть в поле Caption значення&Очистити, а в поле Name - значення mnuLоорС 1еаг.

14. Натисніть кнопку OK, щоб закрити редактор меню.

15. Збережете проект командою File > Save Project.

16. Створіть на формі frmMain текстове поле, розташуєте його в лівому верхньому кутку форми і задайте його властивості Name значення txtTextBox. Видалите поточний вміст властивості Text.

17. Активізуйте елемент, клацнувши на елементі txtTextBox в конструкторі форм.

18. Натисніть Ctrl+C, щоб скопіювати елемент в буфер обміну.

19. Клацніть на формі frmMain.

20. Натисніть Ctrl+V, щоб вставити текстове поле з буфера на форму. З'являється діалогове вікно (мал. 6.8), в якому вам пропонується створити масив елементів. Натисніть кнопку Yes.

Мал. 6.8. Створення масиву елементів.

21. Розташуйте нове текстове поле праворуч від першого.

22. Знову клацніть на формі і натисніть Ctrl+V, щоб вставити з буфера наступне текстове поле. Розташуєте його праворуч від полів, створених при виконанні кроків 20 і 21.

Ми створили ряд з трьох текстових полів. Продовжуйте вставляти на форму копії текстового поля і розташуєте їх у вигляді таблиці, що складається з трьох стовпців і п'яти рядків. Форма з 15 текстовими елементами повинна виглядати так, як показано на мал. 6.9.

23. Виберіть команду For..Next з меню Цикли форми frmMain. Відкривається вікно програми з процедурою події mnuLoopForNext_Click.

24. Вставте в процедуру наступний фрагмент:

Private Sub mnuLoopForNext_Click()

Dim i As Integer

‘ Заповнити текстові поля в циклі

For..Next For i = 0 to 14

txtTextBox(i).Text = "i = " & Trim$(Str$(i))

Next

End Sub

Мал. 6.9. Форма з масивом текстових полів.

25. Перейдіть до процедури події mnuDoLoop_Click і вставте в неї наступний фрагмент:

Private Sub mnuDoLoop_Click()

Dim i As Integer

‘ Заповнити текстові поля в циклі For..Next

i = 0

Do While i < 15

txtTextBox(i).Text = "i = " & Trim$.(Str$(i'))

i = i + 1

Loop

End Sub

26. Вставте наступний фрагмент в процедуру події mnuWhileWend_Click:

Private Sub fnnuWhileWend_Click()

Dim i As Integer

‘ Заповнити текстові поля в циклі For..Next

i = 0

While i < 15

txtTextBox(i).Text = "i = " & Trim$(Str$(i))

i = i + 1

Wend

End Sub

27. Вставте наступний фрагмент в процедуру mnuLoopClear_Click:

Private Sub mnuWhileWend_Click()

Dim x As Control

‘ Перебрати усі текстові поля на формі

‘ і стерти їх вміст

For Each x In frmMain.Controls

If UCase$(Left$(x.Name, 3)) = "TXT" Then

x.Text = ""

End If

Next

End Sub

28. Збережіть і запустіть проект.

Виберіть один з циклів, перерахованих в меню Цикли, і простежите за зміною текстових полів. Усі типи циклів дають однаковий результат, але різними способами (мал. 6.10). Як ви незабаром переконаєтеся, одне і те ж завдання в програмуванні може вирішуватися по-різному. Простеживши за роботою циклів, виберіть з меню Цикли команду Очистити. Програма перебирає усі об'єкти на формі і очищає властивість Text кожного текстового поля. Запам'ятаєте цей прийом, він згодиться вам при створенні ваших власних застосувань.

Мал. 6.10. Приклад роботи з циклами.

Що нового ми дізналися?

  •  Працювати з двійковою логікою.
  •  Використовувати логічні оператори Visual Basic для обробки умов.
  •  Використовувати умовні оператори для ухвалення рішень.
  •  Використовувати різні типи циклів для виконання дій, що повторюються.
  •  Створити "думаючого" додатка.


Урок 7. Змінні

  •  Типи змінних
  •  Змінні
  •  Масиви
  •  Константи

Будь-яке застосування в тій або іншій формі обробляє дані. Отже, ви повинні добре розбиратися в тому, як представляються і використовуються дані. У цьому уроці розказано про те, як дані зберігаються в пам'яті комп'ютера і як працювати з ними за допомогою різних типів (у тому числі змінних, масивів і констант). Ви дізнаєтеся, які типи даних краще підходять для конкретних завдань, як динамічно створювати нові дані і визначати константи, що спрощують програмування.

Перше знайомство із змінними

На якій би мові ви не програмували, один з найважливіших аспектів - це різні типи даних, використовувані цією мовою. Зокрема, до їх числа належать змінні, масиви і константи (хоча це далеко не усе існуючі типи). Вони життєво потрібні для роботи додатків. Отже, що ж таке змінна? Змінною називається область пам'яті, в якій можуть зберігатися різні значення. Як неважко здогадатися по назві, значення змінної може змінюватися.

Що таке пам'ять?

Щоб краще зрозуміти, як працюють змінні, необхідно спочатку ближче познайомитися з пам'яттю. Уявіть собі аркуш паперу в клітину. Кожен квадрат має розміри 5x5 мм і площу 0,25 см2. Якщо представити пам'ять комп'ютера у вигляді цього листа, то один квадрат відповідатиме одному байту. Один кілобайт (1024 байт) матиме розміри 16x16 см На перший погляд здається, що це не так вже багато, але мегабайт виявляється на подив великим. Один мегабайт дорівнює 1024 Кбайт, тому лист матиме розміри 5,12x5,12 м, або 26,2144м2.

Якщо на вашому комп'ютері встановлено 16 Мбайт пам'яті, лист збільшується до розмірів 20,48x20,48 м, тобто близько 420 м2. Майже третина футбольного поля!

Якщо ж одному квадратику відповідатиме не байт, а біт, то лист вийде ще більше - розміром майже в три футбольні поля. На щастя, на перших порах вам не доведеться працювати з бітами. Тепер ви приблизно уявляєте собі, як влаштована пам'ять, і зрозумієте, як працюють змінні різних типів.

Типи змінних

Як тільки ваші застосування почнуть зберігати, витягати і відображувати дані, вам неминуче доведеться працювати із змінними, масивами і константами. Ці фундаментальні засоби призначені для зберігання в пам'яті тимчасових величин. Вони використовуються не лише в Visual Basic, але і в інших мовах програмування.

Змінною називається ім'я, що визначає область пам'яті для зберігання тимчасової величини. Така величина може змінюватися під час роботи додатка. Змінні застосовуються в самих різних ситуаціях, багато з них визнаєте у міру накопичення досвіду. У Visual Basic існує декілька типів змінних, званих типами даних. Кожен тип даних має власні характеристики (см.табл. 7.1).

Таблиця 7.1. Типи даних для змінних і констант

Тип даних

Призначення

Integer

Числова змінна, містить цілі числа з інтервалу

-- 32 768 – 32767

Long

Числова змінна, відрізняється від Integer ширшим інтервалом

Single

Числова змінна - містить числа з десятковою точкою

Double

Числова змінна, відрізняється від Single ширшим інтервалом

Currency

Змінна для зберігання грошових величин

String

Змінна для зберігання текстових або строкових значень

Byte

Числова змінна - інтервал 0-255, навіть менше, ніж у Integer

Boolean

Змінна для зберігання значень True або False

Date

Змінна для зберігання дат

Object

Змінна для зберігання посилань на об'єкти Visual Basic і інших застосувань

Variant

Універсальна змінна загального призначення, яка може зберігати значення більшості інших типів

Як видно з таблиці. 7.1, типів змінних багато. Матеріал, викладений в книзі, вимагає знайомства лише з найпоширенішими: байтовим (Byte), строковим (String), цілим (Integer), логічним (Boolean), універсальним (Variant) і об'єктним (Object).

Об'єктний тип може бути розбитий на тип на всі категорії - форми, елементи, принтери і т. д. Універсальний тип зручний у тому відношенні, що він може зберігати значення усіх інших типів, проте при відладці великих застосувань він може викликати проблеми. Про усі ці нюанси ви дізнаєтеся із розділу 12, "Відладка додатків".

Байтові змінні

Простим типом змінних є байтовий тип. Щоб не поглиблюватися в тонкості двійкової арифметики, повірте мені на слово: байтова змінна може зберігати числа від 0 до 255.

Байтові змінні добре підходять для зберігання малих числових величин, зокрема символів з набору ASCII і двійкових даних. Робота із байтовими змінними демонструється на наступному прикладі:

1. Створіть новий проект командою File > New Project.

2. У вікні Project Wizard виберіть значок Standard EXE.

3. Коли Visual Basic завершить створення проекту, видалите форму Form1. Для цього слід клацнути на рядку Form1 правою кнопкою миші у вікні проекту і вибрати команду Remove Form1 в контекстному меню.

4. Якщо Visual Basic запропонує зберегти Form1, натисніть кнопку No.

5. Клацніть правою кнопкою миші у вікні проекту і виберіть команду Add > Module в контекстному меню.

6. У діалоговому вікні Add Module виберіть значок Module. B проекті з'явиться порожній модуль.

7. Якщо модуль ще не відкритий у вікні програми, двічі клацніть на рядку Module 1 у вікні проекту.

8. Додайте в модуль наступний фрагмент:

Option Explicit

Private Sub Main()

Dim b As Byte

Dim text As String

Debug.Print "ASCII-таблиця"

for b = 0 To 63

text = Str$(b) & " " & Chr$(b)

text = text & Chr$(9) & Chr$(9)

text = Str$(b + 64) & " " & Chr$(b + 64)

text = text & Chr$(9) & Chr$(9)

text = Str$(b + 128) & " " & Chr$(b + 128)

text = text & Chr$(9) & Chr$(9)

text = Str$(b + 192) & " " & Chr$(b + 192)

text = text & Chr$(9) & Chr$(9)

Debug.Print text

Next

End

End Sub

9. Запустіть програму командою Run > Start.

У вікні відладки промайне таблиця, що складається з чисел і символів. Вона відома програмістам під назвою ASCII - таблиці. У неї входять числа від 0 до 255, що відповідає байковому типу даних. Поряд з кожним числом виведений відповідний ASCII -символ. Користуючись цими числами, ви можете включати у свою програму неДрукуванняовані і інші спеціальні символи. Наприклад, в приведеному вище фрагменті кілька разів зустрічається посилання виду Chr$(9). Значення 9 відповідає символу табуляції. Оскільки ви не можете ввести його в тексті програми, доводиться використовувати Chr$(9). Команда Debug.Print виконує вивід у вікні відладки. Детальніша інформація про неї приведена в уроці 9, "Друкування".

Строкові змінні

Розібравшись із байтовими змінними, ми перейдемо до кориснішого способу їх застосування. Строкові змінні (чи просто рядки) займають в пам'яті ланцюжок послідовних байтів і можуть містити букви і числа. Разом ці байти утворюють мнемонічні скорочення, слова і навіть цілі пропозиції. На мал. 7.2 зображений простий рядок в пам'яті. Зверніть увагу: її загальна довжина дорівнює 11 байтам, оскільки кожен ASCII - символ представлений одним байтом.

Деякі властивості, з якими нам вже доводилося працювати, насправді були строкові змінні. Так, властивості Name і Caption мають алфавітно-цифрові значення. Щоб працювати із строковою змінною, треба виконати ряд попередніх дій:

  •  Як вибрати ім'я змінної;
  •  Як оголосити змінну як строкову (типу String);
  •  Як задати ім'я змінної.

Давайте створимо просту строкову змінну з ім'ям strName. Префікс str зазвичай говорить про те, що змінна має строковий тип. Він може згодитися під час відладки, якщо ви не упевнені, до якого типу відноситься змінна. Наступним кроком повинне стати оголошення строкової змінної. Для оголошення змінних використовується ключове слово Dim:

Dim strName as String

При оголошенні для змінної виділяється область пам'яті. Visual Basic показує «недостатньо пам'яті», щоб в ній помістився об'єкт відповідного типу. Нарешті, рядку можна присвоїти значення:

strName = "Jane"

Якщо рядку привласнюється безпосереднє значення, його слід взяти в лапок. Якщо цього не зробити, Visual Basic припускає, що значення strName зберігається в змінній з ім'ям Jane.

Присвоївши змінній значення, ви зможете скористатися їм для подальших обчислень, наприклад передати його як параметр процедури або присвоїти елементу на формі:

Form1.Caption = strName

Наступним приклад допоможе краще зрозуміти сказане:

1. Створіть новий проект командою File > New Project.

2. Двічі клацніть на формі Form1 в конструкторі форм, щоб відкрити вікно програми.

3. Виберіть із списку Events вікна програми подію Click форми.

4. Додайте в процедуру події Click наступний фрагмент:

Private Sub Form_Click()

Dim msg As String

msg = "Привіт"!

Caption = msg

End Sub

5. Запустіть програму командою Run > Start.

6. Клацніть на формі і простежите за зміною заголовка.

Ми розглянули простий приклад використання строкових змінних в додатку. Під час читання цієї книги вам належить побачити множину інших, менш тривіальних прикладів.

Якщо ви забуваєте оголошувати свої змінні, спробуйте форсувати явне оголошення усіх змінних - включите рядок Option Explicit в секцію(Declarations) вікна програми вашої форми. Цей же рядок можна включати в аналогічну секцію усіх створюваних форм і стандартних модулів Visual Basic (.BAS).

Puc. 7.3. Діалогове вікно Options.

Цілі змінні

Цілий тип також належить до фундаментальних типів даних. Цілі змінні частково схожі на байтові, але вони можуть мати знак (тобто бути позитивними або негативними) і належать інтервалу від - 32 768 до 32 767. Цілий тип зручний для простих обчислень, при яких значення свідомо залишаються цілочисельними величинами. Крім того, цілі змінні часто використовуються як лічильники.

Ми розглянемо роботу з цілими змінними на наступному прикладі:

1. Створіть новий проект.

2. Створіть на формі кнопку Задайте її властивості Name значення cmdPush, а властивості Caption - значення Натисни.

3. Двічі клацніть на кнопці, щоб відкрити вікно програми.

4. Додайте наступний фрагмент в процедуру події Click кнопки:

Dim A As Integer

Dim В As Integer

А = 2

У = А + 1

Print В

5. Запустіть програму і натисніть кнопку.

На мал. 7.4 показано вікно програми з приведеним вище фрагментом.

Мал. 7.4. Вікно програми для прикладу.

Останній рядок виводить на поточній формі значення змінної В, рівне 3 (мал. 7.5).

Мал. 7.5. Вікно додатка-прикладу.

Інші приклади роботи з цілими змінними зустрічаються як в цьому уроці, так і в частині книги, що залишилася.

Логічні змінні

Змінні логічного типу можуть мати всього два значення - True і False. Найчастіше вони застосовуються для "включення" або "виключення" деякої ознаки або умови в програмі. Логічні змінні нерідко використовуються для повернення логічних значень з функцій, що викликаються. Код повернення рівний True, якщо робота функції завершилася успішно, і False - у разі невдачі. Ми скористаємося логічним типом для написання функції, яка визначає, чи існує на диску файл із заданим ім'ям,:

1. Створіть новий проект командою File > New Project.

2. У вікні Project Wizard виберіть значок Standard EXE.

3. Створіть на формі Form1 текстове поле і задайте його властивості Name значення txtFilename.

4. Очистите властивість Caption текстового поля - для цього слід двічі клацнути на властивості Caption у вікні властивостей і видалити текст Textl.

5. Створіть на формі кнопку. У вікні властивостей задайте її властивості Name значення

cmdSearch, а властивості Caption - значення &Search.

6. Двічі клацніть на формі Form1, щоб відкрити вікно програми.

7. Введіть у вікні програми початковий текст функції IsFile:

Private Function IsFile(Filename As String) As Boolean

If Len(Dir$(Filename))> 0 Then

IsFile = True

Else

IsFile = False

End If

End Function

8. Виберіть рядок cmdSearch із списку об'єктів (у лівій верхній частині вікна програми), що розкривається. При цьому буде автоматично вибрано подію Click.

9. Додайте наступний фрагмент в процедуру події Click кнопки cmdSearch:

Private Sub cmdSearch_Click()

Dim filename As String

Dim rc As Boolean

filename = txtFilename.Text

rc = IsFile(filename)

If rc = True Then

MsgBox "Файл існує"!

Else

MsgBox "Файл не знайдений"!

End If

End Sub

10.Запустіть програму.

Щоб перевірити, як працює написана функція, введіть в текстовому полі ім'я файлу. Якщо файл існує, IsFile повертає логічне значення True, інакше повертається False. Зверніть увагу на використання строкової змінної filename, передаваній як параметр функції IsFile. Значення filename задається в процедурі події Click кнопки cmdSearch.

Універсальні змінні

Універсальні змінні можуть набувати будь-якого значення (ціле, байтове, строкове або логічне) і перетворювати його в будь-який тип. Якщо змінна використовується без явного оголошення оператором Dim, Visual Basic вважає, що вона відноситься до універсального типу.

Універсальний тип даних на перший погляд здається зручним, але я повинен попередити вас: користуйтеся ним лише в тих випадках, коли у вас немає іншого вибору. Універсальні змінні повільно працюють, оскільки Visual Basic вимушений витрачати час на їх інтерпретацію. До того ж вони даремно витрачають пам'ять - під універсальну змінну виділяється область, достатня для зберігання рядка, навіть якщо насправді потрібно всього один байт.

Зона видимості змінних

Змінні, з якими нам доводилося мати справу досі, оголошувалися словом Dim (скорочення від Dimension, тобто "розмірність"). Воно оголошено в процедурі. При цьому звертатися до такої змінної можна лише з тієї ж процедури. Іншими словами, ви не зможете визначити або задати її значення з іншої процедури, що знаходиться в тій же або іншій формі або в стандартному модулі.

Такі змінні називаються локальними (тобто видимими тільки в цій процедурі). Щоб змінна була видна на рівні модуля, її необхідно оголосити трохи інакше. По-перше, оголошення повинне знаходитися в секції(Declarations) форми або стандартного модуля. По-друге, замість Dim використовується ключове слово Private (хоча Dim також підтримується для забезпечення сумісності з більше ранніми версіями Visual Basic). Оголошена у такий спосіб змінна доступна на рівні модуля, і до неї можна звертатися з будь-якої процедури цього модуля - її зона видимості ширша, ніж у локальних змінних (мал. 7.6).

Projectl.Vbp

Мал. 7.6. Зона видимості змінних.

Крім того, змінна може бути доступна на рівні усього застосування. Такі змінні часто називаються відкритими, або глобальними. Вони оголошуються в секції(Declarations), але замість Dim або Private використовується ключі-витті слово Global. Зазвичай в таких випадках в проект включається стандартний модуль з розширенням .BAS, а усі глобальні змінні поміщаються в його секцію оголошень.

Щоб краще зрозуміти, чим відрізняються зони видимості, розглянемо наступний приклад:

1. Створіть новий проект.

2. У вікні Project Wizard виберіть значок Standard EXE.

3. Додайте в проект модуль - для цього слід клацнути правою кнопкою миші у вікні проекту і вибрати з контекстного меню команду Add > Module.

4. У діалоговому вікні Add Module виберіть значок Module. Створений модуль Module1 відкривається у вікні програми.

5. У вікні програми додайте наступний фрагмент:

Option Explicit

Global UserID As String

Global ACL As Integer

6. Додайте в модуль Module1 наступну процедуру:

Public Sub InitApp()

UserID = "Джо"

ACL = 255

End Sub

Перш ніж йти далі, давайте уважніше розглянемо два останні кроки. Оголошення змінних UserID і ACL c ключовим словом Global дозволяє звернутися до них з будь-якої процедури або модуля цього застосування. Оскільки функція InitApp знаходиться усередині модуля і супроводжується ключовим словом Public, вона є глобальною і може бути викликана з будь-якої процедури додатка. У ній відбувається ініціалізація додатка - змінній UserID привласнюється значення "Джо", а змінній ACL - 255. Тепер давайте створимо форму для реєстрації користувача:

1. Двічі клацніть на формі Form1 у вікні проекту, щоб активізувати її в конструкторі форм.

2. У вікні властивостей задайте властивості Name форми Form1 значення frmLogon, а властивості Caption - значення Реєстрація користувача.

3. Створіть на формі напис. Задайте властивості Name значення lblUserID, а властивості Caption - Ім'я користувача:.

4. Створіть під lblUserID ще один напис, задайте властивості Name значення

lblPassword, а властивості Caption - значення Пароль:.

5. Додайте текстове поле праворуч від першого напису і задайте його властивості Name значення txtUserID.

6. Додайте текстове поле праворуч від другого напису. У вікні властивостей задайте його властивості Name значення txtPassword, а властивості PasswordChar - символ "зірочка" (*).

7. Розмістите кнопку в середині нижньої частини форми. Задайте її властивості Name значення cmdLogon, а властивості Caption - значення &Реєстрація.

Після того, як на формі з'являться усі перераховані елементи, вона повинна виглядати приблизно так, як показано на мал. 7.7.

Мал. 7.7. Форма для реєстрації користувачів.

8. Відкрийте вікно програми подвійним клацанням на формі Form1.

9. Розташуєте курсор зліва від рядка Option Explicit секції(Decla - rations) форми Form1.

10. Двічі натисніть на клавішу Enter, щоб вставити перед Option Explicit два порожні рядки.

11. Введіть наступний рядок над Орtion Explicit:

Private Password As String

12. Відкрийте процедуру події Load форми і додайте наступний фрагмент:

Private Sub Form_Load()

InitApp

txtUderID.Text = UserID

txtPassword.Text = ""

End Sub

13. У вікні програми відкрийте процедуру події Click кнопки cmdLogon і додайте в неї наступний фрагмент:

Private Sub cmdLogon_Click()

Dim msg As String

UsertID = txtUser.Text

Password = txtPassword.Text

msg = "Ім'я користувача: " & UserID & Chr$(13)

msg = msg & "Пароль: " & Password & Chr$(13)

msg = msg & "ACL: " & Str$(ACL)

End Sub

14. Запустіть програму командою Run > Start.

Зверніть увагу на те, що в полі Ім'я користувача міститься ім'я "Джо". Це значення було узяте з глобальної строкової змінної з ім'ям UserID. Змінна не оголошується в процедурі події Form_Load, вона оголошена глобальною в модулі Module1.

Змінна для зберігання пароля також заслуговує на увагу. Вона була оголошена в секції(Declarations) форми. Звертатися до неї можуть тільки функції цієї форми. Це важливо, тому що інша частина програми не має права змінювати пароль користувача. Говорять, що змінна пароля доступна лише в модулі форми.

Введіть будь-який текст в поле Пароль: і натисніть кнопку Реєстрація. Процедура події Click використовує змінні модуля і глобальні змінні для відображення інформації про користувача.

Ключове слово Static

Окрім змінних рівня процедури (Dim) існує ще один спосіб оголошення змінних - з ключовим словом Static:

Static X As Integer

Це означає, що змінна зберігатиме останнє присвоєне нею значення навіть після завершення процедури. Статичні змінні зручні для зберігання поточного значення накопичуваної суми. Якщо пропустити ключове слово Static (і скористатися замість нього Dim), то при кожному запуску процедури змінна обнулюватися разом з іншими числовими змінними. Розглянемо наступний приклад, в якому показана статична змінна у дії. Відвідаєте кафетерій Sybex і замовте в нім усе, що вам завгодно. Кава подається безкоштовно, але попереджаю - туалету тут немає! Якщо ви відчуваєте спрагу або потребуєте "хорошої дози кавового допінга", поступите так:

1. Створіть новий проект типу Standard EXE.

2. Задайте властивості Caption форми Form1 значення Кафетерій Sybex.

3. Створіть напис в середині верхньої частини форми. У вікні властивостей задайте її властивості Name значення lblQuantity, а властивості Caption - значення Замовлене каві;0.

4. Створіть кнопку під написом lblQuantity. Задайте її властивості Name значення cmdAdd, а властивості Caption - значення &Принесіть ще!.

5. Двічі клацніть на кнопці cmdAdd в конструкторі форм, щоб відкрити вікно програми.

6. Вставте наступний код в процедуру події Click кнопки cmdAdd:

Private Sub cmdAdd_Click()

Static count As Integer

count = count + 1

lblQuantity = "Замовлений каві:" & Str$(count)

End Sub

7. Запустіть програму і натисніть кнопку, щоб замовити будь-яку кількість чашок кави.

Змінна count в процедурі події Click оголошена статичній (Static), завдяки чому її значення зберігається між подіями. В результаті змінна пам'ятає, скільки чашок кави ви встигли замовити.

Масиви

Масиви можна вважати різновидом змінних, проте в них зберігається відразу декілька значень. Наприклад, електронна таблиця є масивом осередків. Масив можна використовувати для зберігання записів невеликої бази даних або червоного, зеленого і синього (RGB) компонентів растрового зображення. Хоча масиви використовуються дещо рідше за змінних, вони відіграють важливу роль в розробці програм. У наступному прикладі оголошується масив чисел цілого типу, а потім його елементам привласнюються значення:

Static X(2) As Integer

X(0) = 7

X(1) = 99

X(2) = 123

Для обробки масивів часто застосовується цикл For..Next, в якому в якості лічильника використовується цілочисельна змінна (мал. 7.8):

Dim Y As Integer

For Y = 0 To 2

Print X(Y)

Next Y

Мал. 7.8. Використання циклу For..Next.

Цей фрагмент виводить на поточній формі значення кожного елементу цілого масиву X (числа 0,1 і 2 використовуються як посилання на елементи). Щоб створений масив був доступний на рівні модуля, оголосите його з ключовим словом Dim в секції(Declarations) модуля. Якщо ж масив має бути доступний на рівні додатка, оголосите його з ключовим словом Public. Наступний приклад показує, як працювати з масивами:

1. Створіть проект типу Standard EXE.

2. Видалите з нового проекту форму Form1. Для цього слід клацнути на рядку Forml правою кнопкою миші у вікні проекту і вибрати команду Remove Forml з контекстного меню.

3. Додайте в проект новий модуль - клацніть правою кнопкою миші у вікні проекту і виберіть команду Add > Module з контекстного меню.

4. У діалоговому вікні Add Module виберіть значок ModuLe.

5. У вікні програми модуля Module1 додайте наступну процедуру:

 Sub Main()

Dim x(7) As Integer

Dim i As Integer

Dim txt As String

‘ Заповнити масив бітовими значеннями

For i = 0 To 7

x(i) = 2 ^ i

Next

‘ Вивести масив

For i = 0 To 7

txt = "Елемент масиву " & Str$(i) & " ="

txt = txt & x(i)

Next

End Sub

6. Запустіть програму і простежите за вікном відладки.

У першій частині фрагмента оголошуються змінні, необхідні для роботи програми. Масив x повинен містити 8 елементів (з індексами від 0 до 7). Змінна i використовується в циклах For..Next, а в рядку txt виконується форматування результату.

Перший цикл For..Next заповнює масив. Відповідно до формули

x(i) = 2 ^ i

кожному елементу привласнюється значення чергової міри двійки. Не турбуйтеся про математичну сторону що відбувається - тут обчислення використані лише для прикладу.

Останній цикл For..Next форматує змінну txt, а команда Debug. Print виводить її у вікні відладки.

Динамічні масиви

Нерідко розмір масиву (тобто кількість елементів, що зберігаються в нім) не може бути визначений заздалегідь. У такому разі слід оголосити порожній масив. Масив, який на початку свого життєвого циклу не містить жодного елементу, називається динамічним. Він оголошується майже так само, як і звичайний масив, за винятком того, що в процедурі можна використовувати як ключове слово Dim, так і Static:

Dim Y() As Integer

Було б марнотратне створювати масив свідомо більшого розміру, чим вам потрібно. Щоб вийти з положення, слід створити динамічний масив, що не містить жодного елементу (см вищий), і потім додавати в нього елементи у міру потреби. Ця методика особливо корисна при роботі з великою кількістю елементів.

Потім в масив необхідно додати елементи, в яких зберігатимуться значення. Для цього використовується оператор ReDim, який може зустрічатися тільки в процедурах,:

ReDim Y(5)

Створеним елементам слід присвоїти значення. Пізню кількість елементів масиву знову можна змінити:

ReDim Y(7)

Після виконання цього оператора усі значення, що зберігаються в масиві, втрачаються. Щоб зберегти їх, користуйтеся ключовим словом Preserve:

ReDim Preserve Y(7)

Константи

Константи мають деяку схожість із змінними - вони теж оголошуються і їм привласнюються значення. Проте у відмінності від змінних, значення констант залишаються незмінними упродовж усього життєвого циклу додатка. Використання констант зазвичай спрощує програмування - набагато простіше зрозуміти і відналагодити програму із змінною vbModal, чим стежити за долею якої-небудь безіменної змінної зі значенням 1. Одночасно з оголошенням константи їй привласнюється значення. Для цього використовується ключове слово Const:

Const conPi = 3.142

Приведений нижче фрагмент демонструє можливості практичного застосування констант:

Const conPi = 3.142

Dim Radius As Integer

Dim Area As Double

Option Explicit

Private Sub cmdPrintArea_Click()

Radius = 3

Area .= conPi * (Radius ^ 2)

Print Area

End Sub

Цей фрагмент обчислює площу круга, використовуючи константу з ім'ям conPi (префікс con необов'язковий, хоча і бажаний). Вичислена площа круга виводиться на поточній формі (мал. 7.10).

Мал. 7.10. Результат обчислення площі круга.

Константи можна оголошувати як в процедурах, так і в секціях оголошень модулів. Щоб створити константу, доступну на рівні додатка, вкажіть при її оголошенні ключове слово Global, - наприклад Global Const Pi = 3.142.

Правильний вибір змінних для поставленого завдання є питанням першорядної ваги. Він не лише економить час при відладці, але і допомагає написати компактнішу програму і привчає до дисципліни програмування. Не можна побудувати будинок, користуючись однією викруткою, - існує велика кількість інструментів, і кожен з них вирішує свою задачу. To же саме відноситься і до змінних. Прагніть правильно підбирати засоби для вирішення конкретного завдання.

Що нового ми дізналися?

  •  Вибирати тип змінних для конкретних завдань.
  •  Користуватися масивами для зберігання інформації.
  •  Визначати константи і працювати з ними в програмах.


З
міст

ВСТУП………………………………………………………………………...

3

Урок 4. Робота з модулями і класами ………………………………………..

4

Процедури ………………………………………………………………………..

7

Функції …………………………………………………………………………...

8

Передача параметрів …………………………………………………………….

13

Урок 5. Створення і використання меню і панелей інструментів ……….

30

Урок 6. Логіка і послідовність виконання програми ……………………...

43

Логічні оператори AND, EQV, OR, XOR, NOT ………………………………..

43

Оператор If..Then..Else …………………………………………………………..

59

Оператор Select Case..End Select ………………………………………………..

61

Цикл For..Next …………………………………………………………………....

62

Цикл Do..Loop ……………………………………………………………………

63

Цикл While..Wend ………………………………………………………………..

64

Урок 7. Змінні …………………………………………………………………...

69


 

А также другие работы, которые могут Вас заинтересовать

82410. В. В. Бианки «Музыкант» 63 KB
  Цели: образовательные: познакомить с творчеством В. В. Бианки, с его рассказами, учить находить главную мысль. Развивающие: совершенствовать навыки беглого, правильного, осознанного и выразительного чтения, развивать монологическую речь, память, внимание, воображение, обогащать словарный запас.
82411. Споры о метафизике в современной зарубежной философии 26.34 KB
  Действительно любая позиция является таковой только в силу своей выраженности в языке и следовательно отсутствие что влечет за собой поиски как. Текстом является всё. При этом в духе Гегеля это всё является тождественным ничто. В соответствии с ней значение какоголибо утверждения если это утверждение не является аналитическим или конвенциональным должно сводиться к чувственным восприятиям; если для какогото утверждения указать такие восприятия невозможно то такое утверждение считается бессмысленным.
82412. Философия языка (М. Хайдеггер, Г.-Г. Гадамер, Л. Витгенштейн, М. Фуко и др.) 41.05 KB
  Важное место в философии Хайдеггера занимает проблема понимания и языка. Хайдеггер отмечал что хотя язык изучается многими науками языкознанием логикой психологией и другими науками они не способны проникнуть в сущность языка. Они не могут этого сделать поскольку совершают грубую ошибку не понимая монологического характера языка.
82413. Неокантианство 36.93 KB
  Ничто в рамках мыслительных потенций университетской философии не указывало на возможность какойлибо продуктивной кооперации между Гегелем и скажем Г. Налицо оказывалась двоякая угроза: научно несостоятельной философии с одной стороны и философски беспризорной науки – с другой. Если опасность научно не фундированной философии лежала в ее открытости мистическим соблазнам то опасность философски не защищенной науки заключалась в стихийных порывах наивно материалистического толкования. спор о материализме в результате которого...
82414. Неогегельянство 29.04 KB
  Стерлинга впервые познакомившего англичан с философией Гегеля Э. внеэмпирической реальности Брэдли; в тенденция к преодолению крайностей абсолютного идеализма Брэдли стремление отстоять права индивидуальности ее свободу: эта тенденция проявилась в умеренном персонализме Бозанкета и радикальном персонализме МакТаггарта которые пытались сочетать гегелевское учение об Абсолюте с утверждением метафизической...
82415. Неомарксизм 32.06 KB
  Первое что предлагают сделать неомарксисты это отказаться от положения марксизма о всемирноисторической роли пролетариата в качестве субъекта социалистической революции и могильщика капитализма. При господстве одномерного сознания одномерный человек этого общества не способен ни выработать ни даже воспринять то революционное социалистическое сознание которое согласно марксизмаленинизма является непременным условием и предпосылкой пролетарской социалистической революции. Второе субъектом революции могут стать лишь те кто еще...
82416. Философия жизни 46.62 KB
  Сознание дух только средства и орудия на службе у жизни. Метафизика это проектированиетотальности жизни на бытие. Все метафизические истолкования и интерпретации мира покоятся напереживании жизни.
82417. Психоанализ З. Фрейда. Фрейдизм, неофрейдизм 28.64 KB
  Классическая психология до Фрейда изучала явления сознания как они проявлялись у здорового человека. Фрейд как психопатолог исследуя характер и причины неврозов натолкнулся на ту область человеческой психики которая раньше никак не изучалась но которая имела большое значение для жизнедеятельности человека бессознательное. Особое значение Фрейд придает психосексуальному развитию человека влиянию его инстинктивной сексуальнобиологической энергии либидо на жизнь его чувств и поведение. В дальнейшем поведение ребенка а затем юноши и...
82418. Феноменология Э. Гуссерля: идейно-теоретические истоки, основные идеи, понятия, этапы развития 38.34 KB
  Феноменология Гуссерля – широкое в потенции бесконечное поле методологических а также гносеологических онтологических этических эстетических социальнофилософских исследований любой темы философии через возврат к феноменам сознания и их анализу. Результатом исполнения феноменологической редукции является перемещение на исследовательскую почву чистого сознания; 4 чистое сознание есть смоделированное феноменологией сложное единство структурных элементов и сущностных взаимосвязей сознания. Оригинальность и теоретическая значимость...