Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
14.12.2015
Размер:
19.45 Кб
Скачать

Visual Basic с нуля. Глава 16. Стандартный модуль. Процедуры Function и Sub. Пособие-самоучитель on-line "Visual Basic с нуля" Глава . Стандартный модуль. Процедуры общего назначения типов Function (функция), Sub (подпрограмма). Ключевое слово ByVal. Скачать исходник программы Proc Дата создания 08.03.2005 {Автор 4us} Что такое стандартный модуль. Обычно программа, состоит из более, чем одной форм. Часто возникает необходимость использовать содержимое переменной, полученной в одной форме для обработки в другой. Однако переменные, объявленные в форме в разеле General доступны только внутри этой же формы (контейнера). Для того, чтобы нужные переменные, подпрограммы, функции были доступны во всей программе, во всех формах, их объявляют в стандартных модулях.

Стандартный модуль в физическом смысле представляет собой файл с расширением .bas. Чтобы добавить стандартный модуль в exe-проект, надо в меню Проект (Project) щелкнуть по команде Добавить Модуль (Add Module) - рис. 26.

Рисунок 26.

После этого появиться окно добавления модуля рис.27

Рисунок 27.

в котором надо щелкнуть по кнопке Open (открыть). После этого в окне проекта вы увидите новую папочку Модули, в которой появиться наш первый модуль Модуль1. Хотя его имя, конечно, можно поменять в нижнем окне свойств Рис 28.

Рисунок 28.

После этого ты можешь щелкнуть по Модуль1 в окне проекта и перед тобой откроется окно модуля, такое же как и окно кода формы. В отличие от формы, модуль не имеет вида Объект, в него нельзя встраивать никакие другие объекты, так как он контейнером не является. В него лишь можно записывать код абсолютно также, как и в форму. В чем же радость от модулей, поскольку мы вроде бы пока обходились и без них.

Ну во-первых, как уже было сказано выше, объявленные в модуле переменные могут быть доступны во всем проекте, во всех его формах. Для этого переменная объявляется в разделе General с ключевым словом Public. Например

Public RazmerMassiva As Long

Такие переменные называются глобальными переменными и срок их жизни такой же, как и у всего проекта (т.е. пока программа не закрыта). При этом в формах объявлять эту переменную уже не надо.

Напоминаю: если не указывать тип переменной, то по умолчанию она будет типом Variant, и соответственно памяти под нее будет выделено по-максимуму.

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

В-третьих, разбитый на модули код гораздо удобней отлаживать и читать, поскольку программа делиться на логические блоки, а это деляет код программы яснее и понятнее.

Итак, мы можем создать в модуле три вида процедур:

Function (функция) - выполняет действия и возвращает значение (значение функции) - как правило одно, являющееся результатом этих действий (например вычисления)

Sub (подпрограмма) - выполняет действия, но значения, ассоциированного со своим именем не возвращает, хотя может возвращать значения нескольких переменных. (например действия ввода-вывода, изменения свойств и т.п.).

Property (свойство) - создает определяемые пользователем свойства. Применяется при создании классов и здесь рассматриваться не будет. Поговорим об этом, когда будем делать какой-нибудь контрол. Процедуры типа Function - функция.

Синтаксис процедуры Function следующий:

Function имя функции (аргументы) As тип функции

операторы, выполняющие вычисления

End Function

Как видишь, синтаксис функции напоминает процедуры обработки событий, с которыми мы работали ранее. Начинается все ключевым словом Function, затем пишется имя функции, которое мы сами придумываем, далее следуют аргументы (необязательно), которые функция будет обрабатывать и которые передаются при вызове функции из программы. Затем можно определить тип возвращаемого функцией значения (по умолчанию - Variant). Далее в теле функции следуют операторы, выполняющие действия. И затем функция закрывается оператором End Function.

Смысл работы с функциями точно такой же, как и со встроенными функциями Visual Basic. Тебе надо вызвать функцию и передать в нее значения, с которыми она будет работать. Далее функция производит определенные операторами тела функции действия с этими значениями и сама принимает значение результата этих действий, которое далее используется в основном коде. Чтобы вызвать свою функцию, надо использовать оператор типа:

Text1.Text=Имя функции (значения, передаваемые в функцию)

Теперь, в качестве примера, давай создадим собственную функцию, которая будет возвращать количество слов в тексте.

Начнем новый Exe-проект. На форму положим Text1, куда мы запишем текст, который будет анализировать наша функция. Кроме того нам понадобиться Label1, куда мы выведем возврашаемое функцией значение и кнопка Command1, которой мы будем вызывать нашу функцию.

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

Function CountWords(Stroka) As Long

'Далее мы объявляем три необходимых нам переменных. Ну x - это просто для цикла, где мы

'будем перебирать каждую буковку и искать пробелы. NumWords - это как раз переменная, в

'которую мы будем записывать количество слов. FlagSlovo - это флаг, благодаря которому мы

'отследим, было ли слово перед тем, как был найден пробел. Таким образом мы избежим

'неправильного подсчета слов из-за того, что слова могут быть написаны через несколько

'пробелов, а кроме того сама строка может начинаться с пробела.

Dim x As Long

Dim NumWords As Long

Dim FlagSlovo As Boolean

'Организуем цикл по количеству символов в строке ( Len(Stroka))

For x = 1 To Len(Stroka)

'Теперь, если значение символа - не пробел (код пробела - 32), присваиваем нашему флагу значение True

If Mid(Stroka, x, 1) <> Chr(32) Then FlagSlovo = True

'А далее анализируем: если у нас нашелся пробел и значение флага True, значит можно считать, что этим пробелом

'закончилось слово и мы увеличиваем наш счетчик слов NumWords на единицу и сбрасываем

' значение флага FlagSlovo на False

If Mid(Stroka, x, 1) = Chr(32) And FlagSlovo = True Then

NumWords = NumWords + 1

FlagSlovo = False

End If

Next x

'А далее, поскольку последнее слово может не заканчиваться пробелом, делаем проверку флага и если

' его значение True увеличиваем значение счетчика еще на единицу.

If FlagSlovo = True Then NumWords = NumWords + 1

'Далее мы тупо присваиваем значение счетчика нашей функции.

CountWords = NumWords

'Вот и все. Простая функция с одним аргументом готова.

End Function

Теперь на надо использовать нашу замечательную функцию. Сохраним проект и закроем модуль. Вернемся к нашей форме. В процедуре Form_Load присвоим Text1 какое-нибудь значение, чтобы нашей функции было с чем работать

Private Sub Form_Load()

Text1.Text = "Microsoft Visual Basic 6 Professional Edition " _

& "- это мощная система программирования, позволяющая быстро и" _

& " эффективно создавать приложения для Microsoft Windows и Microsoft Windows NT "

End Sub

Затем в процедуре кнопки Command1 напишем оператор вызова функции и присваивания его значения Label1:

Private Sub Command1_Click()

Label1.Caption = CountWords(Text1.Text)

End Sub

Теперь при нажатии кнопки Command1 мы в лейбле будем получать количество слов текстбокса. Конечно, как и в любой функции, можно вместо Text1.Text использовать переменную или просто написать любой текст.

Естествено, в функцию можно передать несколько аргументов. Исключительно для иллюстрации: мы можем находить, например, количество слов, начиная с n-ого символа. Для этого в модуле в объявление функции надо добавить аргумент, обозначающий номер символа (назовем его Position):

Function CountWords(Stroka, Position) As Long

и изменить наш цикл, который будет работать не с x=1, а x=Position

For x = Position To Len(Stroka)

А в форме, соответственно, вызов функции для подсчета слов , например, с 30-ой позиции, будет выглядеть

Label1.Caption = CountWords(Text1.Text, 30)

Это будет уже функция с двумя аргументами. Ну принцип, я думаю, ясен.

Процедуры типа Sub - подпрограмма.

Синтаксис процедуры Sub следующий:

Sub имя процедуры(аргументы)

операторы, выполняющие действия

End Sub

Здесь, также как и в функции, имя процедуры мы придумываем сами, аргументы - это данные, которые мы передаем в подпрограмму и с которыми она будет работать. Напишем подпрограмму, которая будет записывать в файл текст из Text1 нашей формы. Чтобы не путаться, добавим в наш проект еще один модуль Module2. Имя нашей процедуры будет AddFileText. В качестве аргументов мы должны передать в подпрограмму имя файла (NameF) и собственно текст (MyText). Пишем во втором модуле

Sub AddFileText(NameF As String, MyText As String)

Dim F As Long

F = FreeFile

Open App.Path & "\" & NameF For Append As #F

Print #F, MyText

Close #F

End Sub

Здесь все должно быть понятно - просто открываем файл с именем NameF и записываем содержимое переменной MyText.

Положим на нашу форму вторую кнопку Command2 и в ее процедуре напишем оператор вызова подпрограммы для записи в файл bbb.txt текста из Text1:

Private Sub Command2_Click()

AddFileText "bbb.txt", Text1.Text

End Sub

Теперь, при нажатии кнопки Command2, у нас в файл bbb.txt будет дописываться текст из текстбокса. В данном случае никаких изменений с передаваемыми значениями аргументов не происходило. И произойти не могло, потому, что мы передали конкретное значение, а не переменную. Такая передача данных называется передача по значению. Однако можно ведь использовать и переменные. Такой способ передачи - по ссылке, может привести к тому (не в нашем случае), что в процессе выполнения подпрограммы значение переменных изменится и в программу вернутся уже измененные значения. Иногда это даже нужно, а иногда это наоборот может привести к ошибке. Чтобы избежать изменения значения переменной в процедуре, используется ключевое слово ByVal. При его использовании VB сохраняет изначальное значение и после окончания процедуры возвращает первоначальное значение переменной, даже если оно было изменено в ходе работы подпрограммы. Синтаксис использования этого ключевого слова в подпрограмме таков:

Sub AddFileText(ByVal NameF As String, MyText As String)

Скачать исходник можно вверху страницы.

Справочно: Процедуры типа Property - свойство.

Помимо процедур типа Function и Sub существуют процедуры типа Property. С их помощью можно определять свойства класса. Поскольку использование классов - дело будущего, то на процедурах Property мы сегодня останавливаться не будем.

Copyright © 2005 4us  

Соседние файлы в папке Самоучитель