Рефераты

Реферат: Програмирование на Visual Basic

1=1+1

Loop

End Sub

Окна для ввода и вывода в приведенных примерах имеют вид на рис. 3.11 и 3.12.

Альтернативным способом ввода нескольких значении элементов массива может

быть использование текстового окна и его свойств SelLength, SelStart, SelText

(см описание текстового окна) В определенных позициях текстового окна можно

задавать значения различных элементов массива и с использованием указанных

функции эти поля выделять (аналогично тому, как осуществлялся ввод данных в

текстовой строке ввода в операционнои системе DOS и др ) Создадим форму и

разместим на ней текстовое окно, определив максимальное число символов 80

(свойство MaxLength = 80)

Исторический экскурс' когда-то недавно на перфокарте можно было “набить” 80

символов и строка фортран-программы состояла из 80 позиции Каждый элемент

массива будем располагать последовательно в четырех позициях строки (число

символов вводимого числа, включая десятичную точку, не превышает 4) Пробелы

между числами отсутствуют

Имя текстового окна Input_Txt Остальные параметры определяются по умолчанию

Определим процедуру обработки события нажатия клавиши KeyPiess

Sub Inpui:_Txt_KeyPress (KeyAscii As Integer) Static A(1 To 5) As Single

If KeyAscii = 13 Then For I = 1 To 5 Input-_txt. SalStart-f’I 1) *4

'последовательно

'определяется начальная позиция вводимого числа lnput_txt.SelLength= 4

'определяется количество ' вводимых символов

A(I) = Val(Input_txt.SelText) 'выделяются 'необходимые символы и преобразуются

'в числовое значение (функция Val) Print A(I}; 'печать введенных

значении на форме Next I End If

Процедура обеспечивает ввод значении пяти элементов массива при нажатии

клавиши “Enter” (ASC1I-код клавиши равен 13). Стоящая “,” после оператора

Punt A(I) обеспечивает печать следующего элемента массива на той же строке

сразу после предыдущего.

Альтернативно можно использовать “,” (выводимые значения располагаются на одной

строке в фиксированных зонах формы) При отсутствии указанных символов выводимые

значения располагаются на отдельных строках На рис 3 13 показаны вводимые

символы и распечатываемые значения Пример программы.

В качестве примера приводится программа нахождения суммы элементов матрицы

3*4 (три строки и четыре столбца), хотя бы один индекс которых кратен трем.

Текст программы размешается в процедуре обработки события щелчка мыши по

форме. Для ввода исходных данных (значений каждого из элементов матрицы)

используется три текстовых окна (одно окно для каждой строки матрицы). Каждое

значение занимает последовательные четыре позиции строки окна. Введенная

матрица и результат выводятся на форму.

Текст процедуры:

Private Sub Form_Click ()

Static A(1 То 3, 1 То 4), Sum As Single For J = 1 To 4 Input_txtl.SelStart =

(J - 1) * 4 'последовательно

“определяется начальная позиция вводимого числа Input_txtl.SelLength = 4

'определяется количество

'вводимых символов А(1, J) = Val(Input_txtl.SelText) 'выделяются

'необходимые символы и

'преобразуются в числовое значение (функция Val) Next J

Print А(1, 1), А(1, 2), А(1, 3), А(1, 4) For J = 1 То 4 Input_txt2.SelStart =

(J - 1) * 4 'последовательно

'определяется начальная позиция вводимого числа Input_txt2.SelLength = 4

'определяется количество

'вводимых символов А(2, J) = Val(Input_txt2.SelText) 'выделяются

'необходимые символы и преобразуются в числовое

'значение (функция Val) Next J

Print А(2, 1), А(2, 2), А(2, 3), А(2, 4) For J = 1 То 4

Input_txt3.SelStart = (J - 1) * 4 'последовательно

'определяется начальная позиция вводимого числа Input txt3.SelLength = 4

'определяется количество

'вводимых символов А(3, J) = Val(Input_txt3.SelText) 'выделяются

'необходимые символы и преобразуются

'в числовое значение (функция Val) Next J

Print А(3, 1), А(3, 2), А(3, 3), А(3, 4) Sum = О

For I = 1 То 3 алгоритм For J = 1 То 4 суммирования IfI/3=I\30rJ/3=J\3 Then

элементов Sum = Sum + A(I, J) матрицы, один

Рис. 3.14

3.5.6. Совместное использование операторов цикла и условного операторов

При одновременном использовании в процедурах и функциях операторов цикла и

условных операторов должно выполняться так называемое правило вложенности.

Если среди операторов, выполняющихся в цикле (циклы For-Next и Do-Loop),

имеется условный оператор (If-Endlf), то условный

