Создание и использование процедур пользователей
Процедуры представляют собой отдельные блоки, из которых складывается код программы, причем каждая процедура должна выполнять какую-то законченную задачу. Кроме процедур обработки событий, в программу можно включить процедуры, не связанные с событиями. Они выполняют отдельные действия и могут быть использованы (вызваны) неоднократно. Как известно, они называются общими или пользовательскими. Процедуры общего назначения вызываются на выполнение из кода программы. Использование процедур экономит время разработки приложения и позволяет избежать лишних ошибок. Процедуры могут быть двух видов: процедуры - подпрограммы и процедуры – функции. Процедуры - функции отличаются от процедур - подпрограмм тем, что возвращают какое-то одно значение и поэтому могут участвовать в выражениях. Причем под подпрограммой или функцией понимается последовательность операций, которую нужно многократно выполнять в различных местах приложения. При этом, требуемый блок команд описывается в коде только один раз, после чего к нему можно обращаться из любой части программы и неоднократно.
Процедуры, которые будут рассмотрены ниже, не относятся ни к встроенным процедурам, ни к процедурам обработки событий – это общие процедуры или процедуры пользователей. Общие процедуры, в отличие от процедур обработки событий, начинают выполняться не в ответ на какое-либо событие, а после их явного вызова. После выполнения такой процедуры происходит автоматический возврат в то место проекта, откуда процедура была вызвана. Каждой вызываемой процедуре присваивается уникальное имя. Кроме того, для вызываемой процедуры может быть установлен перечень входных и выходных параметров. Входные параметры процедуры – это переменные, значения которых должны быть установлены до начала работы процедуры и которые участвуют в реализации процедуры. При описании процедуры перед ними ставиться ключевое слово ByVal. Выходные параметры процедуры – это переменные, значения которых вычисляются в результате работы процедуры. При описании процедуры перед ними ставиться ключевое слово ByRef.
В общем случае процедуры являются способом объединения набора связанных между собой выполнением одной задачи (конкретного алгоритма) операторов. Visual Basic включает два основных типа процедур: 1. Процедуры типа Function – процедура–функция или процедура -Function вызываются из процедур событий или других процедур по имени. Процедуры -Function часто используются для вычислений, могут быть частью выражения, могут получать входные параметры и предназначены для возврата одного значения через свое имя или специальным оператором. 2. Процедуры типа Sub – процедура–подпрограмма или процедура - Sub вызываются из процедур событий или других процедур по имени. Они могут получать входные параметры и возвращать измененные значения через список выходных параметров. Однако, в отличие от процедуры -Function, процедуры - Sub не возвращают значения, связанного с их именами.
Процедуры- Function и процедуры- Sub могут определяться (описываться) в коде программы формы. Процедуры общего назначения предоставляют следующие преимущества: · они позволяют связать часто используемую группу операторов программы со · они устраняют повторы строк кода, т.е. можно один раз определить процедуру · они делают программы более простыми и легко читаемыми, программа, разделенная на небольшие части, легче воспринимается и понимается, чем программа, сделанная в виде одного большого фрагмента; · они упрощают разработку программы (программы, разделенные на логическиеединицы, легче разрабатывать, писать и отлаживать; кроме того, если разрабатывают программу в группе разработчиков, то можно обмениваться процедурами и модулями, а не целыми программами); · они могут быть повторно использованы в других проектах и решениях (можно легко встроить процедуры из стандартного модуля в другие программные проекты); · они расширяют язык VB (процедуры часто могут выполнять задачи, которые не могут быть выполнены отдельными ключевыми словами VB или методами).
Процедура - Function –это группа операторов, расположенных между ключевыми словами Functionи End Function. Операторы в функции выполняют осмысленную работу – в соответствии с заданным алгоритмом. Функции создают тогда, когда результатом выполнения процедуры является значение какой либо одной величины числового, строкового или логического типа. Чтобы выполнить (вызвать или обратиться) – функцию в программе, необходимо поместить в операторе (любое допустимое выражение) программы имя этой функции и все требуемые для нее фактические параметры. Аргументы (формальные параметры) процедуры -Function –это данные, используемые для работы функции, и они должны быть заключены в круглые скобки и разделены запятыми. В целом использование процедуры- Function в точности совпадает с использованием встроенных функций или методов. Функции, объявленные (описанные) в модуле формы, по умолчанию являются открытыми в пределах данной формы. В результате они могут использоваться (вызываться) из любой процедуры события проекта или из другой процедуры.
Описание процедуры -функции имеет следующий синтаксис:
Function ИмяФункции ( ФормальныеПараметры ) As ТипВозвращаемогоЗначения … ОператорыФункции … Return значение … End Function Важными являются следующие синтаксические элементы: · ИмяФункции –это имя создаваемой функции; · ТипВозвращаемогоЗначения –это тип значения, возвращаемого функцией, то есть тип величины, которая является результатом работы функции; · Формальные параметры (аргументы) –это список необязательных аргументов, разделенных запятыми и используемых в данной функции. Каждый аргумент должен быть объявлен с указанием конкретного типа данных. По умолчанию Visual Basic добавляет к каждому аргументу ключевое слово ByVal, которое указывает на то, что в функцию через данный аргумент передается копия значения и все изменения значения этого аргумента не будут возвращены в вызывающую процедуру; · ОператорыФункции –это блок операторов, который выполняет работу функции (первые операторы в этой функции обычно объявляют локальные переменные, которые будут использоваться внутри функции, а остальные операторы выполняют работу функции). · Return–это оператор, с помощью которого можно указать место, где в блоке кода функции требуется возвратить значение в вызывающую программу, и каково это возвращаемое значение.
Пример 4.3.1-1. Добавление в проект Пример 4.1.7-1 (Счастливая семерка) процедур и общих переменных. 1. Форма нового проекта должна выглядеть как на рис. 4.3.1-1.
Рис. 4.3.1-1
2. Переместить точку ввода на пустую строку за оператором Public Class Form1 и ввеcти оператор объявления переменной Dim Wins As Short, а затем нажать на <Enter>. Этот оператор объявляет в программе открытую целочисленную переменную типа Short. Когда программа запускается, каждая процедура события этой программы получит доступ к этой переменной. 3. Щелкнуть дважды на кнопке формы Играть. В окне Редактор кода (Code Editor) появится процедура события Button1_Click()для кнопки формы Играть. 4. В этой процедуре события после оператора Веер() следует ввести следующие операторы:
Эта часть кода программы увеличивает на единицу открытую переменную Wins, если при «вращении» появляется 7. Вторая строка использует оператор конкатенации (&), с помощью которого присваивает объекту Label5.Text строку в формате Побед: X, где X - это число выигрышей. Надпись Побед: Х отслеживает выигрыши. Каждый раз, когда происходит выигрыш, она увеличивает значение переменной Wins на 1. После 10 вращений переменная Winsможет принять значение, показанное на рис. 4.3.1-2. 5. Щелкнуть на Конец игры, чтобы выйти из программы.
Глобальная переменная Winsполезна в процедуре события Button1_Click()потому, что она сохраняла свое значение на протяжении нескольких вызовов. Если бы Winsбыла объявлена локально в процедуре события Button1_Click(), то эта переменная каждый раз сбрасывалась бы (обнулялась). В этом примере использовалась открытая переменная для хранения числа выигрышей в программе игрового автомата. Открытые переменные отличаются тем, что они сохраняют свои значения во всей форме - другими словами, во всех компонентах, которые принадлежат к одному пространству имен проекта. В проект примера 4.3.1-1 добавить функцию, которая будет вычислять долю выигрышей в игре, т. е., другими словами, процентное выражение игр, в которых появляется хотя бы одна семерка. Чтобы это сделать, следует добавить в модуль формы процедуру - Function с именем HitRate()и открытую переменную Spins, а з атем вызывать процедуру - функцию HitRate()каждый раз, когда производится щелчок на кнопке формы Играть. 1. Отобразить форму программы Пример-4-3-2-1 (Счастливая семерка-2). Появится интерфейс пользователя программы Счастливая семерка2. 2. С помощью элемента управления Label создать новую надпись ниже надписи Побед: 0. Установить для этой надписи свойства, приведенные в таблице 4.3.1-1.
Таблица 4.3.1-1
Форма должна выглядеть аналогично той, которая изображена на рис. 4.3.1-1. 3. В окне Обозреватель решений (Solution Explorer) щелкнуть на команде Показать код (View Code). В окне Редактора кода (Code Editor) появится программный код. 4. После оператора Public Wins As Short следует добавить следующее объявление:
Public Spins As Short Теперь модуль включает две открытые переменные, Wins и Spins, которые доступны всем процедурам проекта. Причем Spins будет использоваться как счетчик для хранения числа сыгранных игр. 5. Далее добавить в модуль формы пустую строку, а затем следующее описание функции:
После того как будет введена первая строка кода функции, Visual Basic автоматически добавит оператор End Function. Когда будет введена остальная часть кода функции, экран должен выглядеть аналогично рис. 4.3.1-2. Функция HitRate() определяет процентное соотношение выигрышей. Разделив аргумент Hits на аргумент Tries, затем форматирует представление результата с помощью встроенной функции Format(). Функция HitRate() объявлена как имеющая тип строки, так как функция Format() возвращает строковое значение. Аргумент Hits и аргумент Tries - это места хранения двух коротких целых переменных, которые передаются в функцию при ее вызове. Функция HitRate() является функцией общего назначения и может быть использована с любыми короткими целыми числами или переменными, а не только с Wins и Spins. 6. За четвертой строкой процедуры события Button1_Click()
Label3.Text=CStr(Int(Rnd() * 10)) следует ввести следующий оператор:
Spins = Spins + 1. Этот оператор увеличивает на 1 переменную Spins каждый раз, когда пользователь щелкает на кнопке формы Играть, а в поля вывода чисел выводятся новые значения. 7. Прокрутить окно Редактор кода (Code Editor) вниз, а затем в качестве последней строки процедуры события Button1_Click()между операторами End IfиEnd Subвведите следующий оператор:
Label6.Text = HitRate(Wins, Spins)
При вводе функции HitRate() обратите внимание, как Visual Studio автоматически отображает имена и типы аргументов только что созданной функции HitRate() (удобная подсказка). Целью этого оператора является вызов функции HitRate() с использованием переменных Winsи Spins в качестве ее аргументов (фактических параметров). Возвращаемый результат – это процентное соотношение в строковом формате, и это значение при каждой игре присваивается свойству Text надписи формы Label6. 8. Прокрутить процедуру события Form1_Load() в окне Редактор кода (Code Editor) вниз Теперь при каждом запуске программы сгенерированные случайные числа будут соответствовать одному и тому же шаблону. Это помогает тестировать код, но по окончании тестирования не забудьте вернуть эту функцию обратно, чтобы результаты снова стали случайными.
9. Чтобы запустить измененную программу Пример-4.3.1-1 (Счастливая семерка-3) следует щелкнуть на кнопке Start Debugging.
10. Щелкнуть 10 раз на кнопке Играть. После 10 игр экран выглядит так, как показано на рис. 4.3.1-2.
Рис. 4.3.1-2 . Если продолжить щелкать, то можно будет увидеть, что количество выигрышей упадет примерно до 28%. Функция HitRate() показывает, что в начале игры вы были слишком удачливы, но затем вам пришлось столкнуться с реальностью. 11. Когда закончите работать с программой, щелкнуть на кнопке Конец игры. Программа остановится и вернется в среду разработки. Чтобы увидеть, как программа работает «по-настоящему», верните в процедуру события Form1_Load() функцию Randomize. 12. Чтобы сохранить изменения, щелкните на кнопке Сохранить все(Save All) на стандартной панели инструментов. Процедуры- Sub похожи на процедуры- Function, за исключением того, что процедура- Sub не возвращает значения, связанного с ее именем. Процедуры- Sub также используются для обработки и обновления переменных, получаемых через список аргументов вызова процедуры, и передачи в вызывающую программу одного или несколько значений.
Базовый синтаксис описания процедуры Sub имеет вид
Sub ИмяПроцедуры ( ФормальныеПараметры ) … ОператорыПроцедуры … End Sub Отметим следующие синтаксические элементы: · ИмяПроцедуры – это имя создаваемой процедуры- Sub. · Формальные параметры (аргументы) - это список необязательных аргументов, разделенных запятыми, если их больше одного, и используемых в процедуре- Sub. Причем к аждый аргумент должен быть объявлен с указанием конкретного типа данных. По умолчанию VS добавляет к каждому аргументу ключевое слово ByVal,которое указывает на то, что в процедуру-подпрограмму через данный аргумент передается копия значения, и все изменения значения этого аргумента не будут возвращены в вызывающий код. · ОператорыПроцедуры – это блок операторов, который выполняет работу процедуры по заданному алгоритму.
При вызове процедуры- Sub количество и типы аргументов, передаваемых в процедуру, должны совпадать с количеством и типом аргументов, указанных при объявлении (описании) процедуры (количество формальных и фактических параметров), и вся группа аргументов должна быть заключена в круглые скобки. Если переменные, передаваемые в процедуру-Sub, изменяются при ее выполнении, то обновленные переменные не возвращаются, если процедура не объявляет эти аргументы с помощью ключевого слова ByRef.По умолчанию процедуры-Sub в модуле объявляются как открытые, так что они могут вызываться любой процедурой проекта. Необходимо отметить, что в Visual Basic все вызовы процедур- Sub после имени процедуры должны содержать круглые скобки. Если в процедуру не передается ни одного аргумента, то требуется наличие пустых круглых скобок. Процедуры Sub часто используются для обработки ввода данных в программу, когда информация поступает из двух или более источников, и требуется, чтобы она была в одном и том же формате. В следующем примере будет создана процедура- Sub с именем AddName(), которая запрашивает у пользователя ввод данных и форматирует текст так, что его можно отобразить в нескольких строках в текстовом поле. Процедура сэкономит время, затрачиваемое вами на программирование, так как вы будете использовать ее в двух процедурах событий, и в каждой она будет связана с различными текстовыми полями.
Пример 4.3.1-2. Создание процедуры-Sub для ввода текстового поля. 1. Создать новый проект с именем Пример-4-3-2-2. Будет создан новый проект, и в окне Конструктор (Designer) появится пустая форма. 2. Использовать элемент управления Textbox для создания двух текстовых полей, расположенных в центре формы рядом друг с другом. Сегодня будем принимать решение о распределении группы студентов по подгруппам, и эти текстовые поля будут использоваться для хранения имен студентов, которые будут прикрепляться к двум преподавателям. 3. Использовать элемент управления Label и создать над этими текстовыми полями две надписи. Эти надписи будут содержать имена преподавателей. 4. Использовать элемент управления Button и создать три кнопки: по одной под каждым текстовым полем и одну в нижней части формы. Первые две кнопки будут использоваться для назначения студентов в подгруппы, а последняя кнопка – для выхода из программы. 5. Для этих объектов формы установить свойства, приведенные в таблице 4.3.1-2. Так как текстовые поля будут содержать более одной строки, для них требуется установить свойства Multilineв значение True, а свойства Scrollbars - в значение Vertical. Эти установки обычно используются тогда, когда в текстовых полях отображается несколько строк текста. Также требуется установить их свойства TabStopв значение False, a их свойства ReadOnly в значение True так, чтобы информацию нельзя было бы изменить. Таблица 4.3.1-2
6. Изменить размер и положение объектов так, чтобы форма выглядела как на рис. 4.3.1-3.
Рис. 4.3.1-3
Теперь требуется создать процедуру Sub общего назначения с именем AddName(). 7. Ввести код процедуры AddName, показанный на рис.4.3.1-4.
Рис. 4.3.1-4
Эта процедура- Sub общего назначения для запроса имени студента использует функцию InputBox(). При вызове процедуры она получает два аргумента: Team, являющийся строкой, содержащей имя преподавателя подгруппы, и ReturnString, который содержит пустую строковую переменную для отформатированного имени студента. ReturnString объявлена с ключевым словом ByRef, так что все изменения, сделанные в этом аргументе в процедуре, будут переданы через этот аргумент обратно в вызывающий код. Прежде чем имя студента будет возвращено, к строке добавляются символы возврата каретки и перевода строки – chr(13)+chr(10) или vbCrLf, и, таким образом, каждое имя в текстовом поле будет отображаться на отдельной строке. Эту методику можно использовать в любой строковой переменной, где требуется создать новую строку. 8. Снова отобразить форму, а затем дважды щелкнуть на первой из кнопок Добавить имя формы (кнопке под текстовым полем Доц. Скрыпникова М.И.). В процедуре события Button1_Click() ввести следующие операторы:
Вызов процедуры AddName()включает один аргумент, передаваемый по значению («Студентов группы 1.»), и один аргумент, передаваемый по ссылке (Gr1Pos). Последняя строка использует аргумент, переданный по ссылке, для добавления текста в текстовое поле TextBox1. Оператор конкатенации (&) добавляет новое имя в конец текста в этом текстовом поле. 9. В окне Редактор кода (Code Editor) щелкнуть на стрелке Class Name и в списке выбрать объект Button2. Затем щелкнуть на стрелке Method Name (имя метода) и выбрать событие Click. В окне Редактор кода (Code Editor) появится процедура события Button2_Click(). 10. В этой процедуре события ввести следующие операторы:
Эта процедура события идентична Button1_Click(), за исключением того, что она посылает в процедуру AddName имя «Студентов группы 2» и обновляет текстовое поле TextBox2. 11. Щелкнуть на стрелке Class Name и в списке выберать объект Button3. Затем щелкнуть на стрелке Method Name и выбрать событие Click. В окне Редактор кода (Code Editor) появится процедура события Button3_С1ick(). 12. В процедуре события Button3_Click() ввеcти оператор End(рис. 4.3.1-5).
Рис. 4.3.1-5
13. Чтобы сохранить изменения, щелкнуть на кнопке Сохранить все (Save All) на стандартной панели инструментов. 14. Чтобы запустить программу, щелкните на кнопке Начать Отладку (Start Debugging), расположенной на стандартной панели инструментов. 15. Щелкните на кнопке формы Добавить имя студента под текстовым полем Доц.Скрыпникова М.И., а затем введите в поле ввода Иванов Иван И. (Вы можете ввести и какое-нибудь другое имя.) Поле ввода должно выглядеть примерно так, как на рис. 4.3.1-6.
Рис. 4.3.1-6
16. Чтобы добавить это имя в текстовое поле Доц.Скрыпникова М.И., щелкните на кнопке ОК. Имя появится в первом текстовом поле. 17. Щелкните на кнопке формы Добавить имя студента под текстовым полем Доц.Кувыкина М.И., введите в поле ввода имя Петров Сидор В., а затем нажмите на <Enter >. Имя появится в текстовом поле подгруппы 2. Экран при этом будет выглядеть примерно так, как показано на рис. 4.3.1-7.
Рис. 4.3.1-7
18. В каждое из этих двух текстовых полей введите еще по нескольку имен. Каждое имя в текстовых полях отображается в отдельной строке. Эти текстовые поля не прокручиваются автоматически, так что если ввести больше имен, чем помещается в текстовое поле, то увидеть все имена одновременно не удастся. Для доступа к невидимым именам следует использовать полосы прокрутки. 19. Когда закончите ввод, щелкните на кнопке Выход, чтобы остановить программу.
Пример 4.3.1-2 продемонстрировал, что одна процедура- Sub может выполнять задачи ввода для двух и более процедур событий. Используя эту базовую концепцию как отправную точку, можно создать более сложные программы, которые используют процедуры типов Sub и Function для выполнения общих задач.
|