Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Функции-процедуры





В предыдущей главе рассматривались встроенные VB-функции, которые можно считать встроенными «простыми» функциями-процедурами.

Кроме того, вы можете создавать свои собственные функции-процедуры[2], используя следующий синтаксис:

Синтаксис

[Private|Public][Static]Function procedurename ([ arguments ]) [As Type ]

[ statements ]

[ procedurename = expression ]

[ statements ]

End Function

Каждая функция-процедура начинается ключевым словом Function, за которым следует имя функции. Слово procedurename представляет имя, выбранное для этой функции. При написании имен функций необходимо соблюдать те же правила, что и при написании имен других идентификаторов в Visual Basic: они должны начинаться с буквы, не могут содержать пробелов или каких-либо символов арифметических, логических операторов или операторов отношения и не могут дублировать ключевые слова Visual Basic.

После имени функции следует список ее аргументов, который заключается в круглые скобки. Здесь arguments представляет список аргументов (параметров) функции и является необязательным.

Type — любой тип возвращаемого значения функции. Если только не определяется иначе, результат, который возвращает функция-процедура, имеет тип Variant. Как вы узнали ранее, значения, сохраняемые или обрабатываемые как тип Variant, занимают больше памяти, чем любой другой тип данных, и на их обработку уходит больше времени.

Следует задавать тип данных результата функции по тем же причинам, по каким задается тип переменных и констант: для ускорения выполнения кода, более эффективного использования памяти, получения более легкого и понятного кода и для нахождения ошибок программирования (при этом необходимо хорошо знать правила преобразования типов в Visual Basic).

Необязательный элемент синтаксиса procedurename = expression представляет <$I[] присваивание функции (function assignment)> присваивание функции (function assignment), которое указывает, какое значение должна возвращать функция. Хотя эта часть функции является необязательной, следует всегда включать оператор присваивания в функции-процедуры. Наконец, объявление функции заканчивается ключевыми словами End Function.

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

Листинг 7.2. Создание и использование функции-процедуры

1 Private Sub Command1_Click()

2 MsgBox "С начала нового " & _

3 "тысячелетия прошло " & _

4 after2001() & " дней"

5 End Sub

7 Function after2001() As Integer

8 Const date2000 = #1/1/2001# 'дата-константа

9 Dim today As Date 'дата-переменная

10 today = Now() 'сегодня

11 after2001 = today - date2000 'возвращаемое значение

12 End Function

В строках 1–5 описана процедура (она событийная только потому, что при ее написании первую и последнюю строки создавал VB-редактор для командной кнопки), которая содержит всего один оператор, вызывающий процедуру MsgBox. Этой процедуре передается вычисляемое строковое выражение, к котором, в частности, (строка 4) используется вызов функции after2001. Функция after2001 описана (объявлена) в строках 7–12 и также имеет не очень большое количество операторов: заголовок функции (строка 7) без описания параметров, объявление константной даты начала тысячелетия и переменной типа Date (строки 8–9), определение текущей даты (строка 10), присваивание переменной after2001 (имя функции) результата операции вычитания, оператор завершения функции (строка 12).

Сравните вызов пользовательской функции в строке 4 с вызовом встроенной VB-функции в строке 10.

Для демонстрации функции-процедуры со списком аргументов изменим код листинга 7.1.

Листинг 7.3. Функция-процедура с аргументами

1 Function int_intF(xL As Long) As Long

2 'формирование числа из цифр числа xL,

3 'взятых в обратном порядке

5 Dim i As Integer, lenx As Integer

6 Dim xrem As Long, xS As String, deli As Long

8 lenx = Len(Trim(Str(xL))) 'количество цифр в xL

9 xrem = xL 'начальное значение остатка

11 For i = 1 To lenx

12 deli = 10 ^ (lenx - i) 'текущий делитель

13 xS = Trim(Str(xrem \ deli)) & xS

14 xrem = xrem Mod deli 'остаток от деления

15 Next

17 int_intF = Val(xS)

18 End Function

Обратите внимание на то, что этот код отличается от кода листинга 7.1 только тремя строками: первой и двумя последними. В первой строке объявляется функция-процедура с одним (входным) аргументом. В строке 17 результат работы кода присваивается переменой с именем функции-процедуры.

На самом деле, коды листингов 7.1 и 7.3 так мало отличаются потому, что поставленная задача удобнее решается функцией-процедурой. Бывают задачи, которые трудно решить при помощи функции-процедуры. Обычно, если в результате работы кода необходимо получить одно значение, правильнее использовать функцию-процедуру. Если возвращаемых значений должно быть более одного, смысла в использовании функции меньше.

Для следующей демонстрации функции-процедуры со списком аргументов рассмотрим небольшую бизнес-задачу. Не будет большой ошибкой считать Visual Basic системой, наиболее подходящей для быстрой разработки небольших баз данных. Здесь ключевым является сочетание слов «быстрой» и «небольших». Если вы просто скажите, что Visual Basic предназначен для создания баз данных, с вами согласятся немногие. Если вы скажите, что Visual Basic позволяет быстро создавать базы данных, это опять будет не совсем корректно.

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

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

Листинг 7.4. Функция-процедура с аргументами

1 Function NacFileNameCreate(pathNaclDBM As String, _

2 mon As Integer, _

3 yea As Integer, _

4 AgentCod As String) As String

5 ' получение имени файла с накладными по номеру месяца,

6 ' году и коду склада

7 ' pathNaclDBM - путь к каталогу

8 ' mon - номер месяца

9 ' yea - год

10 ' AgentCod - код склада

12 Dim rez As String 'рабочая переменная

14 rez = Trim(Str(mon)) 'перобразовать число в строку

16 'добавить перед месяцем 0, если он меньше 10:

17 If Len(rez) = 1 Then rez = "0" & rez

19 NacFileNameCreate = pathNaclDBM & "N" & rez & _

20 Mid(Trim(Str(yea)), 3, 2) & _

21 AgentCod & ".mdb"

23 End Function

26 Private Sub Command2_Click ()

27 MsgBox NacFileNameCreate(App.Path & "\", 10, 2002, "1201"),, _

28 "Тест NacFileNameCreate"

29 End Sub

Код в строках 1–23 описывает функцию, которая принимает в качестве аргументов путь к каталогу (pathNaclDBM, тип — String), номер месяца (mon, тип — Integer), год (yea, тип — Integer) и, наконец, код склада (AgentCod, тип — String). В строке 14 переменной rez присваивается текстовое значение номера месяца (функция Str возвращает текстовое значения числа, функция Trim удаляет пробелы в начале и в конце строки). Оператор If…Then в строке 17 добавляетк текстовому значению месяца “0” (в начало), если номер месяца меньше 10.

В строках 19–21 записан один оператор, в котором переменной с именем функции (возвращаемое значение) присваивается строковое значение, получаемое конкатенацией шести выражений:

19 NacFileNameCreate = pathNaclDBM & "N" & rez & _

20 Mid(Trim(Str(yea)), 3, 2) & _

21 AgentCod & ".mdb"

Здесь pathNaclDBM — первый аргумент функции, "N" — просто строка из одного символа, rez — строковое выражение для месяца, Mid(Trim(Str(yea)), 3, 2) — строка из двух последних цифр года (аргумент yea), AgentCod — строка с кодом склада (аргумент), ".mdb" — строка для указания типа файла.

В строках 26–29 записан код для вызова функции NacFileNameCreate, а на рис. 7.1 приведено окно MsgBox с результатом работы этой функции. Обратите внимание на аргументы функции при ее вызове (строка 27). Здесь:

App.Path & "\" — результат функции, возвращающей текущий путь к приложению, конкатенируется c символом «обратный слэш»;
10 — значение месяца;
2002 — значение года;
"1201" — код склада.

 

Рис. 7.1

Так мог бы выглядеть результат вызова функции NacFileNameCreate

Date: 2015-09-02; view: 338; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию