Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 символом «обратный слэш»;
Рис. 7.1 Так мог бы выглядеть результат вызова функции NacFileNameCreate
|