|
Программирование >> Проектирование интерфейса пользователя
5: Users (1) tBox ( Введите имя пользователя: , имя пользователя ) 6: Next I 7: End Sub Обратите внимание - единственное отличие кода листинга 5.9 от предыдущих примеров состоит в том, что литеральные значения, задающие ниж-шт нюю и верхнюю границы изменения переменной цикла (и индекса масси-!ЩЩ ва) заменены вызовами функций Lbound и Ubound. Каждой из них в каче-g стве параметра передается имя массива Users. Теперь становится вполне I понятным общий синтаксис вызова этих функций: V Lbound( ИмяМассива ) А Ubound ( ИмяМассива ) Каждая из функций возвращает целочисленное значение. Замените ИмяМассива идентификатором реального массива, который используется в программе, - и вы получите гибкий код, который не будет зависеть от количества элементов массива. Раньше говорилось о том, что использования литеральных значений следует - насколько это возможно в конкретной ситуации - избегать. Профессиональные программисты в шутку называют литералы магическими числами, имея в виду их способность к преподнесению сюрпризов в самый неожиданный момент. Если все же вместо вызова функций Lbound и Ubound вы указываете постоянные значения, применяйте именованные константы, а не литералы. Циклическая обработка данных Конструкция For Each специально предусмотрена для циклической обработки данных, хранящихся в виде массивов или коллекций. Более подробные сведения о коллекциях приведены в следующей главе, а сейчас предлагаем ознакомиться с приемами использования управляющей структуры For Each применительно к массивам. Синтаксис конструкции For Each не зависит от того, с каким объектом данных - массивом или коллекцией - вы работаете. Он выглядит следующим образом: I Dim Элемент As Variant For Each Элемент In ИмяМассива одна или несколько строк кода Next Элемент В описание синтаксиса специально включено объявление переменной Элемент, поскольку конструкция For Each должна - это обязательное требование - ссылаться на переменную типа Variant. На каждом шаге цикла переменной Элемент присваивается значение очередного элемента массива, а в следующих строках у вас появляется возможность обработки этой переменной - вы словно явно ссылаетесь на конкретный элемент массива. Строка Next Элемент заставляет компилятор перейти к очередному элементу массива и присвоить его значение указанной переменной. Листинг 5.10 служит примером кода, предназпаченпого для отображения содержимого каждого элемента массива типа String в окне сообщения. Листинг 5.10. Пример цикла For Each 1: 2 : 3 Su wUsers ( ) Dim Users (2) As String Users (0) = Иван 9; 10:: Users (1) = Петр Users (2) = Федор Dim User As Variant For Each User In Users MsgBox User Next User End Sub По умолчанию в Access нумерация элементов массивов начинается с нуля. Таким образом, если в объявлении массива содержится число п, в нем насчитывается п+1 элемент. Вам, однако, предоставлена возможность выбора границы отсчета с помощью директивы Option Base n, где в качестве п допускается указывать одно из двух значений - О или 1. Строку Option Base n необходимо располагать в самом начале текста модуля. I Строки 2-5 листинга 10 содержав укции объявления символьного I массива Users и инициализации его элементов. В строке 6 объявлена переменная User типа Variant, предназначенная для использования в конструкции For Each. Строки 7-9 предусматривают циклическое прохождение по всем элементам rs, на каждом шаге которого значение очередного элемента (подчеркиваем, элемента, а кса!) присваивается переменной User и выводится в окне сообщения, открываемом с помощью стандартной процедуры MsgBox. Средства прерывания циклов В практике программирования встречаются ситуации, когда необходимо покинуть цикл до его естественного завершения. Такое случается, если, например, по условиям задачи невозможно построить тестовое выражение, позволяющее корректно завершить выполнение цикла. Язык VBA предлагает для подобной цели специальную инструкцию, обозначаемую служебным словом Exit. Она дает возможность выйти из цикла в любой момент, когда это необходимо. Существует две формы инструкции принудительного прерывания циклов: Exit For Exit Do Первая, Exit For, как легко догадаться, используется внутри циклов вида For . . . Next, a вторая. Exit Do, - в циклах Do . . . Loop. Наличие средства прерывания никла дает основания предпочесть конструкцию Do ... Loop аналогичной ей управляющей структуре While . . . Wend, лишенной подобной возможности. Далее вновь обратимся к примеру, приведенному в листинге 5.7. Внутри цикла используется условная конструкция If, предназначенная для проверки длины введенного имени и исключающая возможность обработки пустой строки. Теперь мы понимаем, что решение можно усовершенствовать. Соответствующий исправленный вариант кода приведен в листинге 5.11. Листинги. Пример использования инструкции прерывания цикла 1: Su sers( } 2 : Dim User As String 3 : Do 4: User = InputBox( Добавьте имя пользователя , Добавление полвзователей , User ) 5: If (Len( User ) = 0) Then Exit Do 6: 7: MsgBox Добавлен пользователь Loop Until (Len( User ) = 0) & User, vblnformation End Sub В конец строки 5 добавлена инструкция Exit Do. Если пользователь введет пустое имя либо щелкнет на кнопке Cancel (Отмена) диалогового окна, вызываемого функцией InputBox, выполнение цикла будет принудительно прервано. Итак, объем кода уменьшился на одну строку, и теперь в случае ввода пустого имени выполняется только одна проверка, а не две, как раньше. (В принципе, в строке 7 условие Len (User) = 0 можно заменить литеральной булевой (True) или целочисленной (1) константой, поскольку выход из бесконечного цикла гарантируется инструкцией Exit Do. - Прим. перев.) В 1995 году я провел исследование, в результате которого было установлено, что значение средней стоимости строки кода коммерческих программных проектов колеблется от $5 до $8. Есть все основания предполагать, что за прошедший период оно существенно выросло. На первый взгляд может показаться - чем больше строк я напишу, тем больше заработаю. Это мнение, однако, небесспорно - разумное и обоснованное уменьшение объема программы с лихвой окупит издержки, связанные с сопровождением избыточного и неэффективного кода. (Приведенные цифры отвечают реалиям рынка США. Автор, видимо, не предполагал, что для не избалованного жизнью русскоязычного читателя-профессионала эта информация может представлять особый интерес. - Прим. перев.) Использование функции Switch Функция Switch в качестве параметра использует разделенный запятыми список пар, сравнивает переданное значение с элементами списка и возвращает парное значение. Пример использования данной функции приведен в листинге 5.12. Листинг 5.12. Пример использования функции Switch Sub DemoSwitch ( ) Dim ProductName As String: Dim MatcliUp As Variant ProductName = InputBox ( Введите название программы (Access, Visual Basic, Соответствие программы языку программирования ) MatchUp = Switch (ProductName = Access , VBA , ProductName = Visual Basic , Visual Basic , ProductName = Delphi , Object Pascal , Len (ProductName) >= 0, <He найдено MsgBox MatchUp 1: 2: 3 4: Введите название программы (Access, Visual Basic, Delphi) , 5: 6: 7: 8: 10:End Sub В этой программе пользователь вводит значение переменной ProductName, которое передается в подпрограмму и для которого находится соответствующая пара. В функцию Switch передаются три пары: ProductName = Access , ProductName = visual Basic , ProductName = Delphi . Если ProductName содержит одно из данных значений, функция Switch возвращает соответствующую ему пару. Например, если в окне ввода указать Access , функция Switch вернет значение VBA . Указанная функция возвращает значение типа Variant, что позволяет использовать ее с самыми разными данными.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |