Поради тим, хто програмує Visual Basic
Андрій Колесов, Ольга Павлова
Порада 234. Використовуйте властивість ItemData елемента керування ListBox для зберігання ідентифікаторів
Часто при заповненні елемента управління ListBox інформацією бази даних буває необхідно, щоб цей компонент не тільки виводив описи елементів бази даних, але і зберігав деякі ключові значення. Наприклад, якщо вікно списку містить імена співробітників, напевно, буде корисно зберігати тут також їхні персональні ідентифікатори. У тому випадку, якщо ви використовуєте числові ідентифікатори, VB надає можливість здійснити це за допомогою властивості ItemData компонента ListBox, яка дозволяє зберігати додаткове число кожного елемента списку. Проілюструємо це на такому прикладі. Помістіть вікно списку на стандартну форму та введіть наступний код:
Запустіть проект на виконання – у вікні списку виводяться лише імена співробітників. Клацніть будь-який з елементів, і на екрані з'явиться вікно повідомлення, яке містить ім'я обраного співробітника та його ідентифікатор.
Порада 235. Як правильно згенерувати значення ADO RecordCount у VB
Як відомо, властивість ADO RecordCount повертає кількість записів набору записів ADO. Однак у деяких випадках ця властивість повертає значення, що дорівнює -1. Чому так відбувається? Справа в тому, що значення, яке повертається властивістю RecordCount, залежить від типу курсору в наборі записів: -1 для курсору, що переміщується лише вперед; реальна кількість записів – для статичного курсору або курсору, керованого клавішами на клавіатурі; -1 або реальна кількість записів – для динамічного курсору залежно від джерела даних.
Однак вам буде цікаво дізнатися, що значення RecordCount дорівнює -1 для наборів записів, створених за допомогою методуExecute для об'єкта Connection або Command. Це тому, що даний метод генерує набір записів, переміщатися яким можна лише вперед і який повертає, як ми згадували вище, -1. Як приклад створіть наступну підпрограму усередині стандартного VB-проекту. (Не забудьте встановити посилання на Microsoft ActiveX Data Objects 2.1 Library та змінити шлях до бази даних Biblio.mdb відповідно до того, де воно зберігається на вашому комп'ютері.) Запустіть проект на виконання і ви побачите вікно повідомлення, яке містить такі значення: -1 для набору записів на базі myConRst та 6246 – для myKeyRst.
Порада 236. Нехай VB сам визначає, чи є у дисководі CD-ROM компакт-диск чи ні
Щоб швидко визначити, чи не забув користувач вставити компакт-диск у дисковод CD-ROM, використовуйте властивість IsReady для об'єкта Drive. Ця властивість повертає значення True тільки в тому випадку, якщо компакт-диск знаходиться у пристрої CD-ROM. Розглянемо наступний приклад. Встановіть посилання на бібліотеку Microsoft Scripting Runtime (scrrun.dll), а потім створіть змінну Drive для дисководу CD-ROM. Протестуйте властивість IsReady, як показано нижче:
Порада 237. Як додати новий елемент до системного меню форми
У деяких випадках вам може захотітись додати додатковий елемент до системного меню форми. (Кнопка системного меню знаходиться у верхньому лівому кутку форми.) Для цього скористайтеся трьома API-функціями - GetSystemMenu, AppendItemMenu та DrawMenuBar:
Як видно з наведеного вище коду, підпрограма знаходить покажчик копії системного меню поточної форми. Потім вона додає рядок "Свій елемент меню" до списку команд системного меню, і нарешті перемальовує меню, додаючи новий текст до кінця списку.
Команду DrawMenuBar слід використовувати завжди при зміні системного меню, навіть якщо воно є невидимим.
Те, що ви просто додали нову команду до системного меню, зовсім не означає, що вона виконуватиме якусь операцію: для цього необхідно написати відповідний код. Функція AppendMenu пропонує кілька різних параметрів, що описують елемент, який потрібно додати до системного меню. Повний список цих параметрів міститься у файлі Довідки.
Слід пам'ятати також, для функції AppendMenu є потужніший аналог — нова API-функція InsertMenuItem, яка хоч і пропонує ширші можливості керування, водночас є набагато складнішою у використанні. Тому якщо ви просто хочете помістити додатковий елемент до кінця списку команд системного меню, для цього найкраще підійде функція AppendMenu.
Порада 238. Як швидко здійснити перевірку на наявність певного елемента у списку
Після цього за допомогою функції Instr() визначте, чи містить новий рядок потрібний елемент:
Порада 239. Використовуйте для об'єктів ADO рідні драйвери OLEDB замість драйверів ODBC
При створенні рядка з'єднання (connection string) для об'єктів ADO є можливість встановити драйвер джерела даних або як Driver, наприклад так:
або як Provider, на кшталт наступного:
Однак у першому випадку об'єкт ADO використовує більш старі драйвери ODBC для зв'язку з джерелом даних, тоді як у другому — застосовується OLEDB, що є рідним для інтерфейсом ADO доступу до даних. Тому завжди, коли це можливо, скористайтеся варіантом Provider. Нагадуємо, що рідні драйвери OLEDB існують для SQL Server, Index Server, Site Server Search та Oracle.
Порада240. Як модифікувати елемент керування DataGrid за допомогою зміни набору записів
Елемент управління DataGrid, що входить до складу VB 6.0, є добрим засобом для представлення даних у табличному вигляді. Однак у ньому є кілька помилок, частина з яких була виправлена в Service Patch 3, але деякі з них все ж таки залишилися. Наприклад, якщо ви зв'яжете елементи керування DataGrid та DataEnvironment, потім змініть набір даних, що використовується в DataEnvironment, та оновіть DataGrid за допомогою методу Refresh, цей компонент залишиться незмінним. На жаль, метод Refresh не працює, коли властивість DataSource елемента керування DataGrid встановлена як DataEnvironment. Тому, щоб відобразити зміни, зроблені в наборі даних елемента управління DataEnvironment, слід спочатку оновити ці дані, а потім повторно зв'язати DataGrid з DataEnvironment. Тому, якщо у вас є кнопка Refresh, подія Click може виглядати так:
Тепер, коли ви натисніть кнопку Refresh, наведений вище код повторно зв'яже елементи керування DataEnvironment і DataGrid, а потім знову заповнить останній з них оновленими даними.
Порада 241. Як запустити на виконання VB-додаток у процесі ініціалізації Windows
Залежно від версії Windows, в якій ви працюєте, існують два різні способи виконати VB-програму в процесі завантаження системи. Для Windows 9x помістіть команду Shell у розділі [Boot] файлу System.ini, наприклад так:
Для Windows NT/2000 використовуйте ту ж саму команду Shell у Системному Реєстрі (Registry) у розділі
Проте будьте обережні, виконуючи подібні модифікації, оскільки це може призвести до некоректної роботи Windows.
Порада 242. Як відновити коротке ім'я файлу VBбез допомоги API-функцій
У багатьох випадках може виникнути потреба зробити посилання на файл відповідно до угоди про імена файлів 8.3. Ви, безперечно, неодноразово зустрічали такі імена в MS-DOS. Наприклад, використовуючи цю угоду, папка Program Files перетворюється на Progra
1. Тому вам приємно буде дізнатися про те, що VB 6.0 з'явилася можливість відновлювати короткі імена файлів, не звертаючись до API-функції GetShortPathName. Як альтернатива нова бібліотека Scripting Runtime пропонує властивість ShortPath для об'єктів File та Folder. Щоб отримати коротке ім'я файлу, просто додайте посилання до Microsoft Scripting Runtime і введіть наступний код:
Порада 243. Створюйте тимчасові VB-файли за допомогою API-функції
Якщо ви коли-небудь працювали з Word або іншою програмою Office, ви, ймовірно, звернули увагу, що кожного разу при відкритті файлу Office створює тимчасовий файл, в якому зберігаються всі зміни. І тоді у вас могло виникнути питання, як створювати довільні тимчасові файли у своєму власному VB-додатку. Для цього скористайтеся API-функцією GetTempFileName:
Після цього відкрийте нову форму та введіть наступний код у її подію Click. (Замініть D:\Articles\IVB на будь-який допустимий шлях.)
Запустіть проект на виконання. Заданий вами каталог містить тимчасовий файл, ім'я якого було виведено у вікні повідомлення.
Зверніть увагу, що для того, щоб наведена вище функція працювала належним чином, ви повинні задати тільки допустимий шлях. В іншому випадку функція GetTempFileName поверне 0 і нульовий параметр як ім'я файлу Windows NT. У Windows 9x неправильно вказаний шлях також поверне 0, а параметр lpTempFileName не міститиме ім'я тимчасовогофайлу.
Порада 244. Як перетворити число на рядок з фіксованою кількістю цифр
Іноді потрібно вивести числа з фіксованою кількістю цифр, коли спереду додаються нулі. Наприклад, якщо потрібно представити число 12345 у вигляді 0012345. Це легко можна здійснити за допомогою такої функції:
Порада 245. Використовуйте режим Option Explicit
Ігор хотів підключити DLL-процедуру, написану на Фортрані, до VB. Питання коректної передачі параметрів у DLL не зовсім тривіальне, тому ми порадили йому почати з налагодження якогось простого випадку, наприклад, з передачі імені файлу, який потрібно прочитати в DLL, у вигляді рядкової змінної.
Із зовнішнього боку тестовий приклад виглядав правильно:
Звернення до DLL з VB:
Надіславши цей приклад, Ігор повідомив, що він уже два дні безуспішно бореться з ним, причому зазвичай відбувається аварійне завершення програми з "миттєвим зникненням середовища VB". Він випробував різні варіанти передачі імені файлу, у тому числі з використанням байтових масивів та структур даних, але з тим самим невдалим результатом. Роздрук змінної pfn вперто показувала відсутність потрібного імені файлу. А може, тут проблема в плутаниці ANSI/Unicode? Або "глючить" Windows 98 Second Edition?
Однак "скринька просто відкривалася". Насправді у VB-програмі Ігоря використовуються дві різні змінні: у першому та третьому рядках зазначена змінна "cc" (обидві літери латинські), а в другому — "сc" (перша літера українська).
Визначити це на погляд просто неможливо, але ми завжди застосовуємо режим Option Explicit, тому компілятор відразу ж повідомив, що в другому рядку використовується невизначена змінна. Ми, звичайно, спочатку не повірили своїм очам, але потім згадали ситуацію з часів DOS,коли у нас був встановлений якийсь русифікатор клавіатури, у якого перемикання українською мовою часом спрацьовувало тільки після натискання першої клавіші. В результаті під час введення такого тексту
виявлялося, що у слові "спить" перша літера - англійська. Помітити різницю було неможливо (с і с знаходяться на одній клавіші). У цьому зв'язку ще одна порада: намагайтеся використати шрифти, які використовують різні зображення зовні схожих українських та латинських літер.
Після виправлення ідентифікатора приклад став нормально працювати. Таким чином, для того щоб не втрачати кілька днів на налагодження, і потрібно було всього лише встановити режим Option Explicit (який автоматично визначається командою ToolsOptionsEditorRequired Variable Declaration).