|
Программирование >> Проектирование интерфейса пользователя
Параметр ount и SaleTax в приведенном выше примере объявлены таким образом, что любые изменения их значений внутри процедуры CalculateSal- esTax останутся в силе после ее завершения. Вряд ли вы предусматривали бы именно такое развитие событий, поэтому семантическая правильность подобного кода остается под вопросом. Язык Access VBA позволяет предпослать любому аргументу процедуры определенное служебное слово-квалификатор (обратитесь к общему описанию синтаксиса нро-цедур, приведенному выше), чтобы оговорить дополнительные требования и обеспечить верную передачу смысла. Хотя применять квалификаторы вовсе не обязательно, в определенных обстоятельствах они дают возможность уточнить семантику кода и уменьшить количество потенциальных ошибок (и время, которое придется провести в обществе отладчика). Подробные сведения о квалификаторах аргументов и приемах их использования приведены в нескольких следующих разделах этой главы. Вы увидите более надежные и верные варианты кода предыдущего примера. Квалификатор ByVal Квалификатор ByVal (передача параметра по значению) применяют в тех случаях, когда необходимо исключить возможность изменения значения аргумента процедуры после ее завершения. Другими словами, после того как процедура будет выполнена, переменная-аргумент сохранит первоначальное значение, которое было передано процедуре в момент ее вызова. Аргумент, помеченный квалификатором ByVal, может изменять свое значение в процессе выполнения процедуры, но эти изменения носят временный характер. На самом деле параметр, снабженный словом ByVal, получает и хранит копию передаваемых данных. Только ее вы и сможете изменить, а оригинал останется нетронутым. Внесем в код рассмотренной ранее процедуры исправления, позволяющие предохранить содержимое аргументов от случайного искажения. Global TotalSale As Double Sub CalculateSalesTax ( ByVal SaleAmount As Double, ByVal SalesTax As Double ) TotalSale = SaleAmount * (1 + SalesTax) End Sub Применяйте Квалификатор ByVal в тех случаях, когда необходимо гарантировать сохранность содержимого конкретного аргумента процедуры после ее завершения. Ничто не запрещает пользоваться аргументом по своему усмотрению внутри процедуры, но по окончании ее выполнения все изменения, внесенные в содержимое аргумента, будут утрачены. Чтобы проверить, как вы поняли смысл сказанного, рассмотрим следующий код. Листин1. Пример ования квалификатора ByVal в аргументах процедур 1: Sub TestByVali 2: А = 5 3: MsgBox А 4: End Sub 5 : 6: Sub CallFoo( ) 7 : Dim A As Integer 8: A = 10 9: Call TestByVal( A ) 10: MsgBox A 11: End Sub ByVal A As Integer ) Если вы согласны с тем, что при выполнении строки 3 в окне сообщения будет отображено число 5, а результат вызова процедуры MsgBox в строке 10 - это число 10, тогда можно говорить о взаимопонимании. Квалификатор ByRef Квалификатор ByRef (передача параметра по ссылке) уведомляет компилятор VBA (и читателя программы) о том, что значение аргумента разрешается изменять внутри процедуры с сохранением изменений после ее завершения. Приведем еще один исправленный вариант процедуры CalculateSalesTax - сейчас нам удастся избежать использования глобальной переменной TotalSale: .Sub CalculateSalesTax( ByVal SaleAmount As Double, ByVal SalesTax As Double, ByRef TotalSale As Double ) TotalSale = Sale * (1 + SalesTax) End Sub Квалификатор ByRef указывает, что в процедуру передается адрес исходной переменной, а не ее значение-копия. Поэтому результат изменения параметра не зависит от того, где оно было совершено - внутри процедуры или за ее пределами. Применяйте Квалификатор ByRef в тех случаях, когда процедуре должна быть предоставлена возможность изменения данных, объявленных извне и переданных в качестве аргумента. Квалификатор Optional Квалификатор Optional (необязательный аргумент) позволяет создавать более гибкие процедуры, учитывающие конкретные обстоятельства вызова. Для аргумента процедуры, помеченного словом Optional, задавать значение необязательно. Этот ква-лификатор чрезвычайно удобен в тех ситуациях, когда в соответствии с условиями задачи аргумент в большинстве случаев принимает одно заранее известное значение и только изредка - какие-то другие. Вернемся к нашему примеру, касающемуся расчета стоимости, и предположим, что нам дополнительно необходимо учитывать зависимость ставки налогообложения от места изготовления изделия. Если в большинстве случаев процедура должна вычислять полную стоимость изделий, произведенных в штате Мичиган, снабдите аргумент SalesTax квалификатором Optional и значением по умолчанию, соответствующим ставке налогов штата Мичиган. Теперь пользователю не придется заботиться о явном задании ставки, поскольку она заранее известна, а понадобится указывать ее только в тех редких случаях, когда речь идет об изделиях, произведенных за пределами штата. Исправленная версия процедуры представлена в тексте листинга 8.2. Аргументы, снабженные квалификатором Optional, должны занимать место в конце списка параметров процедуры, иначе компилятор VBA выдаст сообщение об ошибке. / Листинг 8.2. Пример использование икатора Optional Su TotalSale ( ByRef ByVal SaleAmount As Double, Optional TaxPersent As Double TotalSale = SaleAmount End Sub TotalSale As Double, = .06 } * (1 + TaxPersent) Sub ) Dim SaleAmount As Double 7: Dim TotalSale As Double 8: SaleAmount = 100 9: Call CalculateTotalSale ( TotalSale, SaleMiount) 10: Dim WashinqtonSalesTax As Double 11: WashingtonSalesTax = .08 12; Call aicuiateTotalSale( TotalSale, SaleMiount, WashingtonSalesTax ) 13 : End Sub Квалификатор Optional, используемый в строке заголовка процедуры CalculateTotalSale, позволяет угостить код программы, поскольку наиболее часто используемое значение аргумента sTax - .06 - известно заранее. Обратите внание, что процера CalculateTotalSale вызывается дважды - один раз с двумя параметрами (в строке 9), а другой - с тремя (в строке 12). Приемлемы оба варианта вызова. Напомним - все аргументы икатором Optional должны располагаться в конце списка параметров процеры. Как строить функции Функции (еще одна именованная конструкция) очень схожи с процедурами и различаются только в одном аспекте - они могут возвращать значения определенного типа. (Если вы не читали начало главы, рекомендуем сделать это сейчас.) Ниже приведена информация о том, как задавать возвращаемый аргумент и использовать его в операторах присваивания. Общий синтаксис определения функции почти совпадает с правилами оформления процедуры и отличается только началом (теперь вместо служебного слова Sub следует задавать слово Function), суффиксом, указывающим тип возвращаемого значения, и конструкцией завершающей строки: Function ИмяФункции ( [[Квалификатор] ИмяАргумента As Тип-Данных, ... ] ) As ТипДанных ▲ End Function Напомним: при определении реальной функции вместо словосочетаний ИмяФункции и ИмяАргумента надлежит ввести четкие и запоминающиеся наименования (идентификаторы), а параметры ТипДанных заменить соответствующими служебными словами VBA, обозначающими допустимые типы данных. Символ многоточия означает, что разрешено задавать произвольное число аргументов. Функции следует использовать в тех случаях, когда блок кода должен возвращать результат определенного типа. Процедуру CalculateTotalSale листинга 8.2 можно легко преобразовать в функцию - и решение задачи станет несколько более изящным. Взгляните на текст листинга 8.3. Листинг 8.3. Пример определения и использования функции 1: Function CalculateTotalSale ( SaleAmount As Double, Optional TaxPercent As Double = .06 ) As Double 2: CalculateTotalSale = SaleAmount * (1 + TaxPercent ) 3: End Function
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |