⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 029.htm

📁 Delphi基础知识讲座
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<p>Msg: String;</p>
<p>begin</p>
<p>case ErrorNum of</p>
<p>1:</p>
<p>Msg := 'Can not convert String to Number';</p>
<p>2:</p>
<p>Msg := 'Number is out of Range';</p>
<p>else</p>
<p>Msg := 'Input is Invalid';</p>
<p>end;</p>
<p>inherited Create(Msg,ErrorNum);</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">对于</font>EInvalidInput<font face="宋体"
lang="ZH-CN">,</font>ErrorCode=1<font face="宋体" lang="ZH-CN">表示输入的不是纯数字序列,而</font>ErrorCode=2<font
face="宋体" lang="ZH-CN">表示输入数值越界。</font></p>
<p><font face="宋体" lang="ZH-CN">口令检查是用户在</font>PassWord<font
face="宋体" lang="ZH-CN">中输入口令并按下回车键后开始的。实现代码在</font>PassWord<font
face="宋体" lang="ZH-CN">的</font>OnKeyPress<font face="宋体" lang="ZH-CN">事件处理过程中: </p>
</font><p>procedure TForm1.PassWordKeyPress(Sender: TObject; var Key: Char);</p>
<p>const</p>
<p>CurrentPassWord = 'Delphi';</p>
<p>begin</p>
<p>if Key = #13 then</p>
<p>begin</p>
<p>try</p>
<p>if PassWord.text &lt;&gt; CurrentPassWord then</p>
<p>raise EInvalidPassWord.Create;</p>
<p>Label2.Visible := True;</p>
<p>InputEdit.Visible := True;</p>
<p>InputEdit.SetFocus;</p>
<p>PassWord.Visible := False;</p>
<p>Label1.Visible := False;</p>
<p>except</p>
<p>on EInvalidPassWord do</p>
<p>begin</p>
<p>PassWord.text := '';</p>
<p>raise;</p>
<p>end; </p>
<p>end;</p>
<p>Key:=#0;</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">同样,在</font>InputEdit<font face="宋体"
lang="ZH-CN">的</font>OnKryPress<font face="宋体" lang="ZH-CN">事件处理过程中实现了输入数字的合法性检查: </p>
</font><p>procedure TForm1.InputEditKeyPress(Sender: TObject; var Key: Char);</p>
<p>var</p>
<p>Res: Real;</p>
<p>Code: Integer;</p>
<p>begin</p>
<p>if Key = #13 then</p>
<p>begin</p>
<p>try</p>
<p>val(InputEdit.text,Res,Code);</p>
<p>if Code &lt;&gt; 0 then</p>
<p>raise EInValidInput.create(1);</p>
<p>if (Res &gt; 1) or (Res &lt; 0) then</p>
<p>raise EInValidInput.create(2);</p>
<p>MessageDlg('Correct Input', mtInformation,[mbOk], 0);</p>
<p>Key := #0;</p>
<p>except</p>
<p>on E:EInValidInput do</p>
<p>begin</p>
<p>InputEdit.text := '';</p>
<p>MessageDlg(E.Message, mtWarning,[mbOk], 0);</p>
<p>end;</p>
<p>end;</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">由于异常响应后即被清除,所以要显示异常信息,需要另外的手段。在以上两段程序中我们采用了两种不同的方法:在口令合法性检查中,利用异常重引发由系统进行缺省响应;在输入数字合法性检查中,通过异常实例来获取异常信息并由自己来显示它。</font></p>
<p><font face="宋体" lang="ZH-CN">以上所举的是一个非常简单的例子,但从中已可以发现:使用自定义异常编程,为程序设计带来了很大的灵活性。 </p>
</font><p>12.3.6 <font face="宋体" lang="ZH-CN">利用异常响应编程 </p>
<p>  利用异常处理机制不仅能使程序更加健壮,而且也提供了一种使程序更加简捷、明了的途径。事实上,使用自定义异常类就是一种利用异常响应编程的方式。这里我们再讨论几个利用标准异常类编程的例子。</p>
<p>  比如为了防止零作除数,可以在进行除法运算前使用</font>if<font
face="宋体" lang="ZH-CN">…</font>then<font face="宋体" lang="ZH-CN">…</font>else<font
face="宋体" lang="ZH-CN">语句。但如果有一系列这样的语句则繁琐程度是令人难以忍受的。这时候我们可能倾向于使用</font>EDivByZero<font
face="宋体" lang="ZH-CN">异常。例如如下一段程序就远比用</font>if<font
face="宋体" lang="ZH-CN">…</font>then<font face="宋体" lang="ZH-CN">…</font>else<font
face="宋体" lang="ZH-CN">实现简捷明了。 </p>
</font><p>function Calcu(x,y,z,a,b,c:Integer):Real;</p>
<p>begin</p>
<p>try</p>
<p>Result := x/a+y/b+z/c ;</p>
<p>except</p>
<p>on EDivByZero do</p>
<p>Result := 0;</p>
<p>end;</p>
<p>end;</p>
<p><font face="宋体" lang="ZH-CN">在</font>(6.2.3)<font face="宋体" lang="ZH-CN">记录文件的打开与创建中就是利用异常响应来实现文件的打开或创建。 </p>
</font><p>procedure TRecFileForm.OpenButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>if OpenDialog1.Execute then</p>
<p>FileName := OpenDialog1.FileName</p>
<p>else</p>
<p>exit;</p>
<p>AssignFile(MethodFile,Filename);</p>
<p>try</p>
<p>Reset(MethodFile);</p>
<p>FileOpened := True;</p>
<p>except</p>
<p>on EInOutError do</p>
<p>begin</p>
<p>try</p>
<p>if FileExists(FileName) = False then</p>
<p>begin</p>
<p>ReWrite(MethodFile);</p>
<p>FileOpened := True;</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>FileOpened := False;</p>
<p>MessageDlg('<font face="宋体" lang="ZH-CN">文件不能打开</font>',mtWarning,[mbOK],0);</p>
<p>end;</p>
<p>except</p>
<p>on EInOutError do</p>
<p>begin</p>
<p>FileOpened := False;</p>
<p>MessageDlg('<font face="宋体" lang="ZH-CN">文件不能创建</font>',mtWarning,[mbOK],0);</p>
<p>end;</p>
<p>end;</p>
<p>end;</p>
<p>end;</p>
<p>if FileOpened = False then exit;</p>
<p>Count := FileSize(MethodFile);</p>
<p>if Count &gt; 0 then</p>
<p>ChangeGrid;</p>
<p>RecFileForm.Caption := FormCaption+' -- '+FileName;</p>
<p>NewButton.Enabled := False;</p>
<p>OpenButton.Enabled := False;</p>
<p>CloseButton.Enabled := True;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">总之,利用异常响应编程的中心思想是虽然存在预防异常发生的确定方法,但却对异常的产生并不进行事前预防,而是进行事后处理,并以此来简化程序的逻辑结构。 </p>
</font><p align="center">12.4<font face="宋体" lang="ZH-CN"> 程序调试简介 </p>
<p>  </font>Delphi<font face="宋体" lang="ZH-CN">提供了一个功能强大的内置调试器</font>(Integrated
Debugger), <font face="宋体" lang="ZH-CN">因而对程序的调试不用离开集成开发环境</font>(IDE)<font
face="宋体" lang="ZH-CN">就可以进行。</p>
<p>  程序错误基本可以分为两类,即运行时间错和逻辑错。所谓运行时间错是指程序能正常编译但在运行时出错。逻辑错是指程序设计和实现上的错误。程序语句是合法的,并顺利执行了,但执行结果却不是所希望的。</p>
<p>  对于这两类错误,调试器都可以帮助你快速定位错误,并通过对程序运行的跟踪和对变量值的监视帮助你寻找错误的真正原因和解决错误的途径。</p>
<p>  程序调试的主要内容可以概括为如下的几方面:</p>
<p>  </font>1.<font face="宋体" lang="ZH-CN">调试的准备和开始;</p>
<p>  </font>2.<font face="宋体" lang="ZH-CN">控制程序的执行;</p>
<p>  </font>3.<font face="宋体" lang="ZH-CN">断点的使用;</p>
<p>  </font>4.<font face="宋体" lang="ZH-CN">检查数据的值。</p>
<p>  程序调试只有用户实际上机操作才能真正掌握。在这一节中我们主要对调试中的主要问题和一些关键点进行介绍。至于一些很细小的问题相信读者可以在上机实际应用中掌握,因而没有列出。</p>
<p> </font></p>
<p>12.4.1 <font face="宋体" lang="ZH-CN">调试的准备和开始 </p>
<p>  在程序开发过程中程序编码和调试是一个持续的循环过程,只有在你对程序进行了彻底的测试后才能交付最终用户使用。为了保证调试的彻底性,在调试前应制定一个详细的调试计划。一般说来应该把程序划分为几个相对独立的部分,分别进行调试,以利于错误的迅速定位,确保每一部分程序都按设计的要求运行。</p>
<p>  调试计划准备好后就可以开始程序的调试。</p>
<p>  开始一个调试过程包括:</p>
<p>  </font>1.<font face="宋体" lang="ZH-CN">编译时产生调试信息;</p>
<p>  </font>2.<font face="宋体" lang="ZH-CN">从</font>Delphi<font face="宋体"
lang="ZH-CN">里运行你的程序。</p>
<p>  在程序调试过程中,程序的执行完全在你的控制之中。你可以在任何位置暂停程序的执行去检查变量和数据结构的值,去显示函数调用序列,去修改程序中变量的值以便观察不同值对程序行为的影响。 </p>
</font><p>12.4.1.1 <font face="宋体" lang="ZH-CN">产生调试信息 </p>
<p>  要使用内部调试器必须选中</font>Option| Environment<font face="宋体"
lang="ZH-CN">菜单</font>References<font face="宋体" lang="ZH-CN">页的</font>Integrated
Debugging<font face="宋体" lang="ZH-CN">检查框。缺省情况下该框被选中。</p>
<p>  在开始调试前需要使用</font>Symbols Debug Information(<font
face="宋体" lang="ZH-CN">调试符号信息</font>)<font face="宋体" lang="ZH-CN">编译工程文件。调试符号信息包含了一个符号表,能够使调试器在程序的源代码与编译器产生的机器代码间建立联系。这样在程序执行中可以同时查看对应的源代码。</p>
<p>  </font>Delphi <font face="宋体" lang="ZH-CN">在缺省情况下自动产生调试符号信息。在集成开发环境中的开关选项是</font>Option|project<font
face="宋体" lang="ZH-CN">菜单</font>Compiler Options<font face="宋体" lang="ZH-CN">页的</font>Debug
Information and Local Symbols<font face="宋体" lang="ZH-CN">检查框。</p>
<p>  当产生的调试符号信息供内部调试器使用时,编译器把调试符号表储存在每个相应的</font>.dcu<font
face="宋体" lang="ZH-CN">文件中。</p>
<p>  如果希望在集成环境外使用</font>Turbo Debugger<font face="宋体"
lang="ZH-CN">,则需要把调试信息储存在最终的</font> .exe<font face="宋体"
lang="ZH-CN">文件中。为此需要选定</font>Option|Project<font face="宋体"
lang="ZH-CN">菜单</font>Linker<font face="宋体" lang="ZH-CN">页的</font>Include TDW
Debug Info<font face="宋体" lang="ZH-CN">检查框。</p>
<p>  由于储存调试信息大大增加了执行文件的大小,因而调试完成后应重新生成一个不包含调试信息的执行文件。 </p>
</font><p>12.4.1.2 <font face="宋体" lang="ZH-CN">运行程序 </p>
<p>  通过调试器</font>(<font face="宋体" lang="ZH-CN">包括内置调试器</font>)<font
face="宋体" lang="ZH-CN">运行程序,当程序处于等待状态时,调试器可以获得控制,利用调试器的功能来检查当前程序的状态。通过合理布置屏幕显示,使应用程序运行窗口和</font>Code
Editor(<font face="宋体" lang="ZH-CN">代码编辑器</font>)<font face="宋体"
lang="ZH-CN">互不重叠,可以让用户在它们间方便地切换以观察代码执行的效果。</p>
<p>  如果希望使用命令行参数来调试程序,则可以通过</font>Run|Parameters
<font face="宋体" lang="ZH-CN">菜单打开运行参数对话框进行设置。 </p>
</font><p>12.4.2 <font face="宋体" lang="ZH-CN">程序运行的控制 </p>
<p>  程序运行控制的方法和使用如下表。 </p>
<p>   表</font>12.7<font face="宋体" lang="ZH-CN">  程序运行控制的方法和使用途径</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>方法 使用途径</p>
<p>───────────────────────────────</p>
<p>运行到光标位置 ●</font> Code Editor<font face="宋体" lang="ZH-CN">加速菜单的</font>Run
to Cursor<font face="宋体" lang="ZH-CN">项</p>
</font><p>(Run to Cursor) <font face="宋体" lang="ZH-CN">●</font> Run<font
face="宋体" lang="ZH-CN">主菜单的</font>Run to Cursor<font face="宋体"
lang="ZH-CN">项</p>
<p>●</font> F4</p>
<p><font face="宋体" lang="ZH-CN">跟踪</font>(Trace Into) <font face="宋体"
lang="ZH-CN">●</font> Run<font face="宋体" lang="ZH-CN">主菜单的</font>Trace Into<font
face="宋体" lang="ZH-CN">项</p>
<p>●</font> Trace Into<font face="宋体" lang="ZH-CN">加速按钮</p>
<p>●</font> F7</p>
<p><font face="宋体" lang="ZH-CN">步进</font>(Step Over) <font face="宋体"
lang="ZH-CN">●</font> Run<font face="宋体" lang="ZH-CN">主菜单的</font>Step Over<font
face="宋体" lang="ZH-CN">项</p>
<p>●</font> Step Over<font face="宋体" lang="ZH-CN">加速按钮</p>
<p>●</font> F8</p>
<p><font face="宋体" lang="ZH-CN">运行到断点 设置断点并按正常方式运行</p>
<p>暂停程序执行 </font>Run<font face="宋体" lang="ZH-CN">主菜单的</font>Program
Pause<font face="宋体" lang="ZH-CN">项</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>  跟踪和步进都是一种单步执行方式。但“步”的含义不同。对跟踪而言它一次执行一条简单程序语句。当碰到包含调试信息的函数或过程调用时则跳入该函数或过程,并执行其第一条可执行语句。对步进而言它一次执行一条当前模块的可执行语句,而不管该语句是否是函数或过程调用。</p>
<p>  运行到光标位置和运行到断点都是程序正常运行到某一确定的源代码位置,而后进入调试状态。但相对于运行到光标位置而言,运行到断点更为灵活。因为断点一次可设置多个,同时也可以对断点设置一定的条件。只有满足该条件程序运行才会中止。</font></p>
<p><font face="宋体" lang="ZH-CN"> </font></p>
<hr color="#EE9B73" size="1" width="94%">

</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%"  background="bg.gif"><strong><A HREF="030.htm" ><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="028.htm" ><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>

<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -