Шупрута В.В. - Delphi 2005 - Учимся программировать (1080891), страница 13
Текст из файла (страница 13)
В этой секции перечисляются исключения, обработку которых берет на себя программа.Примеры наиболее часто возникающих исключений, а также вызывающихих причин приведены в табл. 2.10.Таблица 2.10 тТиповые исключенияТип исключенияПричина возникновенияFormatExceptionОшибка преобразования. Возникает при выполнении преобразования,если преобразуемая величина не может быть приведена к требуемомувиду. Наиболее часты случаи при переводе чисел в строки и обратноОшибка переполнения.
Возникает в результате выполнения операциипри выходе за границы допустимого диапазона значения. Также возникаетв случае операции деления, если делитель равен нулюОшибка открытия файла (файл не найден). Возникает при выполнениифайловых операций в том случае, если не удается найти необходимыйфайл на носителеOverf lowExceptionFilenotFoundExceptionВ разработанной нами программе возможно возникновение исключенияFormatException (вспомните окно с сообщением об ошибке - рис.
2.23).Измененный текст программы, который учитывает возникновение подобнойошибки, приведен в листинге 2.4.Листинг 2.4 т Пример обработки исключенияprocedure TWinForml.Buttonl_Click(sender: System.Object;e:System.EventArgs);var A,B,C:single;D:real;XI,X2:real;begin// Ввод исходных данных.tryA:=System.Convert.ToSingle(TextBoxl.Text);B:=System.Convert.ToSingle(TextBox2.Text);С:=System.Convert.ToSingle(TextBox3.Text);excepton e:FormatException dobeginif (TextBoxl.Text='')or(TextBox2.Text='')or(TextBox3.Text='')thenMessageBox.Show('Необходимо ввести все коэффициенты.','Ошибка при вводе исходных данных!',MessageBoxButtons.OK,MessageBoxIcon.Information)Создаем первый проект для Microsoft .IUET FrameworkelseMessageBox.Show('При задании коэффициентов используйтечисла. ' ,'Ошибка при вводе исходных данных!',MessageBoxButtons.OK,MessageBoxIcon.Information);exit;end ;end;// Вычислениедискриминанта.D:=B*B-4*A*C;if D<0 then// Если дискриминантотрицателен,то выводим сообщение ,// о том, что уравнение не имеет корней.beginLabel5.Text:='Уравнение не имеет действительных корней';end// Если дискриминантбольше или рарен 0, то// вычисляем корниуравнения.elsebeginXl:=(-B-sqrt(D))/(2*A);X2:=(-B+sqrt(D))/(2*A);// Выводим рассчитанныезначениякорней.Label5.Text:='XI = '+Х1.ToString+' X2 = '+X2.ToString;Теперь при неправильном вводе данных пользователю будет выводитьсядиалоговое окно с сообщением об ошибке.
Окно с сообщением выводится спомощью функции MessageBox. Show. В общем случае инструкция, обеспечивающая вывод подобного окна, выглядит следующим образом:MessageBox.Show(<Сообщение>,<3аголовок>,<Кнопки>,<Иконка>);Параметр <Кнопки> задает перечень отображаемых в выводимом окнекнопок.
Перечень кнопок, которые возможно отобразить в данном окне,приведен в табл. 2.11.Таблица 2.11 т Константы, определяющие кнопки в окне сообщенияКонстанта, определяющая типКНОПКИВыводимые в окне сообщения кнопкиMessageBoxButtons.OkMes sageBoxBut tons.OkCancelOKOK, ОтменаГЛАВА 2 • Создаем первые проекты в Borland Delphi 2005Таблица 2.11 • Константы, определяющие кнопки в окне сообщения (окончание)Константа, определяющая тип кнопкиДа, НетMessageBoxB'uttons.YesNoMessageBoxButtons.YesNoCancelВыводимые в окне сообщения кнопки'Да, Нет, ОтменаMessageBoxButtons.AbortRetrylgnoreПрервать, Повторить, ПропуститьMessageBoxButtons.RetryCancelПовторить, ОтменаПараметр-иконка задает тип выводимого значка.
Всего возможно отображение четырех типов иконок, задающих общий тип выводимого окна:>• информационное окно - MessageBoxIcon.Information;>- вопросительное окно - MessageBoxIcon. Question;>• окно предупреждения - MessageBoxIcon .Warning;>• окно с сообщением об ошибке - MessageBoxIcon. E r r o r .Определить, каким образом завершился вывод окна (то есть какая кнопкабыла нажата пользователем), можно, воспользовавшись данными из табл.
2.12,в которой приведены данные о возвращаемых значениях функцииMessageBox.Show.Таблица 2.12 т Значения функции MessageBox. ShowЗначение функцииКнопка, с помощью которойбыл завершен диалогSystem.Windows.Forms.DialogResult.OkокSystem.Windows.Forms.DialogResult.YesДаSystem .Windows. Forms .DialogResult. NoНетSystern.Windows.Forms.DialogResult. CancelОтменаSystem.Windows.Forms.DialogResult. AbortПрерватьSystem.Windows.Forms.DialogResult.
RetryПовторитьПропуститьSystem.Windows.Forms.DialogResult. IgnoreОбработка таких ошибок очень полезна. Она говорит о качестве написанияпрограммы, то есть программист подумал о том, что пользователь можетошибиться. Однако еще лучшей стратегией будет сделать так, чтобы упользователя вообще не было возможности совершить ошибку. Как выпомните, возможная ошибка в нашей программе - это ввод исходных данныхнеправильного формата.
Можно контролировать процесс ввода значенийкоэффициентов в соответствующие поля.Создаем первый проект для Microsoft .MET FrameworkНапомню, что у нас три поля ввода -TextBoxl, TextBox2 HTextBox3. Ониработают совершенно одинаково - их задача дать возможность пользователюввести значения коэффициентов квадратного уравнения, которые являютсячислами. При этом мы помним, что разделителем целой и дробной частейвыступает запятая.Для контроля ввода значений коэффициентов создайте обработчиксобытия KeyPress и назначьте его для обработки события всех трехкомпонентов. Обработчик нажатия клавиш, контролирующий ввод исходныхданных, приведен в листинге 2.5.Листинг 2.5 • Контроль ввода данных. procedure TWinForm.Checklnput(sender: System.Object;e: System.Windows.Forms.KeyPressEventArgs);begin// Контроль вводимых символов.i f n o t ( e .
K e y C h a r i n [ # 8 , • , •', ' 0 ' . . • 9 ' ] )thene.Handled := true;end;Кратко поясню код. При возникновении события нажатия клавиши вобработчик передается символ, который должен быть добавлен к ужевведенным. Передается он в свойстве параметра обработчика событияе . KeyChar. Соответственно, нам надо проверить, входит ли этот символ вдиапазон допустимых символов для ввода. Напомню, что допустимымисимволами являются цифры от 0 до 9 и запятая, являющаяся разделителем целойи дробной частей. Если вы внимательно посмотрите на диапазон,представленный в условии в листинге, то увидите, что в самом начале стоитстранная конструкция #8.
Эта запись обозначает символ с кодом 8, то естьклавишу Backspace. Служебное слово n o t перед оператором сравнения i nговорит о том, что секция then оператора i f будет выполняться только в томслучае, если результат сравнения будет неверным, то есть введенный символ неявляется разрешенным. В этом случае нам надо запретить ввод этого символа.Для того чтобы в данном случае отменить добавление введенного символа,мы присваиваем свойству Handled переданного в обработчик событиязначение t r u e , которое говорит, что событие уже обработано. В этом случаевыполнение обработки события прерывается и не доходит до компонента, вкотором и происходит добавление нового символа к уже введенным. Такимобразом, мы решили задачу контроля ввода.ГЛАВА 2 7 Создаем первые проекты в Borland Delphi 2005Дополнительные возможностипо выявлению ошибок в тексте программыПеред тем как окончательно настроить нашу программу, сделаем небольшоеотступление.
Зачастую случается так, что выявить ошибку временивыполнения достаточно сложно. В нашем случае это было просто - после вводанеправильных данных возникала соответствующая ошибка. Но бываютситуации, когда причина возникновения ошибки непонятна. В этом случае мыможем воспользоваться дополнительными возможностями среды разработкипо выявлению ошибок в исходном коде. Далее я коротко остановлюсь наосновных способах выявления ошибок (средствах отладки программы).Итак, основные способы выявления ошибок:V использование контрольных точек останова;>- просмотр списка текущих значений переменных (Watches list).Точки останова (Breakpoints) используются в случае, когда необходимовыявить место, где происходит ошибка. Введение таких точек позволяетостанавливать процесс выполнения программы и выполнять ее пошагово, отточки к точке.Для того чтобы добавить точку останова, достаточно щелкнуть по номерустроки программы.
В' результате будет добавлена точка останова, котораяпомечается красным кружком (рис. 2.24).220221222end;end;// Вычисление22422522 6227228229230231232233if D<0 then// Если дискриминант отрицателен, то выводим сообщение// о том, что уравнение не имеет корнейbeginЬе|эе15.Text :•'Уравнение не имеет действительных корней 1 ;end// Если дискриминант больше или равен 0, то// Вычисляем корни уравненияelsebegin2362?-7238239// Выводим рассчитанные значения корнейLabels.Text:-1XI " '+Xl.To5tring+' X2 - '+Х2.ToSccirig;end;хискрихинантаend;...:............ aРис.
2.24 т Добавление точек останова•. . .:Создаем первый проект для Microsoft .MET FrameworkАналогичного результата можно добиться, если в окне редактора коданажать клавишу F5 или использовать контекстное меню. Для добавления точкиостанова с помощью контекстного меню (рис. 2.25) в нем необходимо выбратьпункт Debug >• Toggle Breakpoint.Close PageCW+F4Show DesignerOpen File at CursorCtrl+EnterNew Edit WindowFile FormatTopic Search•FlCompete class at cursor Shift+Ctrl+CAdd To-Do Item...tЖShift+Ctrl+TCytСЫтлCop-lСЫ+СF-жеCtri+v•Toggle Bookmarks•goto Bookmarks•C3earEoolJftwfes•-Read Qrjy§Message View•••••••.•:j|Fold•UnfoldToggle Commert1•Ctrl+/4»^),E2A,I}J|3dnG•aldsov•vp•uWetowic;aatet.Av•tc'.dC,/dP••.-.,••'••MohdaiftyC..u..r•••sorCtAress..••:•••.r!lt++F5FS.UProperties*Refactorjng•Find•Рис.