Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Option Explicit






Private Sub Command1_Click()
Open " aaa.txt" For Input As #1
Close #1
End Sub

Поскольку такого файла никто не создавал, то при запуске программы и нажатии кнопки Command1 возникнет ошибка 53, о чем нам любезно сообщит Windows: " Run-time error '53': Файл не найден". Программа аварийно завершится.
Итак, что же нам может предложить VB для предотвращения фатальных ошибок.

Операторы ON ERROR и RESUME (Resume Next).

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

Private Sub Command1_Click()
On Error Resume Next
Open " aaa.txt" For Input As #1
Close #1
Form1.Print " Процедура кое-как завершена"
Form1.Print " с помощью On Error Resume Next"
Form1.Print " файл не считан, работать не с чем"

End Sub

Текст в операторах Form1.Print написан условно, так как ясно, что он будет выводится независимо от того, есть ошибка или нет. Т.е на самом деле пользователь никакой реальной информации об ошибке не получит и поправить ничего не сможет. Иное дело, если мы к нашему On Error попробуем пристроить оператор безусловного перехода GoTo метка. На самом деле он унаследован от старого Бейсика и использовать его нужно крайне осторожно. Этот оператор отсылает (в нашем случае, если возникла ошибка) к строке, помеченной меткой, но только внутри текущей процедуры. Положим следующую кнопку Command2 (ее назание GoTo метка) и в ней напишем процедуру

Private Sub Command2_Click()
Dim Msg As String
On Error GoTo ErrorMark
Open " aaa.txt" For Input As #1
Close #1
Exit Sub
ErrorMark:
Msg = " Ой, наверно файл куда-то запропал, попробуйте восстановить!? "
MsgBox Msg,, " Караул, нет данных! "
End Sub

Таким образом, при возникновении ошибки оператор GoTo возвращает нас в программу к строке, помеченной меткой ErrorMark. Под ней пишутся операторы, которые выполняются для реакции программы (или юзера) на ошибку. Обратите внимание, чтобы они не выполнялись в случае, когда ошибки нет, перед меткой поставлен оператор Exit Sub, который прерывает выполнение процедуры, не дожидаясь оператора End Sub. В качестве реакции на ошибку у нас выводится MessageBox с советом для юзера. Обратите снова Ваше драгоценное внимание на то, что в сообщении я употребил слово " наверное". Реально при открытии файла могут возникать разные ошибки и я лишь только предполагаю, что у нас ошибка 53.
Как я говорил выше, в сложных и больших процедурах, чтобы не отлавливать ошибки в других операторах оператор GoTo метка. надо выключить. Для этого, после сомнительного оператора, могущего вызвать ошибку, надо вставить строку
On Error GoTo 0
Тогда обработчик ошибок прекратит свою работу и ошибки в последующих операторах отслеживаться не будут.
Если в подпрограмме обработки ошибок имеется возможность устранить причину ее возникновения, то надо вернуться на тот же оператор и снова его выполнить, уже без ошибки. Для этого подпрограмму обработки ошибок заканчивают оператором Resume. Если же надо перейти к другой строке, помеченной меткой, то программу обработки ошибок надо закончить оператором Resume метка. Ну а теперь перейдем к самому интересному - анализу ошибок.

Объект Err.

Вот как раз с помощью этого объекта мы можем проанализировать, какая ошибка произошла, т.е. по сути, получить ее номер, и в зависимости от ситуации программно решить вопрос об ее устранении или наоборот, заставить юзера производить какие-либо судоржные действия.
Основным свойством объекта Err является свойство .Number, которое и возвращает нам номер ошибки. Настолько основным, что .Number можно не писать. Синтаксис будет такой:
Переменная=Err.Number или Переменная=Err
Это свойство для нас главное. Кроме того (для сведения) имеются еще такие свойства:
.Sourse - имя текущего проекта VB
. Description - cтрока, соответствующая строке, возвращаемой функцией Error для кода ошибки, указанного в свойстве Number, если такая строка существует
.HelpFile - полное имя (включая диск и путь) файла справки Visual Basic.
. HelpContext - контекстный идентификатор файла справки Visual Basic, соответствующий ошибке с кодом, указанным в свойстве Number.
. LastDLLError - содержит системный код ошибки для последнего вызова DLL (только для 32-разрядных Microsoft Windows)

Положим на форму Text1 со свойством Multiline - True, кнопку Command3 (название - Прочитать файл), а также для того, чтоб нам было удобно создавать, убивать файл, положим еще три кнопки Command4, Command5 и Command6, называющиеся соответственно " Создать aaa.txt", " Создать пустой aaa.txt" и " Убить aaa.txt". В процедурах этих трех кнопок напишем:
код для создания файла путем открытия и записи туда слов " не пустой" в Command4

Private Sub Command4_Click()
'создать aaa.txt
On Error Resume Next
Kill (App.Path & " \aaa.txt")
Open App.Path & " \aaa.txt" For Output As #1

Print #1, " не пустой"
Close #1
Text1.Text = " Создан не пустой файл aaa.txt"
End Sub

в Command5 создадим пустой файл, т.е. файл не содержащий ни одного символа

Private Sub Command5_Click()
'создать пустой aaa.txt
On Error Resume Next
Kill (App.Path & " \aaa.txt")
Open App.Path & " \aaa.txt" For Output As #1

Close #1
Text1.Text = " Создан пустой файл aaa.txt"
End Sub

и в Command6 - программу для уничтожения файла

Private Sub Command6_Click()
'убить aaa.txt
On Error Resume Next
Kill (App.Path & " \aaa.txt")
Text1.Text = " Убит файл aaa.txt"
End Sub

Обратите внимание, что перед созданием файла, я убиваю старый. Так как старый файл может на тот момент не существовать (в этом случае возникнет ошибка), я использую On Error Resume Next.
Теперь создадим коротенькую процедуру загрузки формы для проверки в самом начале, существует ли файл aaa.txt

Private Sub Form_Load()
Text1.Text = " "
If Dir(App.Path & " \aaa.txt") = " " Then Text1.Text = " Файла aaa.txt не существует"

End Sub

А вот теперь в кнопке Command3 напишем полноразмерный обработчик ошибок.

Private Sub Command3_Click()
'объявляем переменную для считывания данных из файла
Dim Stroka As String
'использование объекта Err при обработке ошибок
On Error GoTo ErrorMark
ForOpen:
Open App.Path & " \aaa.txt" For Input As #1

Line Input #1, Stroka
Text1.Text = Text1.Text & " Файл успешно открыт, содержание файла: " & Stroka & vbCrLf
Close #1

Exit Sub
ErrorMark:
Close #1

'выводим возможные данные об ошибке
Text1.Text = " Возникла ошибка # " & Err.Number & vbCrLf
Text1.Text = Text1.Text & Err.Description & vbCrLf
Text1.Text = Text1.Text & " В " & Err.Source & vbCrLf
Text1.Text = Text1.Text & " Полный путь хелпа " & Err.HelpFile & vbCrLf
Text1.Text = Text1.Text & " Идентификатор файла спраки VB " & Err.HelpContext & vbCrLf
Text1.Text = Text1.Text & " DLL " & Err.LastDllError & vbCrLf
'Ecли файла нет, то создем его

If Err = 53 Then
Open App.Path & " \aaa.txt" For Output As #1
Print #1, " "
Close #1
Text1.Text = Text1.Text & " Создан новый файл aaa.txt" & vbCrLf
'возвращаемся на исходную позицию

Resume ForOpen
'если файл пустой дописываем в него пробел
ElseIf Err = 62 Then
Open App.Path & " \aaa.txt" For Append As #1
Print #1, " "
Close #1
Text1.Text = Text1.Text & " Ошибка файла aaa.txt исправлена " & vbCrLf
'возвращаемся на исходную позицию

Resume ForOpen
Else
Text1.Text = Text1.Text & " Не знаю, что делать с ошибкой, файл не открыт "

End If
End Sub

Теперь, если мы убъем файл кнопкой " Убить aaa.txt" и нажмем кнопку " Прочитать файл", то в Text1 выведется вся доступная информация об ошибке, создастся новый файл и процедура начнет выполнятся по-новой уже с существующим файлом. Аналогичная ситуация возникает при создании пустого файла. При чтении такого файла возникает ошибка 62 - чтение после конца файла. Мы также получаем информацию об ошибке, дописываем в файл пробел и по Resume вновь запускаем процедуру. Если возникает ошибка с номером, который мы не знаем, то просто выводим об этом сообщения в Text1.

Замечу, что с операторами Open и Close надо обращаться аккуратно. Все файлы должны своевременно открываться и закрываться. Если путаешься с работой с файлами, посмотри Главу 7. Скачать исходник можешь вверху страницы.

Резюме:
Таким образом, обработка ошибки включает в себя:
- Обнаружение ошибки On Error.
- Переход на подпрограмму обработки GoTo (или, на крайняк, на следующий оператор с помощью Resume Next).
- Определение ошибки Err.Number и в зависимости от этого выполнение каких-то действий.
- Возврат Resume после устранения ошибки на оператор, вызвавший ошибку.

Для очистки совести скажу еще про функцию Error. Она по номеру ошибки выводит пояснение - что это за ошибка. Синтаксис:
Строковая переменная=Error(номер ошибки)
Если хотите, положите на форму последнюю кнопку Command7 и для вывода пояснений к ошибкам, например с 52 по 62 напишите такой код и посмотрите, что получится.

Private Sub Command7_Click()
Dim ErrorNumber As Long
Text1.Text = " "
For ErrorNumber = 52 To 64
Text1.Text = Text1.Text & Error(ErrorNumber) & vbCrLf
Next ErrorNumber

End Sub

Совершенно ничего сложного. Ну-с, с этим все.

Что такое ActiveX?

Мой дорогой друг. Когда ты устанавливал на жесткий диск Visual Basic 6.0, то в твой компьютер скачалось много всякого добра, и в том числе некоторые файлы средств управления ActiveX. Эти файлы лежат в c: \Windows\System или c: \Windows\System32 и имеют расширение. ocx. Большинство этих файлов представляют собой отдельные средства ActiveX, но например, тот, что мы будем рассматривать сегодня (Microsoft Windows Common Controls 6.0) включает в себя аж девять средств управления ActiveX. Некоторые средства ActiveX перечислены на странице " Элементы ActiveX". Вот сейчас мы о некоторых и поговорим.

Начнем с самых нужных и используемых. Одним из таких средств является индикатор хода выполнения - Progress Bar. Если ты достаточно наблюдателен, то наверняка заметил, что при выполнении длительных процессов (копирование файлов, загрузка программ и т.п.) Windows выводит на экран окошко, где синенькая полосочка (индикатор хода выполнения процесса), постепенно увеличиваясь в длине, показывает, какой объем процесса выполнен, и вообще скорость процесса. Индикатор хода выполнения позволяет юзеру не нервничать и утешаться тем, что процесс худо-бедно идет, что он успеет раза два покурить и что компьютер не завис.

Элемент ActiveX: Индикатор ходы выполнения ProgressBar.

Чтобы приступить к использованию Progress Bar, его надо сперва добавить в панель инструментов нашего нового exe-проекта (по-скольку это средство управления A ctiveX храниться в файле mscomctl.ocx). Сделать это - раз плюнуть. Для этого надо создать exe-проект, затем в меню Проект надо щелкнуть по строке Компонеты (Рис.22)

Рисунок 22.
Затем, в открывшемся окне списка средств управления найди строку Microsoft Windows Common Controls 6.0, щелкни в этой строке по полю флажка, поставив галочку и нажми кнопку OK на окне (Рис.23).

Рисунок 23.
У тебя в панели инструментов появилось сразу несколько объектов. И в том числе ProgressBar (Рис.24). Аналогично добавляются и другие средства ActiveX из других файлов.

Рисунок 24.
Теперь ты можешь перетащить его на форму и начать с ним работать. Он будет называться ProgressBar1. Основными свойствами, которыми мы будем пользоваться являются:
.Min - минимальное числовое значение, с которого шкала начнет работать
.Max - максимальное числовое значение, на котором шкала дойдет до конца.
.Value - текущее числовое значение шкалы
кроме того можно использовать
.Scrolling - меняет прерывистую шкалу (0-ccScrollingStandard) на непрерывную (1-ccScrillingSmooth)
.Orientation - установка в вертикальное (если приспичило) или горизонтальное положение
Кроме того, понятно, что имеются всякие стандартные свойства (типа высота-длина, видимый-невидимый и т.п), о которых и говорить-то нечего.

Вообще использовать ProgressBar имеет смысл только в циклах (любых). Ты задаешь начальное и конечное значение, а значение ProgressBar.Value меняется именно в цикле. Собственно именно оно и заставляет шкалу изменяться. Использование этого объекта рассмотри на примере программы Generator, которая иммитирует игрушки-гадалки. Знаешь такие китайские игрушки: загадаешь желание, крутанешь шарик, а он потом остановится и лампочка зажжется у слова типа " Никогда" или " Скоро". Так вот, у нас у аналогичных слов (они заданы в окне свойств, а не в коде) будет останавливаться шкала ProgressBar со свойством .Scrolling - 1-ccScrillingSmooth (неперывная).
Объявим две переменные: первая для хранения сгенерированного случайного числа, вторая - просто для цикла.

Dim MyValue As Long
Dim x As Long

Положим на форму командную кнопку Command1 и в ней напишем процедурку






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.