Область видимости переменных
Переменные, с которыми нам приходилось иметь дело до сих пор, объявлялись словом Dim (сокращение от Dimension, то есть «размерность»). Оно объявнную в процедуре. При этом обращаться к такой переменной можно лишь из той же процедуры. Другими словами, вы не сможете определить или задать ее значение из другой процедуры, находящейся в той же или другой форме или в стандартном модуле.
Такие переменные называются локальными (то есть видимыми только в данной процедуре). Чтобы переменная была видна на уровне модуля, ее необходимо объявить несколько иначе. Во-первых, объявление должно находиться в секции (General) (Declarations) формы или стандартного модуля. Во-вторых, вместо Dim используется ключевое слово Private (хотя Dim также поддерживается для обеспечения совместимости с более ранними версиями Visual Basic). Объявленная таким способом переменная доступна на уровне модуля, и к ней можно обращаться из любой процедуры данного модуля — ее область видимости шире, чем у локальных переменных (рис. 7.6).
Projectl.Vbp
Рис. 7.6. Область видимости переменных
Кроме того, переменная может быть доступна на уровне всего приложения. Такие переменные часто называются открытыми, или глобалъными. Они объявляются в секции (General)(Declarations),но вместо Dim или Private используется ключе-вое слово Global. Обычно в таких случаях в проект включается стандартный модуль с расширением .BAS, а все глобальные переменные помещаются в его секцию объявлений.
Чтобы лучше понять, чем отличаются области видимости, рассмотрим следующий пример:
1. Создайте новый проект.
2. В окне Project Wizard выберите значок Standard EXE.
3. Добавьте в проект модуль — для этого следует щелкнуть правой кнопкой мыши в окне проекта и выбрать из контекстного меню команду Add > Module.
4. В диалоговом окне Add Module выберите значок Module. Созданный модуль Module1 открывается в окне программы.
5. В окне программы добавьте следующий фрагмент:
Option Explicit
Global UserID As String
Global ACL As Integer
6. Добавьте в модуль Module1 следующую процедуру:
Public Sub InitApp()
UserID = "Джо"
ACL = 255
End Sub
Прежде чем идти дальше, давайте повнимательнее рассмотрим два последних шага. Объявление переменных UserID и ACL c ключевым словом Global позволяет обратиться к ним из любой процедуры или модуля данного приложения. Поскольку функция InitApp находится внутри модуля и сопровождается ключевым словом Public, она является глобальной и может быть вызвана из любой процедуры приложения. В ней происходит инициализация приложения — переменной UserID присваивается значение "Джо", а переменной ACL — 255. Теперь давайте создадим форму для регистрации пользователя:
1. Дважды щелкните на форме Form1 в окне проекта, чтобы активизировать ее в конструкторе форм.
2. В окне свойств задайте свойству Name формы Form1 значение frmLogon, а свойству Caption — значение Регистрация пользователя.
3. Создайте на форме надпись. Задайте свойству Name значение lblUserID, а свойству Caption — Имя пользователя:.
4. Создайте под lblUserID еще одну надпись, задайте свойству Name значение
lblPassword, а свойству Caption — значение Пароль:.
5. Добавьте текстовое поле справа от первой надписи и задайте его свойству Name значение txtUserID.
6. Добавьте текстовое поле справа от второй надписи. В окне свойств задайте его свойству Name значение txtPassword, а свойству PasswordChar — символ «звездочка» (*).
7. Разместите кнопку в середине нижней части формы. Задайте ее свойству Name значение cmdLogon, а свойству Caption — значение &Регистрация.
После того как на форме появятся все перечисленные элементы, она должна выглядеть примерно так, как показано на рис. 7.7.
Рис. 7.7. Форма для регистрации пользователей
8. Откройте окно программы двойным щелчком на форме Form1.
9. Расположите курсор слева от строки Option Explicit секции (General)(Decla-rations) формы Form1.
10. Дважды нажмите на клавишу Enter, чтобы вставить перед Option Explicit две пустые строки.
11. Введите следующую строку над Орtion Explicit:
Private Password As String
12. Откройте процедуру события Load формы и добавьте следующий фрагмент:
Private Sub Form_Load()
InitApp
txtUderID.Text = UserID
txtPassword.Text = ""
End Sub
13. В окне программы откройте процедуру события Click кнопки cmdLogon и добавьте в нее следующий фрагмент:
Private Sub cmdLogon_Click()
Dim msg As String
UsertID = txtUser.Text
Password = txtPassword.Text
msg = "Имя пользователя: " & UserID & Chr$(13)
msg = msg & "Пароль: " & Password & Chr$(13)
msg = msg & "ACL: " & Str$(ACL)
End Sub
14. Запустите программу командой Run > Start.
Обратите внимание на то, что в поле Имя пользователя содержится имя «Джо». Это значение было взято из глобальной строковой переменной с именем UserID. Переменная не объявляется в процедуре события Form_Load, она объявлена глобальной в модуле Module1.
Переменная для хранения пароля также заслуживает внимания. Она была объявлена в секции (General)(Declarations) формы. Обращаться к ней могут только функции данной формы. Это важно, потому что остальная часть программы не имеет права изменять пароль пользователя. Говорят, что переменная пароля доступна лишь в модуле формы.
Введите любой текст в поле Пароль: и нажмите кнопку Регистрация. Процедура события Click использует переменные модуля и глобальные переменные для отображения информации о пользователе.
Ключевое слово Static
Помимо переменных уровня процедуры (Dim) существует еще один способ объявления переменных — с ключевым словом Static:
Static X As Integer
Это означает, что переменная будет сохранять последнее присвоенное ей значение даже после завершения процедуры. Статические переменные удобны для хранения текущего значения накапливаемой суммы. Если пропустить ключевое слово Static (и воспользоваться вместо него Dim), то при каждом запуске процедуры переменная будет обнуляться вместе с другими числовыми переменными. Рассмотрим следующий пример, в котором показана статическая переменная в действии. Посетите кафетерий Sybex и закажите в нем все, что вам угодно. Кофе подается бесплатно, но предупреждаю — туалета здесь нет! Если вы испытываете жажду или нуждаетесь в хорошей дозе кофейного допинга, поступите так:
1. Создайте новый проект типа Standard EXE.
2. Задайте свойству Caption формы Form1 значение Кафетерий Sybex.
3. Создайте надпись в середине верхней части формы. В окне свойств задайте ее свойству Name значение lblQuantity, а свойству Caption — значение Заказано кофе;0.
4. Создайте кнопку под надписью lblQuantity. Задайте ее свойству Name значение cmdAdd, а свойству Caption — значение &Принесите еще!.
5. Дважды щелкните на кнопке cmdAdd в конструкторе форм, чтобы открыть окно программы.
6. Вставьте следующий код в процедуру события Click кнопки cmdAdd:
Private Sub cmdAdd_Click()
Static count As Integer
count = count + 1
lblQuantity = "Заказан кофе:" & Str$(count)
End Sub
7. Запустите программу и нажмите кнопку, чтобы заказать любое количество чашек кофе.
Переменная count в процедуре события Click объявлена статической (Static), благодаря чему ее значение сохраняется между событиями. В результате переменная помнит, сколько чашек кофе вы успели заказать.
ПОДСКАЗКАЧтобы все переменные процедуры превратились в статические, можно оставить для них ключевое слово Dim и задать ключевое слово Static перед именем процедуры, например Private Static Sub cmdAdd_Click().
Массивы
Массивы можно считать разновидностью переменных, однако в них хранится сразу несколько значений. Например, электронная таблица представляет собой массив ячеек. Массив можно использовать для хранения записей небольшой базы данных или красного, зеленого и синего (RGB) компонентов растрового изображения. Хотя массивы используются несколько реже переменных, они играют важную роль в разработке программ. В следующем примере объявляется массив чисел целого типа, а затем его элементам присваиваются значения:
Static X(2) As Integer
X(0) = 7
X(1) = 99
X(2) = 123
Для обработки массивов часто применяется цикл For...Next, в котором в качестве
счетчика используется целочисленная переменная (рис. 7.8):
Dim Y As Integer
For Y = 0 To 2
Print X(Y)
Next Y
Рис. 7.8. Использование цикла For...Next
Данный фрагмент выводит на текущей форме значение каждого элемента целого массива X (числа 0,1 и 2 используются в качестве ссылок на элементы). Чтобы созданный массив был доступен на уровне модуля, объявите его с ключевым словом Dim в секции (General)(Declarations) модуля. Если же массив должен быть доступен на уровне приложения, объявите его с ключевым словом Public. Следующий пример показывает, как работать с массивами:
1. Создайте проект типа Standard EXE.
2. Удалите из нового проекта форму Form1. Для этого следует щелкнуть на строке Forml правой кнопкой мыши в окне проекта и выбрать команду Remove Forml из контекстного меню.
3. Добавьте в проект новый модуль — щелкните правой кнопкой мыши в окне проекта и выберите команду Add > Module из контекстного меню.
4. В диалоговом окне Add Module выберите значок ModuLe.
5. В окне программы модуля Module1 добавьте следующую процедуру:
Sub Main()
Dim x(7) As Integer
Dim i As Integer
Dim txt As String
' Заполнить массив битовыми значениями
For i = 0 To 7
x(i) = 2 ^ i
Next
' Вывести массив
For i = 0 To 7
txt = "Элемент массива " & Str$(i) & " = "
txt = txt & x(i)
Next
End Sub
6. Запустите программу и проследите за окном отладки.
В первой части фрагмента объявляются переменные, необходимые для работы программы. Массив x должен содержать 8 элементов (с индексами от 0 до 7). Переменная i используется в циклах For...Next, а в строке txt выполняется форматирование результата.
Первый цикл For...Next заполняет массив. В соответствии с формулой
x(i) = 2 ^ i
каждому элементу присваивается значение очередной степени двойки. Не беспокойтесь о математической стороне происходящего — здесь вычисления использованы лишь для примера.
Последний цикл For...Next форматирует переменную txt, а команда Debug. Print выводит ее в окне отладки.
Динамические массивы
Нередко размер массива (то есть количество хранящихся в нем элементов) не может быть определен заранее. В таком случае следует объявить пустой массив. Массив, который в начале своего жизненного цикла не содержит ни одного элемента, называется динамическим. Он объявляется почти так же, как и обычный массив, за исключением того, что в процедуре можно использовать как ключевое слово Dim, так и Static:
Dim Y() As Integer
Было бы расточительно создавать массив заведомо большего размера, чем вам требуется. Чтобы выйти из положения, следует создать динамический массив, не содержащий ни одного элемента (см. выше), и затем добавлять в него элементы по мере надобности. Эта методика особенно полезна при работе с большим количеством элементов.
Затем в массив необходимо добавить элементы, в которых будут храниться значения. Для этого используется оператор ReDim, который может встречаться только в процедурах:
ReDim Y(5)
Созданным элементам следует присвоить значения. Позднее количество элементов массива снова можно изменить:
ReDim Y(7)
После выполнения этого оператора все значения, хранящиеся в массиве, теряются. Чтобы сохранить их, пользуйтесь ключевым словом Preserve:
ReDim Preserve Y(7)
ВНИМАНИЕПри работе с массивами надо представлять себе, что именно вы делаете. При небрежном обращении массивы поглощают довольно большой объем памяти, так что тщательно планируйте свои действия.
Константы
Константы обладают некоторым сходством с переменными — они тоже объявляются и им присваиваются значения. Тем не менее в отличии от переменных, значения констант остаются неизменными на протяжении всего жизненного цикла приложения. Использование констант обычно упрощает программирование — намного проще понять и отладить программу с переменной vbModal, чем следить за судьбой какой-нибудь безымянной переменной со значением 1. Одновременно с объявлением константы ей присваивается значение. Для этого используется ключевое слово Const:
Const conPi = 3.142
Приведенный ниже фрагмент демонстрирует возможности практического применения констант:
Const conPi = 3.142
Dim Radius As Integer
Dim Area As Double
Option Explicit
Private Sub cmdPrintArea_Click()
Radius = 3
Area .= conPi * (Radius ^ 2)
Print Area
End Sub
Данный фрагмент вычисляет площадь круга, используя константу с именем conPi (префикс con необязателен, хотя и желателен). Вычисленная площадь круга выводится на текущей форме (рис. 7.10).
Рис. 7.10. Результат вычисления площади круга
Константы можно объявлять как в процедурах, так и в секциях объявлений модулей. Чтобы создать константу, доступную на уровне приложения, укажите при ее объявлении ключевое слово Global, — например Global Const Pi = 3.142.
Правильный выбор переменных для поставленной задачи является вопросом первостепенной важности. Он не только экономит время при отладке, но и помогает написать более компактную программу и приучает к дисциплине программирования. Нельзя построить дом, пользуясь одной отверткой, — существует великое множество инструментов, и каждый из них решает свою задачу. To же самое относится и к переменным. Старайтесь правильно подбирать средства для решения конкретной задачи.
Что нового мы узнали?
В этом уроке мы научились:
Выбирать тип переменных для конкретных задач.
Пользоваться массивами для хранения информации.
Определять константы и работать с ними в программах.
Урок 8
Запись и чтение данных
Работа с ASCII-файлами
Последовательный доступ
Произвольный доступ
Двоичный доступ
Элементы для работы с базами данных
Анатомия базы данных
Создание баз данных в Visual Data Manager
Использование ActiveX Data Objects (ADO)
Компьютеры предназначены для обработки информации, поэтому приложениям необходимы удобные и надежные способы записи и чтения данных. В игровых автоматах таблица рекордов хранится в памяти и пропадает после выключения питания. К счастью, на персональных компьютерах существуют различные информационные носители — гибкие и жесткие диски, магнитные ленты и оптические диски. Все эти устройства обеспечивают долговременное хранение информации и ее последующее извлечение.
В этом уроке вы освоите несколько методик записи и чтения данных с использованием ASCII-файлов, элементов и специальных программ для работы с базами данных, а также научитесь пользоваться ими в своих программах.
Работа с ASCII-файлами
В Visual Basic вам придется работать с двумя типами файлов, хранящихся на диске, — базами данных и ASCII-файлами. Вероятно, файлы баз данных (описанные далее в этой главе) применяются несколько чаще, но вы должны уметь работать и в ASCII-файлами. Они содержат данные произвольного типа и могут форматироваться в виде списка величин, разделенных запятыми или другими символами (рис. 8.1). Информационные объекты часто выводятся в отдельных строках, но вообще говоря, файл может иметь произвольную структуру. Вы должны уметь обращаться с такими файлами, поскольку это позволяет работать практически с любыми данными. Например, вы сможете извлечь описание вашей системы из INI-файла.
Введенная пользователем информация часто сохраняется на будущее. Например, в файле могут храниться текст или сведения о предыдущих достижениях игрока, загружаемые при следующем запуске игровой программы. Visual Basic предоставляет несколько возможностей для чтения сохраненных данных. Более трудный (и в некоторых ситуациях неизбежный) вариант заключается в жестком кодировании чтения/записи данных. В этом случае вам придется создавать собственный файл — последовательный, с произвольным доступом, или двоичный (см. в последующих разделах). Кроме того, в программу придется включить код, предназначенный только для работы с данным файлом. Такой подход ограничивает использование кода конкретным приложением, но иногда позволяет наиболее успешно справиться с поставленной задачей.
Работа с файлом любого типа начинается с его открытия. В Visual Basic для этого используется оператор Open, который открывает файл и готовит его к чтению или записи. Минимальный набор параметров для оператора Open составляет имя файла, режим доступа и файловый номер. Синтаксис оператора Open выглядит так:
Open filename For mode As fileno
Параметр filename определяет имя открываемого файла, а параметр mode — режим доступа. Он может иметь значения Append (Дополнение), Input (Ввод), Output (Вывод), Binary (Двоичный) и Random (Произвольный). Наконец, параметр fileno
Рис. 8.1. ASCII-файл с разделителями
определяет так называемый файловый номер — целое число, по которому идентифицируется открываемый файл. Файловые номера используются при выполнении файловых операций в программе. Пример приведен в следующем разделе. При попытке открыть несуществующий файл в режимах Append, Binary, Output или Random Visual Basic создает пустой файл. Кроме того, если параметр mode не указан, файл открывается в режиме произвольного доступа. Ни один из режимов не имеет явных преимуществ перед остальными. У каждого есть свои достоинства, а выбор зависит от формата данных файла. Например, ASCII-файл с разделителями не следует открывать в двоичном режиме, поскольку он позволяет читать данные только по одному байту, и вам придется писать код для «сборки» строки из отдельных байтов. Для таких случаев лучше подходит режим Input. После завершения работы с файлом его следует закрыть оператором Close с одним параметром — файловым номером:
Close fileno
Подробности приведены в нескольких ближайших разделах, а пока давайте рассмотрим различные режимы доступа.
Последовательный доступ
При сохранении или чтении данных в Visual Basic нередко используются последовательные файлы. Последовательный файл состоит из текстовых строк ASCII-формата (рис. 8.2).
Рис. 8.2. Образец последовательного файла
Для записи данных в последовательный файл необходимо открыть его в режиме Output или Append. Если файл не существует, Visual Basic автоматически создает его. Если же файл существует, то при его открытии в режиме Output существующие данные стираются, а в режиме Append новые записи добавляются в конец файла. Обычно файлы открываются для дополнения, но иногда они используются для временного хранения данных. В таких случаях вполне допускается уничтожение содержимого файла перед каждым применением. Чтобы прочитать данные из последовательного файла, следует открыть его в режиме Input. Независимо от того, в каком режиме открывается файл — Input, Output или Append, — для операций с ним используется файловый номер (см. далее). Не забывайте закрывать ненужные файлы, вызывая оператор Close с соответствующим файловым номером. Для записи в файл можно воспользоваться оператором Print # (или Write #), а для чтения— Line Input #(a также опеpaтором lnput # или функцией Input).
Ниже приведен фрагмент программы, который создает в каталоге C:\Data файл и записывает в него две строки:
Dim FileNo As Integer
FileNo = FreeFile
Open "C:\data\test.txt" For Append As FileNo
Print #FileNo, "Джон"
Print #FileNo, "Доу"
Close FileNo
Функция FreeFile возвращает свободный файловый номер, который будет использоваться в операторах Open, Print # и Close. Результаты выполнения предыдущего фрагмента можно просмотреть в программах WordPad или Notepad (рис. 8.3). Чтобы файл записывался заново, а не дополнялся (другими словами, чтобы стереть содержимое файла и внести в него новые данные), следует заменить Output ключевым словом Append.
Рис. 8.3. Просмотр результатов
При загрузке сохраненных данных можно прочитать каждую строку в массив. На всякий случай напомню: массивом называется список однородных величин, на которые можно ссылаться по имени и индексу. Более подробная информация о массивах приведена в уроке 7, «Типы данных». В следующем примере в массив загружается содержимое файла C:\Data\test.txt:
Dim FileNo As Integer
Dim GetValues() As String
Dim Counter As Integer
‘Инициализировать счетчик
Counter = 0
‘Получить уникальный файловый номер
FileNo = FreeFile
' Открыть файл
Open "C:\data\test.txt" For Input As FileNo
Do Until EOF(FileNo)
Counter = Counter + 1
ReDim Preserve GetValues(Counter)
Line Input #FileNo, GetValues(Counter)
Loop
Close FileNo
Функция EOF проверяет, не был ли достигнут при чтении конец файла. Конец файла помечается специальным ASCII-символом, который не отображается на экране и добавляется в файл при его создании или дополнении. Когда чтение данных будет завершено, можно перебрать величины из массива GetValues и присвоить их значения элементам или вывести на форме:
Dim J As Integer
For J = 0 To UBound(GetValues)
Print GetValues(J)
Next J
Чтобы улучшить работу этого фрагмента, включите строку Option Base 1 в секцию (General)(Declarations) вашей формы. В результате выполнения этой команды нумерация индексов массива начинается с 1, а не с принятого по умолчанию 0. Следовательно, цикл For...Next должен начинаться со значения 1, а не 0. Функция UBound возвращает максимальный, а функция LBound — минимальный индекс массива. Совместное использование этих функций позволяет определить фактический размер массива. Следующий фрагмент перебирает все элементы одномерного массива:
Dim J As Integer
For J = LBound(arrayname) To UBound(arrayname)
' Ваша программа
Next J
Произвольный доступ
Произвольный доступ также применяется для извлечения данных из ASCII-файлов, однако по сравнению с последовательным доступом он отличается большей гибкостью. Произвольный доступ позволяет в любой момент перейти к любой позиции файла и прочитать требуемые данные. В результате происходящее больше похоже на операции с базой данных, чем на работу с последовательным файлом. Кроме того, произвольный доступ ускоряет обращение к данным, так как при нем задается конкретная позиция файлового указателя внутри файла. Чтобы открыть файл для произвольного доступа, задайте параметр Random:
Open "C:\data\test.txt" For Random As FileNo Len=10
Перед тем как задавать параметр Len, необходимо определить длину каждой строки данных в символах. Строка данных называется записью (по аналогии с записями баз данных). В данном разделе будет использоваться именно этот термин. Предположим, каждая запись содержит информацию о некотором человеке — фамилию, имя и краткое описание. Все эти параметры можно объединить в одну строку и записать в файл, но это затруднит дальнейшее чтение данных и их преобразование в осмысленный формат. Например, если воспользоваться следующим фрагментом:
Private Sub SaveFile()
Dim FileNo As Integer
Dim RecNo As Integer
Dim FName As Integer
Dim LName As Integer
Dim Lineout As Integer
FName = "Джейн"
LName = "Доу"
Desc = "Супруга Джона Доу"
LineOut = LName & FName & Desc
FileNo = FreeFile
RecNo = 1
Open "C:\test.txt" For Random As FileNo
Put #FileNo, RecNo, LineOut
Close FileNo
End Sub
то прочитанная запись будет выглядеть так:
ДоуДжейнСупруга Джона Доу
Некрасиво! К тому же было бы нерационально писать код для извлечения имен из этой строки, поскольку у разных людей имена имеют разную длину. Вместо этого в подобной ситуации следует объявить свой собственный тип переменной с помощью ключевых слов Type...End Type.
Оператор Type предназначен для определения нестандартных типов переменных. Он особенно полезен в ситуациях наподобие той, что описана выше. Однако перед тем, как использовать оператор Type, необходимо убедиться, что в проекте присутствует хотя бы один программный модуль. Visual Basic не позволяет объявлять типы переменных в модулях форм. Следовательно, новый тип переменных должен быть объявлен в секции (General)(Declarations) программного модуля. Добавьте следующий фрагмент:
Type UserInfoRecord
LName As String * 15
FName As String * 15
Desc As String * 50
End Type
и приведите процедуру формы к следующему виду:
Private Sub SaveFile()
Dim FileNo As Integer
Dim RecNo As Integer
Dim usr As UserInfoRecord
usr.FName = "Джейн"
usr.LName = "Доу"
usr.Desc = "Супруга Джона Доу"
FileNo = FreeFile
RecNo = 1
Open "C:\test.txt" For Random As FileNo Len = 80
Put #FileNo, RecNo, usr
Close FileNo
End Sub
Сейчас я кратко поясню смысл оператора Type. Чтобы создать тип переменной, следует вставить объявления нескольких переменных внутрь конструкции Type...End Type. Тип, созданный в нашем примере, делится на три самостоятельные строковые переменные — LName, FName и Desc. Обратите внимание на то, что при объявлении переменной указывается ее длина. LName и FName определяются как строковые переменные с максимальной длиной 15 символов, а длина Desc может достигать 50 символов. Если сложить вместе все длины строк-компонентов, получается 80 символов. Поскольку в файл будет записываться именно эта переменная, суммарная длина совпадает с размером записи.
Чтобы воспользоваться переменной типа User.InfoRecord, необходимо объявить ее с ключевым словом Dim, как и любую другую переменную. Тем самым вы сообщаете Visual Basic, к какому типу она относится. Затем можно обращаться к любой из внутренних переменных, указав имя составной переменной, за ним — оператор «точка» и имя внутренней переменной. Внутренней переменной можно присвоить нужное значение или же прочитать ее оператором Get#. Если запустить предыдущий фрагмент, запись сохраняется в файле. На рис. 8.4 показано, как выглядит содержимое этого файла в программе Notepad.
Рис. 8.4. Запись в текстовом файле
Произвольный доступ удобен для работы со списками данных, которые поставляются в виде ASCII-файлов. Тем не менее многие файлы не укладываются в этот формат. Они могут иметь заголовки различной длины или другие отклонения в структуре файла. Возможно, реляционная база данных окажется более удобной. Эта тема рассматривается после двоичного режима доступа.
Двоичный доступ
Двоичный режим доступа обладает самой большой гибкостью при работе с файлами. Чтение данных в нем производится командой Get#, а запись — командой Put# (по аналогии с произвольным доступом). Двоичный доступ отличается от произвольного тем, что вы не можете случайным образом перемещаться по файлу и читать данные в любом месте. В двоичном режиме чтение данных происходит последовательно и в виде блоков. Количество байт, прочитанных из файла, равно размеру строки (в байтах), в которую должны быть занесены прочитанные данные. Например, следующий фрагмент читает из файла 10 байт:
Temp = String(10, " ")
Get #FileNo, , Temp
Обратите внимание на отсутствие параметра RecNo — причина заключается в том, что двоичные файлы читаются последовательно. Visual Basic запоминает текущую позицию файла, так что в дальнейшем вам не придется следить за ней. Давайте воспользуемся только что полученными знаниями и напишем программу для шифрования файлов. Подробности ее работы будут описаны по ходу дела.