оператор должен целиком содержаться внутри цикла (между операторами For-Next

или Do-Loop). Если в Then — блоке или Else ~ блоке условного оператора It’-

Endlf имеются выполняющиеся в цикле операторы (циклы For-Next и Do-Loop), то

эти циклы Должны целиком содержаться в этих блоках.

Следующие схемы иллюстрируют принцип корректного совместного использования

циклов и условных операторов:

3.6. ПРОЦЕДУРЫ И ФУНКЦИИ

  • В предыдущих разделах рассматривались процедуры обработки событий,

    которые в процессе выполнения программы инициировались (запускались) в

    результате свершения некоторого определенного события (щелчок мыши,

    нажатие клавиши и т.п.). Однако в Visual Basic имеется возможность

    выделить неоднократно повторяющиеся фрагменты программы в определенным

    образом организованные функциональные блоки операторов, которые можно

    использовать без их повторного написания и отладки. При этом сложные

    программы получаются более компактными, а функциональные блоки при их

    правильной организации могут использоваться в других программных

    разработках. Организовать функциональные блоки в Visual Basic можно в виде

    процедур (procedure) и функции (function).

Любая программа на Visual Basic является процедурой или функцией.

Схема, показанная на рис. 3.15, иллюстрирует последовательность выполнения

программы, состоящей из процедур и функций (рис. 3.15).

Рис Ч 15

Выполнение профаммы начинается в основной (первой) функции или процедуре, iij

которой вызываются другие процедуры или функции (Процедура А). После вызова

выполняется вызванная процедура (Процедура А), которой передается управление

выполнением программы. В свою очередь в вызванной процедуре могут быть

обращения к другим процедурам или функциям (Функция Б) и т.д. (Visual Basic

отслеживает до нескольких сот уровней вызовов).

Прекращение выполнения вызванной процедуры или функции (Возврат) означает

возвращение в вызывающую процедуру или функцию, выполнение которой

продолжается с оператора, следующего за вызывающим оператором.

В программе, состоящей из нескольких процедур или функций, необходимо

остановиться на понятии локальные и глобальные данные.

Локальные данные определены только в момент выполнения процедуры или функции

и память для них выделяется только на момент выполнения.

После завершения выполнения процедуры или функции локальные данные не

сохраняются (выделенная память используется Другими процедурами и функциями).

При этом экономится память, так как она выделяется только по мере

необходимости и операционные системы современных компьютеров это делают очень

эффективно. Однако и Visual Basic имеется и возможность сохранять локальные

данные до следующего обращения (специальный параметр Static, см. ниже).

Глобальные данные сохраняются пока выполняется программа и они доступны для

всех входящих в программу процедур и функции. При запуске программы Visual

Basic отводит для глобальных данных необходимую память.

Повторный вьпов процедуры или функции внутри этой же процедуры пли функции

(обращение к самой себе) называется рекурсией. Visual Basic допускает

рекурсивное обращение.

Программный код процедур и функций, не являющихся процедурами обработки

событии, помещается в раздел general списка Object формы (щелчок мыши по

кнопке Wiew Code окна Project и далее щелчок мыши по элементу раскрывающегося

списка general). Кроме того, в раскрывающемся меню Insert Главного меню

имеется пункт Procedure (рис. 3.16). выбор которого раскрывает специальное

окно для выбора процедуры или функции п задания имени (рис. 3.17).

Для заданной процедуры или функции появляется шаблон (заготовка) в окне кода

(первая п последняя строки программы), в который можно ввести текст

программы.

Рис. 3 16

3.6.1. Процедуры

Синтаксически процедура определяется [Private | Public] [Static] Sub имя

