Съвети за програмисти на Visual Basic

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

Съвет 234 Използвайте свойството ItemData на контролата ListBox, за да съхранявате идентификатори

Често, когато попълвате контрола ListBox с информация от база данни, е необходимо контролата ListBox не само да показва описания на елементите на базата данни, но и да съхранява някои ключови стойности. Например, ако списъчното поле съдържа имената на служителите, може да е полезно да съхранявате и техните лични идентификатори тук. В случай, че използвате цифрови идентификатори, VB предоставя начин да направите това, като използвате свойството ItemData на ListBox, което ви позволява да съхранявате допълнителен номер за всеки елемент от списъка. Нека илюстрираме това с пример. Поставете списъчно поле в стандартен формуляр и въведете следния код:

Стартирайте проекта за изпълнение - в прозореца със списък се показват само имената на служителите. Щракнете върху някой от елементите и на екрана ще се появи поле за съобщение, съдържащо името на избрания служител и неговия ID.

Съвет 235: Как правилно да генерирате ADO RecordCount стойности във VB

Както знаете, свойството ADO RecordCount връща броя на записите в ADO Recordset. В някои случаи обаче това свойство връща стойност -1. Защо се случва това? Това е така, защото стойността, върната от свойството RecordCount, зависи от типа на курсора в набора от записи: -1 за курсор само за напред; действителният брой въведени данни - за статичен курсор или курсор, управляван с клавиши на клавиатурата; -1 или действителния брой записи за динамичен курсор, в зависимост от източника на данни.

Въпреки това ще ви е интересно да научите, че стойността на RecordCount е -1 за набори от записи, създадени с помощта наИзпълнете върху обекта Connection или Command. Това е така, защото този метод генерира набор от записи, който може да се навигира само напред и който връща -1, както споменахме по-горе. Като пример, създайте следната подпрограма в стандартен VB проект. (Не забравяйте да се свържете с Microsoft ActiveX Data Objects 2.1 Library и да промените пътя към базата данни Biblio.mdb, за да съответства на мястото, където се съхранява на вашата машина.) Стартирайте проекта и трябва да видите поле за съобщение, съдържащо следните стойности: -1 за набор от записи, базиран на myConRst и 6246 за myKeyRst.

Съвет 236 Нека VB определи дали има CD в CD-ROM устройството или не

За да определите бързо дали потребителят е забравил да постави компактдиск в CD-ROM устройството, използвайте свойството IsReady на обекта Drive. Това свойство връща True само ако компактдискът е в CD-ROM устройството. Помислете за следния пример. Задайте връзка към библиотеката на Microsoft Scripting Runtime (scrrun.dll) и след това създайте променлива за устройство за CD-ROM устройството. Тествайте свойството IsReady, както е показано по-долу:

Съвет 237. Как да добавите нов елемент към системното меню на формата

В някои случаи може да искате да добавите допълнителен елемент към системното меню на формуляра. (Бутонът на системното меню се намира в горния ляв ъгъл на формуляра.) За да направите това, използвайте три API функции - GetSystemMenu, AppendItemMenu и DrawMenuBar:

Както можете да видите от кода по-горе, подпрограмата намира указател към копие на системното меню на текущия формуляр. След това добавя низа „Елемент от менюто по избор“ към списъка с команди на системното меню и накрая преначертава менюто, като добавя новия текст в края на списъка.

Командата DrawMenuBar винаги трябва да се използва при промяна на системното меню, дори ако в момента е невидимо.

Това, че току-що сте добавили нова команда към системното меню, не означава, че тя ще извърши някаква операция: трябва да напишете подходящия код за това. Функцията AppendMenu предлага няколко различни опции, които описват елемента, който искате да добавите към системното меню. За пълен списък на тези опции вижте помощния файл.

Също така имайте предвид, че функцията AppendMenu има по-мощен двойник, новият API InsertMenuItem, който, въпреки че предлага повече контрол, също е много по-сложен за използване. Така че, ако просто искате да поставите допълнителен елемент в края на списъка с команди на системното меню, функцията AppendMenu е най-добрият избор.

Съвет 238. Как бързо да проверите наличието на определен елемент в списъка

След това използвайте функцията Instr(), за да определите дали новият низ съдържа елемента, който търсите:

Съвет 239 Използвайте оригинални OLEDB драйвери за ADO обекти вместо ODBC драйвери

Когато създавате низ за връзка за ADO обекти, е възможно да посочите драйвера на източника на данни или като Driver, така:

или като Доставчик, като следното:

Въпреки това, в първия случай ADO обектът използва по-стари ODBC драйвери, за да комуникира с източника на данни, докато във втория случай се използва OLEDB, който е естественият интерфейс за достъп до данни на ADO. Така че, когато е възможно, използвайте опцията Доставчик. Като напомняне съществуват собствени OLEDB драйвери за SQL Server, Index Server, Site Server Search и Oracle.

съвет240. Как да модифицирате DataGrid Control чрез промяна на Recordset

Контролът DataGrid, включен във VB 6.0, е добър инструмент за представяне на данни в таблична форма. Той обаче има няколко грешки, някои от които бяха коригирани в Service Patch 3, но някои от тях все още остават. Например, ако обвържете контролите DataGrid и DataEnvironment, след това промените набора от данни, използван от DataEnvironment, и актуализирате DataGrid с помощта на метода Refresh, този компонент остава непроменен. За съжаление методът Refresh не работи, когато свойството DataSource на контролата DataGrid е зададено на DataEnvironment. Следователно, за да отразите промените, направени в набора от данни на контролата DataEnvironment, първо трябва да актуализирате данните и след това да свържете отново DataGrid към DataEnvironment. Така че, ако имате бутон Refresh, събитието Click за него може да изглежда така:

Сега, когато щракнете върху бутона Обновяване, горният код ще обвърже отново контролите DataEnvironment и DataGrid и след това ще попълни повторно последния с актуализирани данни.

Съвет 241. Как да стартирате VB приложение по време на инициализация на Windows

В зависимост от версията на Windows, която използвате, има два различни начина за изпълнение на VB приложение по време на зареждане на системата. За Windows 9x, поставете командата Shell в секцията [Boot] на файла System.ini по следния начин:

За Windows NT/2000 използвайте същата команда на Shell в системния регистър под

Бъдете внимателни обаче, когато правите такива модификации, тъй като това може да доведе до неправилна работа на Windows.

Съвет 242. Как да възстановите кратко име на файл във VBбез помощта на API функции

В много случаи може да е необходимо да се направи връзка към файл според конвенцията за именуване на файлове 8.3. Без съмнение сте виждали тези имена многократно в MS-DOS. Например, използвайки тази конвенция, папката Program Files става Progra

1. Затова ще се радвате да научите, че VB 6.0 въведе възможността за възстановяване на кратки имена на файлове без извикване на API функцията GetShortPathName. Като алтернатива, новата библиотека за изпълнение на скриптове предоставя свойство ShortPath за обекти File и Folder. За да получите краткото име на файл, просто добавете връзка към Microsoft Scripting Runtime и след това въведете следния код:

Съвет 243 Създайте временни VB файлове с помощта на API функция

Ако някога сте работили с Word или друго приложение на Office, вероятно сте забелязали, че всеки път, когато отворите файл, Office създава временен файл, в който ще се съхраняват всички промени. И тогава може би се чудите как да създадете произволни временни файлове във вашето собствено VB приложение. За да направите това, използвайте функцията GetTempFileName API:

След това отворете нов формуляр и въведете следния код в неговото събитие Click. (Заменете D:\Articles\IVB с всеки валиден път.)

Стартирайте проекта за изпълнение. Посочената от вас директория сега съдържа временния файл, чието име се показва в полето за съобщения.

Имайте предвид, че за да работи горната функция правилно, трябва да предоставите само валиден път. В противен случай функцията GetTempFileName ще върне 0 и нулев параметър като име на файл в Windows NT. В Windows 9x неправилно зададен път също ще върне 0 и параметърът lpTempFileName няма да съдържа името на временния файл.файл.

Съвет 244. Как да конвертирате число в низ с фиксиран брой цифри

Понякога е необходимо да се извеждат числа с фиксиран брой цифри, когато отпред се добавят нули. Например, ако искате да представите числото 12345 като 0012345. Това се прави лесно с помощта на тази функция:

Съвет 245 Използвайте опция Изричен режим

Игор искаше да свърже DLL процедура, написана на Fortran, към VB. Проблемът с правилното предаване на параметри към DLL не е съвсем тривиален, затова го посъветвахме да започне с отстраняване на грешки в някой прост случай, като например предаване на името на файла, който да бъде прочетен в DLL като низова променлива.

Отвън тестовият случай изглеждаше правилен:

Достъп до DLL от VB:

След като изпрати този пример, Игор каза, че се е борил с него два дни без успех и програмата обикновено се срива с "незабавното изчезване на VB средата". Той опита различни начини за предаване на името на файла, включително използване на байтови масиви и структури от данни, но със същия неуспешен резултат. Разпечатването на променливата pfn упорито показваше липсата на необходимото име на файл. Или може би проблемът е объркване на ANSI / Unicode? Или "бъги" Windows 98 Second Edition?

Въпреки това "ковчегът току-що се отвори". Всъщност VB програмата на Igor използва две различни променливи: първият и третият ред съдържат променливата "cc" (и двете латински букви), а вторият ред съдържа "cc" (първата буква е българска).

Просто е невъзможно да се определи това с един поглед, но ние винаги използваме режима Option Explicit - така че компилаторът веднага съобщи, че е използвана недефинирана променлива във втория ред. Разбира се, в началото не повярвахме на очите си, но след това си спомнихме ситуацията от времето на DOS,когато имахме инсталирана някаква локализация на клавиатурата, при която превключването на клавишите на български понякога работеше само след натискане на първия клавиш. В резултат на това при въвеждане на такъв текст

оказа се, че в думата "sleeping" първата буква е английска. Беше невъзможно да се забележи разликата (c и c са на един и същ ключ). В тази връзка още един съвет: опитайте се да използвате шрифтове, които използват различни стилове на външно сходни български и латински букви.

След коригиране на идентификатора примерът започна да работи нормално. По този начин, за да не губите няколко дни за отстраняване на грешки, беше необходимо само да зададете режима Option Explicit (който се определя автоматично от командата ToolsOptionsEditorRequired Variable Declaration).