Опубликован: 31.08.2006 | Доступ: свободный | Студентов: 3932 / 218 | Оценка: 4.14 / 3.89 | Длительность: 39:16:00
ISBN: 978-5-9570-0021-3
Лекция 11:

Использование модулей и процедур

Запуск программы Text Box Sub
  1. Чтобы запустить программу, щелкните на кнопке Start (Начать) на стандартной панели инструментов.

    Примечание. Готовая программа Text Box Sub лежит в папке c:\vbnet03sbs\Гл.10\text box sub.
  2. Щелкните на кнопке Добавить имя под текстовым полем Продажи, а затем введите в поле ввода Мария Палермо. (Можете ввести любое другое имя.) Ваше поле ввода должно выглядеть примерно так.


  3. Чтобы добавить это имя в текстовое поле Продажи, щелкните на кнопке OK. Имя появляется в этом текстовом поле.
  4. Щелкните на кнопке Добавить имя под текстовым полем Маркетинг, введите в поле ввода Маркетинг имя Александр Петров, а затем нажмите на (Enter). Имя появляется в этом текстовом поле Маркетинг. Ваш экран должен выглядеть примерно так.


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

Следующий шаг: передача аргументов по значению и по ссылке

При обсуждении подпрограмм Function и Sub вы узнали, что аргументы передаются в процедуры по значению или по ссылке. Использование ключевого слова ByVal указывает, что переменные должны быть переданы в процедуру по значению (тип передачи по умолчанию). Все изменения, сделанные в переменной, переданной по значению, не передаются обратно в вызывающую процедуру. Однако, как вы узнали при написании программы Text Box Sub, использование ключевого слова ByRef указывает, что переменные должны быть переданы в процедуру по ссылке, что означает, что все изменения, сделанные в переменной в рамках процедуры, будут переданы обратно в вызывающий код. Передача по ссылке может дать значительные преимущества, если вы позаботитесь о том, чтобы случайно не изменить переменную в процедуре. Рассмотрим объявление и вызов следующей процедуры Sub:

Sub CostPlusInterest(ByRef Cost As Single, ByRef Total As Single)
	Cost = Cost * 1.05 'добавляем 5% к цене:
	Total = Int(Cost)  'переводим в целое и возвращаем
End Sub
.
.
.
Dim Price, TotalPrice As Single
Price = 100
TotalPrice = 0
CostPlusInterest(Price, TotalPrice)
MsgBox(Price & " плюс 5% получится " & TotalPrice)

В этом примере программист передает в процедуру CostPlusInterest по ссылке две переменные одинарной точности: Price и TotalPrice. Программист планирует использовать обновленную переменную TotalPrice в последующем вызове MsgBox, но, к сожалению, забыл, что переменная Price в процедуре CostPlusInterest на одном из промежуточных шагов также обновляется. (Так как Price была передана по ссылке, изменения в Cost автоматически приводят к изменениям в Price.) При запуске программы это приводит к следующему некорректному результату.


Вероятно, программист хотел отобразить следующее сообщение.


Что использовать: ByVal или ByRef?

Как же следует исправить показанную выше ошибку в процедуре CostPlusInterest? Простейшим способом является объявление аргумента Cost с помощью ключевого слова ByVal, как показано в следующем операторе программы:

Sub CostPlusInterest(ByVal Cost As Single, ByRef Total As Single)

Объявление Cost с использованием ByVal позволяет безопасно изменять в процедуре CostPlusInterest параметр Cost, не передавая эти изменения обратно в вызывающую процедуру. Сохранение объявления Total с помощью ByRef позволяет изменять передаваемую переменную, и в вызывающую процедуру будут переданы только эти изменения. В общем, если вы используете ByRef только тогда, когда это необходимо, в ваших программах будет меньше ошибок.

Вот некоторые рекомендации о том, когда следует использовать ByVal, а когда - ByRef.

  • Используйте ByVal, когда вы не хотите, чтобы процедура изменяла передаваемую в нее через аргумент переменную.
  • Используйте ByRef, когда хотите позволить процедуре изменять передаваемую в нее переменную.
  • Когда сомневаетесь, используйте ключевое слово ByVal.

Краткая справка по лекции 10

Чтобы Сделайте следующее
Создать новый модуль Щелкните на кнопке Add New Item (Добавить новый компонент) на стандартной панели инструментов, а затем выберите шаблон Module (Модуль) или щелкните на кнопке Add New Item (Добавить новый компонент) в меню Project (Проект), а затем выберите шаблон Module (Модуль).
Сохранить модуль под новым именем Выберите модуль в Solution Explorer (Обозревателе решений), щелкните на команде Save Module1.vb As (Сохранить как) в меню File (Файл), а затем укажите новое имя.
Удалить модуль из программы Выберите модуль в Solution Explorer (Обозревателе решений), а затем щелкните на команде Exclude From Project (Исключить из проекта) в меню Project (Проект).
Добавить в проект существующий модуль В меню Project (Проект) щелкните на команде Add Existing Item (Добавить существующий компонент).
Создать открытую переменную Объявите переменную в стандартном модуле между ключевыми словами Module и End Module с помощью ключевого слова Public. Например: Public TotalSales As Integer
Создать открытую функцию

Поместите операторы функции в стандартном модуле между ключевыми словами Function и End Function. Функции по умолчанию объявляются как открытые. Например:

Function HitRate(ByVal Hits As Short, ByVal _
	Tries As Short) As String
	Dim Percent As Single
	Percent = Hits / Tries
	Return Format(Percent, "0.0%")
End Function
Вызвать процедуру типа Function Введите в операторе программы имя функции и все необходимые аргументы и присвойте ее переменной или свойству, имеющим соответствующий тип. Например: lblRate.Text = HitRate(Wins, Spins)
Создать открытую процедуру типа Sub

Поместите операторы процедуры в стандартном модуле между ключевыми словами Sub и End Sub. Процедуры Sub по умолчанию объявляются как открытые. Например:

Sub CostPlusInterest(ByVal Cost As Single, _
	ByRef Total As Single)
	Cost = Cost * 1.05
	Total = Int(Cost)
End Sub
Вызвать процедуру типа Sub Введите в операторе программы имя процедуры и все необходимые аргументы. Например: CostPlusInterest(Price, TotalPrice)
Передать аргумент по значению Используйте при объявлении процедуры ключевое слово ByVal. Например: Sub GreetPerson(ByVal Name As String)
Передать аргумент по ссылке Используйте при объявлении процедуры ключевое слово ByRef. Например: Sub GreetPerson(ByRef Name As String)
Сайдахмад Зарипов
Сайдахмад Зарипов
Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?

Светлана Ведяева
Светлана Ведяева
Россия, Саратов
Оксана Пагина
Оксана Пагина
Россия, Москва