процедуры [(список аргумен-

[операторы объявления] [операторы} [Exit Sub] [операторы} End Sub

Рис. 3.17

где Private, Public, Static, Sub, Exit Sub, End Sub - ключевые слова.

Sub определяет обязательный первый оператор процедуры. End Sub -

обязательный последний оператор процедуры;

имя процедуры образуется в соответствии с общими правилами

образования имен, но не может иметь описателей типа (имя процедуры не принимает

значения);

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

[Optional] [ By Val | ByRef] [ParainArray] имя [( )] [As тип]

где Optional, ByVal, ByRef, ParaniArray и As ключевые слова;

имя — имя переменной, массива (в случае массива используется

имя ( ) без указания границ значения индексов, что позволяет использовать

одну процедуру для разного числа элементов массива в каждом конкретном случае),

элемента управления или формы (в последних двух случаях тип принимает значения

Control и Form).

Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double,

Date, String (только переменной длины). Variant, пользовательский тип или

Control и Form. As тип необходимо применять для каждого аргумента.

Список аргументов определяет связь по данным между вызывающей (процедура, из

которой происходит вызов) и вызываемой (процедура, которая вызывается)

процедурами. Локальные данные, определенные внутри процедуры (кроме тех, что

определены в списке general для форм), не могут использоваться в других

процедурах (например, переменные с одинаковыми именами, но объявленные в

разных процедурах, хранятся в разных ячейках памяти и изменение переменной в

одной из процедур не ведет к изменению одноименной переменной в другой

процедуре). Процедуры, относящиеся к форме, но не являющиеся процедурами

обработки событий, помещаются в раздел general формы.

Процедура не может быть определена внутри какой-либо процедуры или функции.

Пример процедуры вычисления площади прямоугольника по заданным значениям сторон:

Sub SubDemo (RLen, Rwid) ' 'заголовок процедуры

‘SubDemo с двумя аргументами-

‘R1en-длина и Rwid-ширина

Dim Area 'объявление локальной переменной Area = RLen * Rwid '

расчет площади MsgBox “Площадь равна” & Area “печать результата

End-Sub

Пример процедуры на основе рассмотренного выше фрагмента программы

формирования вектора из сумм элементов столбцов матрицы:

Sub SubMatrVektor (A() As Single, B() As Single, .

MaxI As Integer, MaxJ As Integer)’ Dim J, I As

Integer For J = 1 To MaxJ 'верхняя граница индекса J

'определяется передаваемым 'аргументом процедуры Л(J) = 0 'присвоение

начального значения

'элемента вектора For I = 1 То MaxI 'верхняя граница индекса

'I определяется

Передаваемым аргументом процедуры А(J) = А(J) + B(I,J) 'вычисление суммы

в цикле Next I Next J End Sub

Изменяя значения аргументов данную процедуру можно использовать для работы с

матрицами произвольного размера.

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

процедуры.

Exit Sub вызывает прекращение выполнения процедуры и пыход из нее в

вызывающую программу.

Static определяет, что локальные данные (переменные, массивы),

определенные внутри процедуры (переменная Area в примере), сохраняются в

промежутках между вызовами данной процедуры. Определение Static не

распространяется на данные, которые объявлены вне данной процедуры, но

используются в ней (т.е. эти данные будут изменяться независимо от определения

Static). Нельзя использовать при рекурсивном вызове процедуры.

Private определяет, что процедура может быть вызвана (доступна) только ц

том модуле, в котором она объявлена (никакие другие процедуры в других модулях

не могут вызвать данную процедуру). Определение Private не имеет смысла, если

процедура определена для какой-либо формы (в этом случае процедура недоступна

из вне данной формы).

Public определяет, что процедура может быть вызвана из любого модуля приложения.

Поскольку имя процедуры определяется (глобально распознается) в рамках всех

процедур всех модулей одной программы, имя процедуры не должно совпадать с

другими глобально распознаваемыми именами программы. Такими глобально

распознаваемыми именами являются имена других процедур Visual Basic или

процедур динамически подключаемых библиотек (dynamic-link library [DLL|) и

данных, объявленных как Global (см. выше).

Чтобы избежать конфликта в объявлении одних и тех же имен, можно использовать

определение Private, т.е. сделать процедуру доступной только в рамках модуля.

В этом случае имя процедуры не может совпадать с такими именами, объявленными

на уровне модуля, как имена переменных, массивов, констант и имена других

процедур данного модуля.

Optional определяет, что аргумент не является обязательным. При его

использовании все последующие аргументы в списке аргументов также являются

необязательными и для них также необходимо использовать данное ключевое слово.

Аргументы, объявленные Optional, должны иметь тип Variant. He может

использоваться для аргумента, для которого задан параметр ParamArray.

ByVal определяет, что аргумент передается в процедуру по значению (см. ниже).

ByRef определяет, что аргумент перелается в процедуру по ссылке (см. ниже).

ParamArray относится к последнему аргументу в списке аргументов и

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

массивом. Не может использоваться совместно с параметрами ByVal, ByRef,

Optional.

Пример.

Sub ReturnTwice(ReturnValue, Optional A) If IsMissing(A) Then 'функция

IsMissing ()

“проверяет передачу аргумента А в процедуру ReturnValue =Null 'если аргумент

не передается,

'вычисляемое значение присваивается О Else ReturnValue = A * 2 'если

аргумент передается,

'вычисляется значение от аргумента End If End Sub

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

имя процедуры[список значении} или

Call имя процедуры[{список значении)}

где Call — ключевое слово;

список значений список значений аргументов (соответствует

списку аргументов в операторе Sub no количеству, порядку следования и типу,

кроме случая когда используется параметр Optional).

Кроме того должно выполняться следующее соответствие между списками

аргументов и значениями:

Аргумент Значение

Переменная | Константа, переменная,

I элемент массива, выражение.

Массив Массив

форма Форма

Элемент управления ; Элемент управления

I

Следующие примеры показывают правильное согласование между списками

аргументов и значении:

Пример 1.

Sub Sum (A As Integer, B As Integer, С As Integer)

'список аргументов состоит из переменных С = А + В • End Sub Sub Form Click ()

Static X(3) As Integer X(1) = 1 X(2) =2

Call Sum(X(l), X(1) + X(2), X(3)) 'список

' -значений включает элементы массива и выражение

Print Х(1), Х(2), Х(3) End Sub

Пример 2.

Sub Sum (A As Integer, В As Integer, С As Integer)

'список аргументов состоит из переменных С—А + В End Sub Sub Forrri_Click ()

Dim X, Z As Integer

X = 5

Call Sum(X, 4, Z) 'список значений включает

' переменные и константу Print X, Z End Sub

Пример 3.

Sub Sum (A ( ) As Integer)

'список аргументов включает массив

А(3) = А(1) + А(2) End Sub

Sub Form_Click () Static X(3) As Integer

X(1) - 1

X(2) =2

Sum X ( ,)'список значений включает массив

Print Х(1), Х(2), Х(3) End Sub

Следует обратить внимание, что в последнем примере обращение к процедуре не

содержит ключевого слова Call и отсутствуют скобки, обрамляющие список

значений.

Для рассмотренного примера списка аргументов с использованием параметра

Optional, обращения могут иметь следующий вид:

Call ReturnTwice(ReturnValue, )

'значение ReturnValue равно О

Call ReturnTwice(ReturnValue, 2)

‘ значение ReturnValue равно 4 Пример программы.

Поместим рассмотренную выше процедуру формирования вектора из сумм элементов

столбцов матрицы в раздел general формы:

Option Explicit

Sub SubMatrVektor (A() As Single, B() As Single, MaxI As Integer,

Max.J As Integer) Dim J, I As Integer For J == 1 To MaxJ A(J) -- 0 For I = 1

To MaxI

A(J) = A(J) + B(I, J) Next I Next J End Sub

Private Sub Form_Ciick()

Static X(1 To 2, 1 To 3) As Single, Y(1 To 3) As Single

X(1, 1) = 1

X(1, 2) = 2

Х(1, 3) = 3

X(2, i) = 4

Х(2, 2} = 5

Х(2, 3) = 6

SubMatrVektor Y(), X(), 2, 3

Print Y(li, Y(2), Y(3) End Sub

Результат выводится на форму, показанную на оис. 3.18.

Рис. 3.1S

3.6.2. Функции

Синтаксически функция определяется

[Public | Private] [Static] Function имя функции [(список аргументов)} [As тип]

[операторы объявления]

[операторы}

[имя функции = выражение]

[Exit Function] [операторы] [имя функции = выражение] End Function

где Public, Static, Private, Function , Exit Function , End Function —

ключевые слова. Function определяет обязательный первый оператор

функции. End Function — обязательный последний оператор функции:

имя функции образуется в соответствии с общими правилами

образования имен и может иметь описатель типа (As тип в конце первой

строки относится к имени функции). Имя функции принимает значение и хотя бы

один оператор

имя функции = выражение

может присутствовать внутри функции и выполняться при выходе из нее. Если

никакое значение не присвоено имени функции, то имя функции принимает

значение по умолчанию: числовая функция принимает значение 0, функция,

объявленная как String, принимает значение пустой строки нулевой длины (“”),

функция, объявленная как Variant принимает значение Empty (значение, которое

принимает имя функции, называют возвращаемым значением функции — возвращаемое

значение).

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

[Optional] [ByVal|ByRef][ParamArray] имя[( )][As тип]

[.[Optional] [By Val | ByRef][ParamArray] имя[( )] [As тип] ] ...

где Optional, ByVal, ByRef, ParamArray и As ключевые слова;

имя — имя переменной, массива (в случае массива используется

имя ( ) без указания границ значения индексов, что

позволяет использовать одну функцию для разного числа элементов массива в

каждом конкретном случае), элемента управления или формы (в последних дйух

случаях тип принимает значения Control и Form).

Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date,

String (только переменной длины). Variant, пользовательский тип или Control и

Form. As тип необходимо применять для каждого аргумента.

Список аргументов определяет связь по данным между вызывающей (функция, из

которой происходит вызов) и вызываемой (функция, которая вызывается)

процедурами или функциями. Локальные данные, определенные внутри функции

(кроме тех, что определены в списке general для форм), не могут

использоваться в других процедурах и.'функциях (например, переменные с

одинаковыми именами, но объявленные в разных функциях, хранятся в разных

ячейках памяти и изменение переменной в одной из функций не ведет к изменению

одноименной переменной и другой функции).

Exit Function вызывает прекращение выполнения функции ц выход из нее в

вызывающую программу.

Функция не может быть определена внутри какой-либо процедуры или функции.

Пример функции вычисления площади прямоугольника по заданным значениям сторон:

Function FunDemo (RLen, Rwid) As Single

'заголовок функции FunDemo с “двумя аргументами- Rlen-длина и Rwid-ширина

“тип имени функции определен как Single Dim Area ' объявление локальной

'переменной Area = RLen * Rwid ' расчет площади MsgBox “Площадь равна” &

Area ' печать

'результата. FunDemo = Area 'имени функции

'присваивается вычисленное значение End Function

Пример функции для вычисления среднего значения элементов одномерного массива:

Function FunSumVecior (A( )} As Single,

MaxI As Integer) As Single

Dim SumVector As Single, I As Integer

Surn Vector = 0

For 1=1 To MaxI ' верхняя граница индекса 'I

определяетсяпередаваемым аргументом процедуры

SumVector =SwnVector + A(I)

Next I

FunSuni Vector = SumVector/MaxI 'имени

'функции присваивается вычисленное значение End Function

Изменяя значения аргументов данную функцию можно использовать для работы с

вектором произвольного размера.

Используемые ключевые слова аналогичны рассмотренным выше для процедур.

Приведем примеры заголовков функций с использованием параметров ParamArray и

Optional:

Function (‘.ilcSur-i (ByVa;: FirstArg As Integer, par^Array OtnerArqri;;^

Function MyFunc.My^tr As String, Optional MyArgI, Opt--^1’”1”-‘1 MyArg2 )

Обращение к функции является операндом выражения (т.е. в отличии от процедуры

для ее вызова не используется специальный оператор), имеет следующий

синтаксис

имя функци11([список значений})

список значении - список значений аргументов (соответствует списку

аргументов в операторе Function по количеству, порядку следования и типу. если

не используется параметр Optional). Кроме того должно выполняться следующее

соответствие между списками аргументов и значениями:

Пример 1.

Function Sum (A As Integer, B As Integer) As I n t e g e r

‘список аргументов состоит из переменных • С - А + В Sum = С Knd Function Sub

Form_Click ; ) italic X(3) As Integer X<1) - 1 X(2) - 2 X(3) = Sum(X(l),

X(1) - X(2))’список значений

‘ включает 'элементы мас,”'ЛЕ^а и выражение Print Х(1) , Х(2), Х(3) End Sub

Пример 2. .

Function Sum (A As Integer/ В As Integer) ftg Integer

'список -аргументов состоит из переменных С = А + В Sum = С End Function

Sub Forrn_Click () Dim X, Z As Integer X = 5 Z = Sum (X, 4)'

список значений включает

' переменную и константу Print X, Z End Sub

  • Пример 3.

Function Sum (A ( ) As Integer) As Integer 'список аргументов включает массив

А(3) = А(1) + А(2)

SumА(3)

End Function

Sub Form_Click ()

Static X(3) As Integer

X(1) = 1

X(2) - 2

X.(3 ) = Sum (X() ,)'список значений 'включает массив

Print Х(1), Х(2) , Х(3)

End Sub

Для рассмотренных примеров заголовков функций с параметрами ParamArray и

Optional обращения к функциям могут иметь следующий вид:

ReturnValue = CalcSum(4, 3 ,2 ,1) первый аргумент функции FirstArg принимает

значение 4, остальные аргументы являются элементами массива и принимают

значения OtherArgs(l) = 3, OtherArgs(2) = 2, последнее значение определяет

размерность массива (1).

RetVal = MyFunc(“Hollo”, 2, “World”) - В этом обращении заданы все три

значения аргумента.

. RetVal = MyFunc (“Test”, , 5) — в этом обращении не задано значение второго

аргумента.

RetVal = MyFunc (МуАгд! :-- 7) - в этом обращении зада-но значение второго

аргумента с использованием его имени.

Пример программы.

Поместим рассмотренную функцию для определения среднего значения элементов

одномерного массива в раздел general (Ьормы и обращение к ней в процедуру

обработки события щелчка мыши по форме (рис. 3.19). После запуска программы и

щелчка мыши по форме распечатывается среднее значение суммы элементов массива

Х (рис. 3.20).

3.6.3. Передача аргументов по ссылке и по значению

Передача значений аргументов при вызове процедуры или функции по ссылке

означает, что передается адрес памяти, по которому хранится значение

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

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

вызывающая процедура пли функция). При этом не выделяется дополнительная

намять для работы с переданным аргументом в вызываемой программе. Изменение

значения аргумента в вызываемой процедуре или в функции означает изменение

значения и в вызывающей процедуре или в функции (используется одна и та же

ячейка или область памяти).

Передача цо ссылке определена по умолчанию. Передача значении аргументов при

вызове процедуры или функции по значению (чтобы определить этот способ

передачи, в списке аргументов процедур и функции для передаваемого таким

образом аргумента используется ключевое слово ByVal) означает. что в

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

памяти, в которую записывается значение передаваемою аргумента.

Изменения значения аргумента в вызываемой процедуре или в функции не ведут к

изменению аргумента в вызывающей процедуре или в функции (вызываемая

процедура или функция использует для аргумента другую ячейку или область

памяти аналогично локальным данным). Это удобно, если модификация данных

необходима только внутри вызываемой процедуры или функции и нет необходимости

передавать измененные данные обратно в вызывающую процедуру или функцию.

Вместе с тем передача по значению (выделение дополнительной памяти) приводит

к неэффективному использованию памяти. В связи с этим, для строк символов и

массивов нецелесообразно использовать передачу по значению.

3.6.4. Использование в качестве аргументов процедур и функции форм и

элементов управления

Список аргументов процедур и функций может включать имена форм и элементов

управления (в качестве описателей типа для них применяются соответственно

Form и Control ). Это позволяет создавать универсальные алгоритмы для работы

с формами и управляющими элементами. Например, для привлечения внимания

пользователя к одной из управляющих кнопок формы можно создать одну

универсальную процедуру, изменяющую шрифт и цвет фона,

Sub Att^ntio!-. ‘:3^;’. As Control;

Btn. i-‘onrl t.^ г.: ^ True

Bin.BackColor = Red

'костанта Red определена в файле CONSTANT.TXT End Sub

аргументом которой является имя кнопки. Обращение к данной процедуре с

указанием в качестве значения имени какой-либо конкретной кнопки приведет к

изменению ее шрифта и цвета (указывается имя кнопки Btn_Right)

Attention Btn_Riqht

Для контроля соответствия передаваемых при обращении типов форм и элементов

управления в Visual Basic есть специальный оператор

If TypeOf имя объекта Is тип объекта Then

где TypeOf и Is — ключевые слова, а последующий синтаксис и действие

совпадают с рассмотренным выше условным оператором.

Чтобы проверить соответствие передаваемого в процедуру объекта, в ее текст

можно включить оператор

Sub Attention (Btn As Control)

If TypeOf Btn Is OptionButton Then

Btn.Fontltaiic = True

Btn.BackColor = Red

End If End Sub

Пример программы.

Создадим процедуру для изменения свойств формы, аргументом которой является

имя формы, и процедуры обработки событий Click для задания исходных свойств

формы и KeyPress, в которой имеется обращение к процедуре Change (рис. 3.21)

При запуске программы появляется исходная форма. Щелчок мыши по форме

изменяет ее размер, положение и выводит начальную часть текста (задается в

процедуре обработки события Click).

. Нажатие клавиши Enter приводит к изменению размера, положения формы и вывод

заключительной части текста (обращение в процедуре обработки события KeyPress к

процедуре Change) (рис. 3.22).

3.7 ФАЙЛОВЫЙ ВВОД-ВЫВОД

Архитектура современных компьютеров предусматривает наличие оперативной и

внешней памяти. В оперативной памяти находятся выполняемая в данный момент

программа и обрабатываемые ею данные. После выполнения программы ее данные в

оперативной памяти не сохраняются, так как используемые ячейки памяти

выделяются для данных другой программы. Технически и программно обусловленные

ограниченность объема

оперативной памяти и ее относительно высокая стоимость не позволяют применять

ее для постоянного хранения больших объемов информации. Для этого

используется внешняя память (магнитные ленты, жесткие и гибкие магнитные

диски, лазерные диски), позволяющие хранить сотни мегабайт (1 Мбайт = 1048576

байт) и гигабайт (1 Гбаит = 1.073.741.824 байт) информации и стоимость

которых относительно невелика.

Хранение больших объемов информации на внешних носителях с учетом того, что

время доступа к данным на внешних носителях на один, два порядка ниже времени

доступа к данным в оперативной памяти, требует их хорошо продуманной

организации. А возможность альтернативного хранения одних и тех же данных на

различных внешних носителях требует использования единых принципов

организации данных.

Таким универсальным понятием является файл (набор данных), который

используется для работы с внешними данными на любом носителе. Под файлом

понимается совокупность данных. Файл состоит из записей. Запись состоит из

логически связанных данных, которые передаются между оперативной и внешней

памятью за одну операцию ввода-вывода (ввод — передача данных из внешней в

оперативную память, вывод - передача данных из оперативной во внешнюю

память).

Например, в качестве файла можно рассматривать и используемую ранее колоду

перфокарт. Одна карта является одной записью (устройство ввода перфокарт

считывает последовательно по одной карте и нельзя считать меньше, чем одну

карту). Запись характеризуется длиной (рассмотренная перфокарта является

записью фиксированной длины в SO байтов и на ней можно было разместить

80 символов). Записи бывают фиксированной или переменной длины.

По способу доступа к записям файлы подразделяются на файлы последовательного

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

записи должны быть пройдены все предыдущие записи, при прямом можно напрямую

перейти к нужной записи. Все внешние устройства позволяют использовать

последовательный доступ к записям файла. Прямой доступ позволяют использовать

только устройства прямого доступа (например, магнитные и оптические диски).

В Visual Basic файлы подразделяются на:

  • последовательные (sequential), записи которых могут быть переменной

    длины;

  • прямого доступа (random access), записи которых могут

    быть только одинаковой длины;

  • двоичные (Ьупагу) файлы с

    произвольной группировкой байтов, что позволяет организовать гибкий доступ

    к данным.

3.7.1. Последовательные файлы

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

конце которой содержится символ <CR>, обозначающий переход к началу

строки (carriage return, ASCII-код равен 13), и <LF>, обозначающий

переход на другую строку (line feed, ASCII-код равен 10). Последовательное

действие этих двух символов обеспечивает переход к новой записи. После

последней записи записывается признак конца файла (end of file), который может

проверяться встроенной функцией EOF (возвращает значение True. если обнаружен

конец файла, и False, в противном случае).

Для получения доступа к файлу для операции ввода-вывода используется оператор

открытия файла, синтаксис которого следующий

Open имя_файла For Output As #номер_фаила

fLen = размер буфера памяти}

где Open, For. Append. Input. Output, As — ключевые слова.

Input — файл открывается для ввода.

Output — файл открывается для вывода.

Append — устанавливает считывающе-записывающее устройство на конец файла

и выводимая информация записывается в файл после существующих записей (при

значении параметра Output выводимая информация записывается с начала файла,

т.е. происходит перезапись файла, если в нем существовали записи).

Имя_файла имя файла (символьная константа или переменная)

или путь. Имя файла в DOS и Windows 3.1 состоит из не более чем восьми

буквенных (латинских) или цифровых символов (первый символ буква), за которым

может следовать расширение, определяющее тип файла (VBPART3.DOC, Project. MAC).

В Windows 95 допускаются длинные имена файлов до 255 символов, включая

специальные символы (в русской версии для записи имени файла можно использовать

русские буквы) Путь определяет местонахождение файла в иерархической системе

каталогов (C:\CONF1G.SYS, C:\WINDOWS\VB).

Номер файла целочисленное выражение, значение которого

должно лежать в диапазоне от 1 до 255 (присваиваемый файлу номер).

Len — определяет размер буфера операций ввода-вывода (по умолчанию 512 Кб).

Примеры:

Open “С:\CONFIC.SYS” For Input As tt5 'открывается

файл с именем CONFIG.SYS в директории С: для ввода

и ему присваивается номер 5

Doc$ = “a:\Utilits\NC.DOC”

присвоение значения константе

Open Doc$ For Input A.s ft 5

'открытие файла NC.DOC на диске А: в директории Utilits для ввода, файлу

присваивается номер 2

Open “Resulc. t:-:t “ For Output As tt7

'открытие файла для вывода.

Если открывается для вывода несуществующий файл. то он создается при

значениях параметров Append и Output. Если для ввода открывается

несуществующий файл, то Visual Basic сообщает об ошибке. Если файл скрывается

для вывода Visual Basic всегда создает новый файл, перезаписывая в него любой

имеющийся на диске файл с тем же именем.

Существование файла перед открытием можно проверить с помощью встроенной

функции Dir$ (возвращает строку с копией имени файла, если указанный файл

существует, либо пустую строку в противном случае).

Пример.

If Dir$(“FilePrim.Txt”) <> “” Then

.Open “FilePrim.Txt” For Input As #12

End If

После завершения операций ввода — вывода файл должен быть закрыт. Для этого

используется оператор

Close #номер_фачла где Close — ключевое слово;

номер_ файла соответствует номеру в операторе Open.

Для ввода информации из последовательного файла используется оператор

Line Input #номер_файла, имя_переменной где Line Input — ключевое слово;

номер_файла — номер файла, совпадающий с номером в операторе Open

(вводится информация из открытого файла);

имя_переменной — имя переменной, которая принимает значение записи

файла, типа String или Variant.

При выполнении оператора считывается одна запись файла и помещается в ячейку

оперативной памяти, адрес которой соответствует имени переменной в операторе

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

Последовательное выполнение операторов ввода обеспечивает последовательное

считывание записей файла.

Встроенная функция EOF (аббревиатура английских слов End Of File - конец

файла) позволяет проверять при чтении файла: достигнут конец файла или нет.

Значением аргумента функции EOF является номер считываемого файла. Функция

возвращает значение True, если достигнут конец файла, и False - в противном

случае.

Пример.

Dim FileYura, Sr.rokaVvoda As String

'объявление символьных переменных

Open FileYura For Input As #5

'открытие файла FileYura для ввода Do While Not EOF(5)'цикл

последовательного чтения

'записей файла пока не достигнут конец Line Input #5, StrokaVvoda'ввод

считанной записи

'в переменную StrokaVvoda LineRead StrokaVvoda 'обращение к

'процедуре обработки строки LineRead 'аргументом которой является переменная

StrokaVvoda Loop

Close #5 'закрытие файла

Для вывода информации в последовательный файл используется оператор

