
Id As Integer
Name As String * 20
End Type
Dim MyRecord As Record, RecordNumber ' Объявляет переменную.
' Открывает файл произвольного доступа.
Open "TESTFILE" For Random Shared As #1 Len = Len(MyRecord)
RecordNumber = 4 ' Определяет номер записи.
Lock #1, RecordNumber ' Блокирует запись.
Get #1, RecordNumber, MyRecord ' Читает запись.
MyRecord.ID = 234 ' Изменяет запись.
MyRecord.Name = "Иван Петров"
Put #1, RecordNumber, MyRecord ' Записывает измененную запись.
Unlock #1, RecordNumber ' Разблокирует текущую запись.
Close #1 ' Закрывает файл.
Шаг 34 - Инструкция LSet
Выравнивает строку по левому краю строковой переменной или копирует переменную одного определяемого пользователем тип в переменную другого типа, также определенного пользователем.
LSet переменная = строка
LSet имяПеременной1 = имяПеременной2
Параметры переменная : Обязательный. Имя строковой переменной. Строка : Обязательный. Строковое выражение, которое следует выровнять по левому краю строки переменная. имяПеременной1 : Обязательный. Имя переменной типа, определенного пользователем, являющейся адресатом копирования. имяПеременной2 : Обязательный. Имя переменной типа, определенного пользователем, являющейся источником копирования.
Замечания Все оставшиеся символы в строке переменная функция LSet заменяет на пробелы. Если строка длиннее, чем переменная, функция LSet копирует в переменную столько начальных символов строки, сколько в ней поместится. Не рекомендуется использовать функцию LSet для копирования переменной одного типа, определенного пользователем, в переменную другого типа, также определенного пользователем. Копирование данных одного типа из одной переменной просто копируются в область, отведенную для размещения переменной другого типа, может привести к непредсказуемым результатам. При копировании переменной одного определяемого пользователем типа в другой двоичные данные из одной переменной просто копируются в область, отведенную для размещения другой переменной, без учета внутренней структуры этих переменных.
Пример В данном примере инструкция LSet используется для выравнивания строки по левому краю строковой переменной. Несмотря на то, что функцию LSet также можно использовать для копирования переменной одного типа, определенного пользователем, в переменную другого (совместимого) типа, также определенного пользователем, делать это не рекомендуется, поскольку это может привести к потере переносимости на другую платформу.
Dim MyString
MyString = "0123456789" ' Инициализирует строку.
Lset MyString = "<-Left" ' MyString содержит "<-Left ".
Шаг 35 - Инструкция Mid
Заменяет указанное число символов в переменной типа Variant (String) символами из другой строки.
Mid(переменная, начало[, длина]) = строка
Параметры переменная : Обязательный. Имя строковой переменной, подлежащей изменению. Начало : Обязательный. Значение типа Variant (Long). Позиция символа в переменной, с которого начинается замена. Длина : Необязательный. Значение типа Variant (Long). Число символов, подлежащих замене. Если этот аргумент опущен, используется вся строка. Строка : Обязательный. Строковое выражение, предназначенное для замены части строки переменная.
Замечания Число замененных символов не может превышать число символов в переменной. Эквивалентной инструкцией обработки строк по байтам является инструкция MidB. В этом случае аргумент начало указывает в строке переменная позицию байта, с которого начинается замена, а длина число байт, подлежащих замене.
Пример В данном примере инструкция Mid используется для замены указанного числа символов строковой переменной символами из другой строки.
Dim MyString
MyString = "В четверг утром" ' Инициализирует строку.
Mid(MyString, 3, 7) = "пятницу" ' MyString = "В пятницу утром".
Mid(MyString, 3) = "субботу" ' MyString = "В субботу утром".
Mid(MyString, 3) = "субботу вечером" ' MyString = "В субботу вечер". Mid(MyString, 3, 7) = "воскресенье" ' MyString = "В воскресенье вечер".
Шаг 36 - Инструкция MkDir
Создает новый каталог или папку.
MkDir путь
Параметры путь : Обязательный аргумент путь является строковым выражением, определяющим создаваемый каталог или папку. Аргумент путь может содержать имя диска. Если диск не указан, инструкция MkDir создает новый каталог или папку на текущем диске.
Пример В данном примере инструкция MkDir используется для создания каталога или папки. Если диск не указан, новый каталог (или папка) будет размещен на текущем диске.
MkDir "MYDIR" ' Создает новый каталог или папку.
Шаг 37 - Инструкция Name
Изменяет имя файла, каталога или папки.
Name староеИмя As новоеИмя
Параметры :
СтароеИмя : Обязательный. Строковое выражение, указывающее имя и положение существующего файла; может содержать имя каталога или папки и диска. НовоеИмя : Обязательный. Строковое выражение, указывающее новое имя и положение файла; может содержать имя каталога или папки и диска. Файл с таким именем не должен существовать.
Замечания Оба аргумента, новоеИмя и староеИмя, должны указывать на один и тот же диск. Если путь, указанный с помощью аргумента новоеИмя существует и отличен от указанного с помощью аргумента староеИмя, инструкция Name переместит файл в новый каталог или папку и переименует его (если требуется). Если пути, указанные с помощью аргументов новоеИмя и староеИмя, разные, а имена файлов совпадают, инструкция Name переместит файл в новый каталог или папку без изменения его имени. С помощью инструкции Name, можно переместить файл из одного каталога (или папки) в другой, однако нельзя переместить каталог или папку. При попытке переименовать открытый файл с помощью инструкции Name возникает ошибка. Прежде чем приступить к изменению имени файла, необходимо его закрыть. В аргументах инструкции Name не допускается использование подстановочных знаков для нескольких символов (*) и одного символа (?).
Пример В данном примере инструкция Name используется для изменения имени файла. Предполагается, что указанные каталоги или папки уже существуют.
Dim OldName, NewName
OldName = "OLDFILE": NewName = "NEWFILE"
' Указывает имена файлов.
Name OldName As NewName ' Переименовывает файл.
' В Microsoft Windows:
OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE"
Name OldName As NewName ' Перемещает и переименовывает файл.
' На Macintosh:
OldName = "HD:MY FOLDER:OLDFILE": NewName = "HD:YOUR FOLDER:NEWFILE"
Name OldName As NewName ' Перемещает и переименовывает файл.
Шаг 38 - Инструкция On Error
Активизирует подпрограмму обработки ошибок и указывает положение подпрограммы в процедуре; используется также для отключения подпрограммы обработки ошибок.
On Error GoTo строка - Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть любая метка строки или номер строки. Если возвращается ошибка выполнения, управление передается на указанную строку и запускается обработчик ошибок. Аргумент строка должен определять строку в той же процедуре, в которой находится инструкция On Error; в противном случае возникает ошибка компиляции.
On Error Resume Next - Указывает, что возникновение ошибки выполнения приводит к передаче управления на инструкцию, непосредственно следующую за инструкцией, при выполнении которой возникла ошибка. Рекомендуется при доступе к объектам использовать эту форму инструкции, а не On Error GoTo.
On Error GoTo 0 - Отключает любой активизированный обработчик ошибок в текущей процедуре.
Замечания
Если не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается.
"Включенным" обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; "активным" обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.
Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.
Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err.Number содержится в свойстве Err.Description.
Конструкция On Error Resume Next задает продолжение выполнения с инструкции, непосредственно следующей за инструкцией, которая привела к ошибке выполнения, или с инструкции, непосредственно следующей за вызывающей инструкцией в процедуре, содержащей конструкцию On Error Resume Next. Это позволяет продолжить исполнение программы несмотря на ошибку выполнения. Это позволяет также встроить подпрограмму обработки ошибок в процедуру, а не передавать управление в другую часть процедуры. Конструкция On Error Resume Next становится неактивной при вызове новой процедуры, поэтому для внутренней обработки ошибок необходимо выполнять инструкцию On Error Resume Next в каждой вызываемой процедуре.
При обработке ошибок, возникающих при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next, а не конструкцию On Error GoTo. Проверка объекта Err после каждого взаимодействия с другим объектом позволяет устранить неопределенность в том, при доступе к какому объекту возникла ошибка. Это позволяет всегда точно знать, какой объект поместил значение кода ошибки в свойство Err.Number, а также в каком объекте возникла ошибка (эта информация содержится в свойстве Err.Source).
Конструкция On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.
Для того, чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ОбработкаОшибок
. . .
Exit Sub
ОбработкаОшибок:
. . .
Resume Next
End Sub
В этом примере программа обработки ошибок помещена между инструкциями Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. Программу обработки ошибок можно разместить в любом месте процедуры.
Ошибки, которые не были перехвачены, возвращаются в управляющее приложение, если объект был запущен как исполняемый файл. В среде разработчика такие ошибки возвращаются в управляющее приложение только при указании соответствующих параметров. За описанием необходимых значений этих параметров и способов их задания следует обращаться к документации главного приложения. Там же следует проверить, позволяет ли главное приложение создавать классы.
Err.Number = vbObjectError + 1052
Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.
Пример
В начале этой программы инструкция On Error GoTo определяет положение подпрограммы обработки ошибок в процедуре. В данном примере попытка удалить открытый файл приводит к возникновению ошибки с кодом 55. Ошибка обрабатывается в подпрограмме, после чего управление возвращается инструкции, которая привела к возникновению ошибки. Инструкция On Error GoTo 0 отключает перехват ошибок. После этого инструкция On Error Resume Next задает отложенный перехват ошибок, что позволяет точно определить, в каком контексте возникла ошибка, генерируемая в следующей инструкции. Следует отметить, что после обработки ошибки вызывается метод Err.Clear для сброса значений свойств объекта Err.
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' Включаем программу обработки ошибок.
Open "TESTFILE" For Output As #1 ' Открываем файл.
Kill "TESTFILE" ' Попытка удалить открытый файл.
On Error Goto 0 ' Отключаем перехват ошибок.
On Error Resume Next ' Откладываем перехват ошибок.
ObjectRef = GetObject("MyWord.Basic") ' Запускаем ' несуществующий объект, а затем проверяем
' ошибку механизма управления
' программируемыми объектами.
If Err.Number = 440 Or Err.Number = 432 Then
' Выводим сообщение для пользователя и очищаем объект Err.
Msg = "Ошибка при попытке открыть программируемый объект!"
MsgBox Msg, , "Проверка отложенной ошибки"
Err.Clear ' Очищаем поля объекта Err.
End If
Exit Sub ' Выходим из процедуры, чтобы
' не попасть в обработчик.
ErrorHandler: ' Обработчик ошибок.
Select Case Err.Number ' Определяем код ошибки.
Case 55 ' "Ошибка "Файл уже открыт".
Close #1 ' Закрываем открытый файл.
Case Else
' Здесь размещаются инструкции для обработки других ошибок...
End Select
Resume ' Возобновляем выполнение
' со строки, вызвавшей ошибку.
End Sub
Шаг 39 - Инструкции On...GoSub, On...GoTo
Задают переход к одной из нескольких указанных строк, в зависимости от значения выражения.
On выражение GoSub списокНазначений
On выражение GoTo списокНазначений
Параметры:
Выражение : Обязательный. Любое числовое выражение, которое имеет целое значение от 0 до 255 включительно. Если выражение является нецелым числовым выражением, оно округляется до его оценки. СписокНазначений : Обязательный. Список номеров строк или меток строк, разделяемых запятыми.
Замечания Значение аргумента выражение определяет, к какой строке из спискаНазначений выполняется переход. Если значение выражения меньше 1 или превышает число элементов списка, происходит одно из следующих событий:
Равняется 0 - Управление передается инструкции, следующей за On...GoSub или On...GoTo.
Превышает число элементов списка - Управление передается инструкции, следующей за On...GoSub или On...GoTo.
Отрицательное - Возникает ошибка. Больше 255 - Возникает ошибка.
В одном списке допускается совместное использование номеров и меток строк. Не существует практического ограничения на число меток и номеров строк, используемых с инструкциями On...GoSub... и On...GoTo. Однако при использовании большего число меток или номеров, чем может уместиться на одной строке, необходимо применять символ продолжения строки для распространения логической строки на несколько физических строк. Инструкция Select Case обеспечивает более структурированный и гибкий способ выполнения множественных ветвлений.
Пример В данном примере инструкции On...GoSub и On...GoTo используются для перехода к подпрограммам и строкам с указанными метками, соответственно.
Sub OnGosubGotoDemo()
Dim Number, MyString
Number = 2 ' Инициализирует переменную.
' Переход к Sub2.
On Number GoSub Sub1, Sub2 ' Управление возвращается сюда ' после выполнения On...GoSub.
On Number GoTo Line1, Line2 ' Переход к метке Line2.
' Управление не возвращается сюда после выполнения On...GoTo.
Exit Sub
Sub1:
MyString = "Sub1" : Return
Sub2:
MyString = "Sub2" : Return
Line1:
MyString = "Метка Line1"
Line2:
MyString = "Метка Line2"
End Sub
Шаг 40 - Инструкция Open
Разрешает выполнение с файлом операций ввода/вывода.
Open путь For режим [Access доступ] [блокировка] As [#]номерФайла [Len=длина]
Параметры путь : Обязательный. Строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска. Режим : Обязательный. Ключевое слово, указывающее режим файла: Append, Binary, Input, Output или Random. По умолчанию, файл открывается для доступа в режиме Random. Доступ : Необязательный. Ключевое слово, указывающее операции, разрешенные с открытым файлом: Read, Write или Read Write. Блокировка : Необязательный. Ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: Shared, Lock Read, Lock Write и Lock Read Write. НомерФайла : Обязательный. Допустимый номер файла в интервале от 1 до 511 включительно. Для определения следующего свободного номера файла следует использовать функцию FreeFile. Длина : Необязательный. Число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.
Замечания Чтобы получить возможность выполнить любую операцию ввода/вывода, файл необходимо открыть. Инструкция Open резервирует буфер ввода/вывода для файла и определяет режим использования этого буфера. Если аргумент путь описывает несуществующий файл, такой файл будет создан при открытии в режиме Append, Binary, Output или Random. Если файл уже открыт другим процессом и указанный режим доступа не разрешен, инструкция Open не будет выполнена и возникнет ошибка. Если аргумент режим имеет значение Binary, предложение Len игнорируется. В режимах Binary, Input и Random можно еще раз открыть уже открытый файл под другим номером, не закрывая его. В режиме Append и Output необходимо закрыть файл, чтобы получить возможность открыть его еще раз под другим номером.
Пример В данном примере показаны различные способы использования инструкции Open, чтобы разрешить выполнение операций ввода/вывода с файлом. Следующие инструкции открывают файл TESTFILE для последовательного чтения.
Open "TESTFILE" For Input As #1
' Закрывает файл перед повторным открытием в другом режиме.
Close #1
Следующие инструкции открывают файл в режиме Binary только для записи.
Open "TESTFILE" For Binary Access Write As #1
' Закрывает файл перед повторным открытием в другом режиме.
Close #1
Следующие инструкции открывают файл в режиме Random. Файл содержит записи определенного пользователем типа Record.
Type Record ' Тип, определенный пользователем.