Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Повторение действий с помощью цикла

Поиск

Цикл — это инструмент, позволяющий повторять операцию столько раз, сколько нужно. В языке Visual Basic есть несколько типов циклов, которые можно использовать. Наиболее популярны блоки Do/Loop и For /Next, и в этом разделе вы познакомитесь с обоими.

Далее приведен пример блока Do/Loop, который наверняка выведет читателей из равно­весия:

Do

MsgBox "Ever ever get that nagging deja vu feeling?" Loop

Когда программа Access обрабатывает этот код, она начинает с вывода окна сообщения и остановки выполнения остального вашего кода. После того как вы щелкнули мышью кнопку ОК, выполнение кода продолжается до финального оператора Loop в конце цикла. В этот момент программа автоматически переходит к началу цикла (оператор Do) и повторяет ваш код, выводя второе окно сообщения. Проблема в том, что этот процесс продолжается беско­нечно! Если допустить ошибку и запустить этот код, ваша БД будет заблокирована на неоп­ределенное время (пока вы не нажмете комбинацию клавиш аварийного останова <Ctrl>+<Break>).

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

' Отслеживает количество повторений цикла

Dim NumberOfTimes

 

' Начинает отсчет с 0

NumberOfTimes = 0

 

Do

MsgBox "Ever ever get that nagging deja vu feeling?"

 

' Увеличивает счетчик на 1

NumberOfTimes = NumberOfTimes + 1

Loop Until NumberOfTimes =5


Важная часть — оператор в конце цикла, Until Number0fTimes=5. Он определяет ус­ловие, и как только оно становится True (значение переменной NumberOfTimes равно 5), программа Access достигает конца цикла и переходит к выполнению оставшегося кода про­цедуры.

Если вам нужен цикл с фиксированным количеством повторений, возможно, вас заинте­ресует цикл типа For/Next. Этот тип цикла в точности такой же, как цикл Do/Loop за ис­ключением того, что у него есть встроенный счетчик, увеличивающийся автоматически при каждом проходе цикла.

Теперь можно переписать предыдущий пример в более компактной форме с применени­ем цикла For/Next:

Dim NumberOfTimes

For NumberOfTimes = 1 To 5

MsgBox "Ever ever get that nagging deja vu feeling?"

Next

Важная часть цикла - оператор NumberOfTimes=l To 5, сообщающий программе Ac­cess о начальном значении переменной NumberOfTimes, равном 1, о необходимости увели­чения ее значения на 1 при каждом проходе цикла и о завершении цикла после пятого про­хода.

Цикл Do/Loop удобен при обработке коллекции данных. Его можно применять для об­работки информации до тех пор, пока она не иссякнет, даже если заранее вы не знаете, сколько данных у вас есть. Вы увидите пример использования этого метода в конце данной главы, когда будете выполнять пакетное обновление вашей БД с помощью программного кода.

С другой стороны цикл For/Next предстанет во всей красе, если вы можете точно опре­делить заранее, сколько раз хотите повторить цикл. В справедливости этого вы убедитесь чуть позже в этой главе, когда будете проверять номера кредитных карт.

 

 

Создание пользовательских функций

Вы уже научились создавать собственные процедуры, но еще не знаете о том, как создать их старшую сестру, функцию.

Функция, как и процедура, — изолированный фрагмент кода, способный включать в себя произвольное число операторов. И, так же как и процедуры, функции можно добавлять в модули. В модуле может сосуществовать рядом любое количество процедур и функций.

Function DoSomething()

'Здесь код функции

End Function

Главное отличие функции от процедуры заключается в том, что функция формирует ко­нечный результат. Другими словами, функции предоставляют порцию нужных вам данных.

Вы задаете результат, написав строку кода, которая присваивает окончательное значение имени функции. (По существу, вы считаете, что имя функции — это переменная, в которой можно хранить некоторые данные.)


Далее приведен пример:

Function GetMyFavoriteColor()

GetMyFavoriteColor = "Magenta" End Function

Эта функция названа GetMyFavoriteColor (получение моего любимого цвета). Ее ре­зультат — текстовая строка "Magenta" (пурпурный).

Вызов функции несколько отличается от вызова процедуры. Для вызова процедуры вы используете имя модуля, за которым следует точка, а затем имя процедуры. Этот же способ можно применить и для вызова функции:

MyModule.GetMyFavoriteColor

Но возникает проблема. Этот шаг запускает функцию GetMyFavoriteColor, но отбра­сывает результат (строку с текстом Magenta).

Если вас интересует результат, можно вызвать функцию в операторе присваивания. В приведенном далее коде создана переменная для хранения результата и последующего отображения его в окне сообщения:

' Создается переменная для хранения результата

Dim Color

 

' Вызывается функция и результат сохраняется в переменной

Color = MyModule.GetMyFavoriteColor

 

' Результат отображается в окне сообщения

MsgBox "Your favorite color is " & Color

Если вы по-настоящему сообразительны, то можете сократить этот код до одной строки и вообще избежать использования переменной Color:

MsgBox "Your favorite color is " & MyModule.GetMyFavoriteColor

Функция GetMyFavoriteColor предельно проста, т. к. не использует аргументы. Но ни­что не мешает вам проявить большую изобретательность. Рассмотрите следующую пользо­вательскую функцию, которая принимает два аргумента — длину и ширину — и вычисляет площадь, перемножая их:

Function Area(Length, Width)

Area = Length * Width

End Function

Эти два параметра определяются в скобках после имени функции. Количество парамет­ров может быть любым при условии, что вы отделяете один от другого запятой.

Далее приведен пример вызова данной функции и отображения результата. В нем для определения параметров Length (длина) и Width (ширина) применяются числовые кон­станты. Но их вполне можно заменить именем поля, переменной или свойством, которые вы хотите использовать в функции Area.

MsgBox "The area of a 4x4 rectangle is " & Area(4, 4)


На экране появится:

The area of a 4x4 rectangle is 16

Ни функция GetMyFavoriteColor (), ни функция Area () не продемонстрировали ни­чего впечатляющего, но в следующем разделе этой главы вы создадите гораздо более мощ­ную функцию для проверки номеров кредитных карт.

 

 

Практические занятия для опытных пользователей.

Применение пользовательских функций в запросах

После того как вы создали функцию, ее можно использовать в вашей БД для построения запросов или условий на значения. Единственное требование — ваша функция должна находиться в пользовательском модуле, который вы добавили (не в модуле формы) и в ее объявлении не должно быть слова Private. Если ваша функция соответствует ука­занным требованиям, вы можете вызывать ее так же легко, как любую встроенную функцию программы Access.

Можно создать, например, такой запрос с вычисляемым полем (при условии, что в него включены два поля, названные LengthOfRoom (длина комнаты) и WidthOfRoom (ширина комнаты) соответственно):

RoomArea: Area (LengthOfRoom, WidthOfRoom)

Или можно создать следующее условие на значение для таблицы:

Area(LengthOfRoom * WidthOfRoom) < 10000

См. в главе 7 дополнительные соображения по поводу применения функций в вычис­ляемых полях и в главе 4 дополнительную информацию об условиях на значения или правилах верификации. Если же вы хотите увидеть этот конкретный пример в действии, обратитесь к БД MyHouse, которая включена в примеры к данной главе.

Подытожим: функция

Для проверки кредитных карт

Теперь, когда вы познакомились с языком Visual Basic, самое время подвести итог с по­мощью примера, демонстрирующего все, что вы узнали о VB (и даже немного больше).

В данном примере рассматривается пользовательская функция ValidateCard (допустимая карта), которая проверяет номер кредитной карты. Функция ValidateCard возвращает одно из двух значений: True (что означает допустимый номер карты) и False (что означает неверный номер).

Важно понимать, что допустимый номер кредитной карты — это просто номер, соответ­ствующий несекретным правилам нумерации кредитных карт (см. дополнительную инфор­мацию в следующем примечании). Этот номер может соответствовать реальной кредитной карте или нет. Функция ValidateCard достаточно сообразительна для вылавливания слу­чайных ошибок и не слишком умелых хакеров. По-настоящему злонамеренные пользовате­ли могут найти программы, позволяющие генерировать потенциально допустимые номера кредитных карт.


На профессиональном уровне.



Поделиться:


Последнее изменение этой страницы: 2016-08-14; просмотров: 140; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.178.169 (0.012 с.)