В начало
Статьи
Библиотека
Разное

Вот здесь - новый сайт, заходите немедленно!

kift - Коллекция Интересных Фактов и Теорий

А тут можно поболтать и побухтеть, милости просим:

kift - неизданное

Самоучитель Visual Basic

11. «Сборка» проекта
12.  Создание формы для вывода справки
13. Добавление окон-заметок. Наборы и циклы
14. Циклы VB
15. Основы отладки программ. Пользовательская процедура

10. Обработка ошибок.
Условные операторы.

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

В конце прошлого подраздела мы столкнулись с ситуацией, когда при некорректном действии пользователя программа вывела окно-предупреждение и остановилась. Согласитесь, если оставить программе возможность так себя вести, ею никто не станет пользоваться. Один из способов справиться с ситуацией – т.н. обработчик ошибок.

  • VB прослеживает появление ошибок при выполнении программы. С обычным поведением языка Вы только что столкнулись – программа останавливается и появляется окно-предупреждение. При проектировании программы всегда следует предвидеть возможные ошибки. Справиться с этим можно несколькими способами.

Существует конструкция языка On Error (При Ошибке). Она бывает следующих видов:

  • On Error Resume Next (При Ошибке Продолжить Дальше) – при появлении ошибки она игнорируется и выполнение продолжается. Вы должны очень хорошо предвидеть виды ситуаций, могущих вызвать ошибку, если упустите какую-то ситуацию, возможен крах системы. Но в большинстве случаев этот способ подходит.

  • On Error Goto <метка> (При Ошибке ПерейтиНа <метку>) – при ошибке программа переносит выполнение на <метку>, после которой следует конструкция, обрабатывающая ошибку.

  • On Error Goto 0 (При Ошибке ПерейтиНа Ноль) – отмена обработки ошибок.

  • Все конструкции On Error действуют в пределах процедуры, в которой находятся (о процедурах Вы узнаете далее).

Другой способ выявления ошибок – проверка т.н. системного объекта Err (от англ. Err[or] – Ошибка). Этот объект имеет свойства Number (Номер) и Description (Описание), учитывая которые вы можете так или иначе влиять на ситуацию. Этот метод сложнее, но гибче. Впоследствии мы познакомимся с конструкциями VB, которые позволят Вам пользоваться объектом Err.

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

В начало обработчика события cmdUpdate_Click внесите строку:

On Error Resume Next

Код примет вид:

Private Sub cmdUpdate_Click()
On Error Resume Next
dtPhoneBook.Recordset.Update
End Sub
  • Запустите программу.

  • Добавьте запись кнопкой «Добавить».

  • Внесите значения в текстовые поля.

  • Щелкните кнопку «Обновить».

Как видите, без перехода на другую строку содержимое сетки обновилось (и содержимое БД тоже).

Остался обработчик события cmdDelete_Click. Здесь ситуация немного сложнее.

В обработчик cmdDelete_Click добавьте строку:

dtPhoneBook.Recordset.Delete

Но при удалении записи указатель объекта Recordset не сможет переместиться самостоятельно и будет указывать на уже удаленную, несуществующую запись, это неверно.

  • Следует явно переместить указатель:

dtPhoneBook.Recordset.MoveNext

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

VB позволяет производить проверку условия с помощью слов If(Если), Then (То), Else (Иначе).

  • Типичный вид проверки условия:

If <условие> Then
	<действия, если условие выполнено>
Else
	<действие, если условие не выполнено>
End If

Возможны разновидности этой конструкции:

  • Так можно делать, если <действие> короткое и поместится в строку;

If <условие> Then <действие>

  • А так делается, если проверяется сразу несколько условий.

If <условие> Then
	<действия, если условие выполнено>
ElseIf <другое условие> Then
	<действие, если другое условие выполнено>
.
.
.
Else
	<действие, если ни одно из условий не выполнено>
End If
  • В случае, если проверяется, приняло ли какое-то свойство значение из списка возможных, применяется конструкция:

Select Case <свойство>
	Case <значение1>
		<действия при значении1>
	Case <значение2>
		<действия при значении2>
	Case <значение3>
		<действия при значении3>