{Print* Write} ”номер_файла,[[8рс(ч) ]

[ выражение}[{,\;}}} где Print, Write — ключевые слова.

Print# — обеспечивает вывод в последовательный файл в формате дисплея

(т.е. аналогично выводу на печать, например, на форме).

выражение - выражение, значение которого записывается в файл.

Если выражения разделяются “;”, то в файл они записываются без пробелов слитно.

Если выражения разделяются “,”, то в файл они записываются в фиксированные

зоны длиной 14 символов (зонный формат).

Если в конце выражения не стоит “;” или “,”, то выведенная в файл строка

дополняется символами <CR>, обозначающими переход к началу строки

(carriage return, ASCII-код равен 13), и <LF>, обозначающими

переход на другую строку (line feed, ASCII-код равен 10). Т.о. каждому значению

соответствует одна запись или одна строка при выводе в формате дисплея.

Spc(n) и ТаЬ(п) определяют соответственно вставку п пробелов

между выводимыми выражениями и табуляцию на п колонок перед списком

выражений.

Для удаления с дискового пространства неиспользуемого файла используется

оператор

Kill имя_файла где Kill — ключевое слово.

В заключение следует отметить, что данные любого типа (Boolean, Data,

Integer, Single, Double, Currency) записываются в файл в символьной форме.

