Поради тим, хто програмує на visual basic

Андрій Колесов, Ольга Павлова

Рада 246. Як зробити тимчасову затримку

У версіях MS Basic для DOS був корисний оператор тимчасової затримки

який призупиняв виконання програми на вказане число секунд. Такого оператора в VB не існує, але його неважко реалізувати самостійно у вигляді такої простої підпрограми:

Тут потрібно звернути увагу на використання функції DoEvents, яка дозволяє виробляти інші процеси паралельно з виконанням поточного циклу. (DoEvents передає управління операційній системі, а сама функція повертає число відкритих форм в даному VB-додатку.)

Старий оператор SLEEP здійснював затримку виконання на задане число секунд або до натискання будь-якої клавіші клавіатури. (В Basic / DOS з ним були свої проблеми, так як код натиснутоюклавіші залишався в буфері клавіатури і автоматично використовувався в подальших операціях введення. Для запобігання подібної ситуації після оператора SLEEP потрібно було очищати буфер.)

При бажанні такий режим можна реалізувати і в нашій функції SleepVB. Один з її варіантів, а також необхідність застосування функції DoEvents ми покажемо в наступному прикладі.

Я помітив, що процедура SleepVB завантажує процесор на 100%, модифікував її наступним чином.

Тепер завантаження 0 - 1% ЦП.

Рада 247. Як зробити заставку при старті VB-програми або VBA-документа

Як зробити, щоб при запуску VB-програми з'являлася якась заставка-форма, яка б автоматично зникала після завершення завантаження програми? Для цього найкраще використовувати варіант старту програми з підпрограми Main (встановлюється командою Project Properties | General | Strartup Object), яка може виглядати приблизно так:

Зверніть увагу, що форма-заставка з'являється тут тільки на дуже короткий час (в даному випадку, на час завантаження frmMain) і тут же зникає. Як зробити тимчасову затримку, ми покажемо нижче.

Тепер у вікні Project відкриємо вузол Microsoft Word Objects і двічі клацнемо з'явився в ньому стандартний елемент ThisDocument (в Excel це відповідно Microsoft Excel Objects | ThisWorkbook). У вікні коду в списку зумовлених подієвих процедур (у правому верхньому куті) знайдемо підпрограму Open. Саме їй передається керування в момент відкриття документа і сюди можна помістити будь-який код для виконання необхідних стартових операцій. Помістимо в неї наступний програмний код (рис. 247-2):

Мал. 247-2 Для перевірки роботи цієї процедури потрібно спочатку зберегти і закрити документ, а потім заново відкрити його.

Порада: Щоб уникнути постійного закриття-відкриття документа для проведення налагодження, змініть в описувач Sub Document_Open ключове слово Private на Public. У цьому випадку дана процедура автоматично потрапить в список макрокоманд документа, і ви зможете звертатися до неї будь-який момент без перезавантаження документа.

Однак, запустивши процедуру Document_Open, ми виявимо, що характер її роботи відрізняється від того, як вона функціонує в звичайному Visual Basic: тут форма- заставка не зникає до тих пір, поки користувач сам не закриє її.

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

Різниця в поведінці форми-заставки в VB і VBA полягає в тому, що завдяки використовуваному за замовчуванням параметру методу Show в першому випадку форма відкривається в немодальному режимі, а в другому - в модальному.

Як нам зробити, щоб форма-заставка не мелькає на екрані, а залишалася деякий мінімальний час, наприклад 5 секунд? Для цього можна скористатися підпрограмою тимчасової затримки SleepVB, наведеної в Раді 246, і тоді код відкриття документа буде виглядати наступним чином:

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

Для усунення цих недоліків нам доведеться написати програмний код тимчасової затримки безпосередньо всередині нашої стартової процедури:

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

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

Як нам тепер дати можливість користувачеві скоротити час затримки, наприклад, закривши форму-заставку клацанням миші? Тут можуть бути два варіанти в реалізації циклу очікування.
  • Аналіз числа відкритих форм:

    Але цей варіант не дуже хороший, тому що до цього моменту можуть бути відкриті ще які-небудь інші форми додатка (в процедурі StartAllOperations). Тому краще скористатися іншим способом.

  • Аналіз стану форми-заставки:

    Ось, власне, і все з приводу створення стартових заставок. Зверніть увагу, що реалізація цих програмних конструкцій в VB і VBA практично однакова.

    Рада 248. Як вивчати програмування в середовищі VBA

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

    Відповідь на ці запитання досить простий: вивчайте матеріали з програмування в середовищі звичайного VB. Що стосується власне самого програмування, MS Office і VB перетинаються на 70-80 відсотків. І не треба дивуватися, що в книгах по "Office / VBA" питання технології написання коду часто висвітлюються досить скупо. Просто ці теми розглядаються більш докладно в інших книгах.

    Рада 250. Як перекодувати поштові повідомлення

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