.
.
.
	CaseElse
		<действия при других значениях>
End Select

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

В обработчик события cmdDelete_Click внесите строки:

If dtPhoneBook.Recordset.EOF Then

End If

Это – заготовка конструкции проверки условия.

  • Буквально это значит:

Если выполняется условие dtPhoneBook.Recordset.EOF, То

  • Конструкция обязательно завершается признаком конца проверки условия – строкой

End If

Свойство EOF (КонецНабора) может принимать два значения: True (Истина) и False (Ложь). Если достигается конец набора (условие выполняется), то свойство принимает значение True, в других случаях его значение равно False.

  • Значения True(Правда) и False (Ложь) – т.н. логические или булевские величины. Они применяются в логических операциях при проверке условий. VB имеет несколько слов-операторов для обработки логических условий.

  • Вышеуказанные строки можно написать так:

If dtPhoneBook.Recordset.EOF = True Then

.

.

.

End If

Это – равнозначные способы написания. Первый способ проще, но второй – нагляднее, выбирайте сами.

Теперь определите действие, которое будет происходить в ответ на выход указателя за пределы набора (а свойство КонецНабора – указывает не на последнюю запись, а на участок после последней записи).

  • Логично будет перенести указатель на последнюю запись:

dtPhoneBook.Recordset.MoveLast

  • Код примет вид:

Private Sub cmdDelete_Click()
dtPhoneBook.Recordset.Delete
If dtPhoneBook.Recordset.EOF Then
		dtPhoneBook.Recordset.MoveLast
End If
End Sub

Внесите в код соответствующие строки.

Все? Нет, мы упустили случай удаления последней и единственной записи в наборе, т.е., когда набор остается пуст. Можно проверять количество записей в наборе, и, если осталась последняя запись, запрещать удаление, но мы сделаем проще – проигнорируем ошибку.

  • Добавьте второй строкой обработчика

On Error Resume Next

  • Запустите программу.

Все работает!

Хитрость:

Напишите так:

Private Sub cmdDelete_Click()
On Error Resume Next
With dtPhoneBook.Recordset
.Delete
If .EOF Then
.MoveLast
End If
End With
End Sub

Этот код действует совершенно так же, как и вышеописанный.

Слово With (С, Совместно) заставляет VB считать, что все действия производятся с объектом, чье имя стоит за With (здесь - dtPhoneBook.Recordset), и Вы можете сразу «дописывать» фразу, начиная ее с точки.

  • Конструкция With должна быть внутри процедуры (т.е., на другие процедуры она не распространяется), и обязательно должна завершаться строкой End With.

  • Кроме того, такое написание кода, как правило, работает быстрее.

Применяйте конструкцию With только тогда, когда обращение к одному и тому же объекту встречается не менее 3-5 раз подряд.

Проверьте, как работает Ваша программа.

Не забудьте сохранить результаты.

Вопросы

  1. Какие способы обработки ошибок Вам известны?

  2. Какие условные операторы Вам известны? В каких случаях они применяются?

Задания

  1. Обязательно добавьте комментарии к созданной Вами форме!

  2. Законспектируйте раздел.

  3. Так же. как и форму frmPhoneBook, создайте вторую форму для работы с базой данных – форму frmDiary. Внешний вид этой формы и составляющие ее компоненты совершенно аналогичны уже созданной «Телефонной книжке», другими будут имена элментов управления и надписи на метках. Естественно, форма будет подключена к другой таблице БД:

   
Элемент управления Свойства
dtDiary

DataBaseName = C:\VB Begin\Organizer.mdb

RecordSource = Diary

dbgrDiary

DataSource = dtDiary

txtNote

DataSource = dtDiary

DataField = Note

txtDate

DataSource = dtDiary

DataField = Dates

Соответственно следует изменить код формы, поменяв имена объектов там, где они отличаются от имен формы frmPhoneBook.

В остальном эти формы одинаковы.

Сохраните и эту форму в рабочем каталоге проекта.

Hosted by uCoz