При выводе данные преобразуются к символьной форме, при вводе происходит их

преобразование к первоначальному типу, па что затрачиваются ресурсы

компьютера. Кроме того. представление данных в символьной форме неэффективно.

Например, число 421596 типа Single -занимает в памяти компьютера 4 банта, но

при записи в последовательны” файл - 7 байт: 1 байт па каждый символ.

Для того чтобы считать требуемую запись в последовательном файле необходимо

последовательно пройти все предыдущие записи; чтобы изменить одну запись в

файле, необходимо переписать весь файл заново. От этих недостатков свободны

файлы прямого доступа.

Пример программы.

В первой части процедуры обработки события щелчка мыши по форме в файл

TE5TFILE выводятся строки символов с использованием оператора Print# (вывод в

формате дисплея). Во второй части процедуры записи этого файла читаются и

выводятся в окно вывода в том виде, как они записаны в файле.

Текст процедуры:

Пример программы.

Программа осуществляет преобразование текстового файла последовательною

доступа распаковкой его строк таким образом, чтобы каждая цепочка символов

“*п”, где п — однозначное целое число (число пробелов), заменялась указанным

числом пробелов.

Ввод исходных данных и управление работой программы осуществляется на форме

на рис. 3.24.

На форме располагаются:

  • командная кнопка “Ввод” (имя — Command 1), щелчок мыши по которой

    активизирует окно ввода (имя — Textl). Вводимая информация записывается в

    файл последовательного доступа:

  • командная кнопка “Вывод”

    (имя — Commands), щелчок мыши по которой обеспечивает вывод записей файла

    в многострочном текстовом окне (имя Text2):

  • командная кнопка

    “Преобразование” (имя — Command2), щелчок мыши по которой обеспечивает

    чтение записей файла, их преобразование в соответствии с заданием и запись

    новых записей в другой файл:

  • командная кнопка “Вывод” (имя —

    Command4). щелчок мыши по которой обеспечивает вывод записей повою файла в

    многострочном текстовом окне (имя Textl);

  • щелчок мыши по кнопке

    “Конец” прекращает выполнение программы.

Тексты процедур обработки событий:

Private Sub Coriurtandl_Click ()

Text3.SetFocus Open “Filel” For Output As #5

Text3.Text = “” End Sub

Private Sub Command2_Click() Dim Filedata, Filedatal As String Dim NPoz,

NProbel As Integer Close #5

Open “Filel” For Input As tt5 Open “File2” For Out-put As #6 Do While Not EOF(5)

Страницы: 1, 2, 3, 4, 5, 6, 7, 8


© 2010 Собрание рефератов