Delphi7.0如何调试程序?

Delphi7.0如何调试程序?,第1张

按那个绿色三角形按钮就行了,如果你的代码有问题,它会在代码编辑器下方给出提示,代码编辑框中的光标会停留在有问题代码的下一条代码上。修改有问题的代码后,再按绿色按钮,如果能出现你想要的程序界面,就成了,反之,再修改代码。直到你想要效果出来为止,这就是DELPHI程序的一般调试。

有两种途径可用于调试服务程序 第一种是在单独的类中定义服务的工作部分 并在一个单独的程序中对其进行调试 第二种是在服务运行时进行调试 第一种途径是个好主意 把负责服务工作的类添加到通常的程序是测试服务行为的最容易的方法 而且保持了与工作台测试的思想的一致性 我们使用第一种方法 在创建ServiceApp 和TestMailer(本书光盘上也有)这两个程序时进行测试 把同样的组件TIdMessage TTimer 和TIdSTMP 添加到一个单独的程序 然后创建一个邮件发送器 当找到TestMailer 程序的缺陷后 所有的修改都更新到服务程序 创建工作台或测试程序是很容易的 但并不总是够用 第二种测试服务程序的途径是 安装并运行服务程序 然后将其附加到Delphi 中的运行进程 按照下列步骤 即可在运行服务时调试ServiceApp exe 程序 在命令行运行Serviceapp exe /INSTALL 安装服务程序 选择Start | Settings | Control Panel | Administrative Tools | Services 将运行Services 小应用程序 找到MyService 然后单击Start Service 工具栏按钮(这些步骤适用于Windows 在Windows NT 中的步骤几乎相同) 运行Delphi 装载ServiceApp dpr 工程 在Delphi 中选择Run | Attach to Process 菜单项 在Attach to Process 对话框(如下图所示)中 选中Show System Processes 复选框 [[The No Picture ]] 找到ServiceApp exe 然后单击Attach 按钮 在Delphi 中 对工程源文件的OnExecute 事件方法设置断点 然后按键F 图B Attach to Process 对话框可用于将Delphi 调试器附加到已运行的进程上 这对于调试服务程序是很有用的Delphi 将把调试器附加到运行的服务程序上 并打开CPU 对话框 除非您阅读汇编语言非常流畅 否则CPU 视图用处不大 但当服务程序运行到断点时 将停止在断点上并切换到Delphi 代码视图 在用户通过Delphi 获取对已运行服务的控制之后 即可像其他程序一样对服务进行步进和调试 注意 作为开发者 您应该对自己的PC 具有管理员权限 令人难以置信的是 有些组织信任开发者编写的代码但却不允许他们管理自己的PC 现在的经济形势仍然很好 找一份新工作吧 Delphi 帮助文档提到 如果权限不足 那么附加到服务进程可能会失败 当只要对PC 拥有管理员权限 附加到运行的服务进程总是工作正常 帮助主题 Debugging Services 包含了调试服务的第三种途径 其中涉及到修改注册表设置 可以参考 lishixinzhi/Article/program/Delphi/201311/11122

对象异常类

所谓对象异常是指非部件的对象引发的异常 Delphi定义的对象异常包括流异常 打印异常 图形异常 字符串链表异常等

流异常类

流异常类包括EStreamError EFCreateError EFOpenError EFilerError EReadError EWriteError EClassNotFound 它们的结构关系如下

EStreamError

| EFCreateError

| EFOpenError

| EFilerError

| EReadError

| EWriteError

| EClassNotFound

流异常在Classes库单元中定义

流异常引发的原因如表

表   流异常类及其产生原因

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

异常类 引发原因

─────────────────────────────────

EStreamError 利用LoadFromStream方法读一个流发生错误

EFCreateError 创建文件时发生错误

EFOpenError 打开文件时发生错误

EFilerError 试图再次登录一个存在的对象

EReadError ReadBuffer方法不能读取特定数目的字节

EWriteError WriteBuffer方法不能写特定数目的字节

EClassNotFound 窗口上的部件被从窗口的类型定义中删除

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

打印异常类

打印异常类EPrinter当打印发生错误时引发 它在printers库单元中定义 例如你的应用程序试图向一个不存在的打印机打印或由于某种原因打印工作无法送到打印机时 就会产生一个打印异常

图形异常类

图形异常类定义在Graphic 库单元中 包括EInvalidGraphic和EInvalidGraphicOperation两类

EInvalidGraphic当应用程序试图从一个并不包含合法的位图 图标 元文件或用户自定义图形类型的文件中装入图形时引发 例如下面的代码

Image Picture LoadFromFile( Readme txt )

由于Readme txt并不包含一个合法的图形 因而将引发一个EInvalidGraphic异常

EInvalidGraphicOperation当试图对一个图形进行非法 *** 作时引发 例如试图改变一个图标的大小

var

AnIcon: TIcon

begin

AnIcon := TIcon Create

AnIcon LoadFromFile( C:\WINDOWS\DIRECTRY ICO )

AnIcon Width := { 引发一个图形异常 }

字符串链表异常

字符串链表异常EStringListError EListError在用户对字符串链表进行非法 *** 作时引发 由于许多部件(如TListBox TMemo TTabSet …)都有一个TStrings类的重要属性 因而字符串链表异常在部件 *** 作编程中非常有用

EStringListError异常一般在字符串链表越界时产生 例如对如下初始化的列表框

ListBox Items Add( First item )

ListBox Items Add( Second item )

ListBox Items Add( Third item )

则以下 *** 作都会引起EStringListError异常

ListBox Item[ ] := Not Exist

str := ListBox Item [ ]

EListError异常一般在如下两种情况下引发

当字符串链表的Duplicates属性设置为dupError时 应用程序试图加入一个重复的字符串

试图往一个排序的字符串链表中插入一个字符串

部件异常类

通用部件异常类

通用部件异常类常用的有三个 EInvalidOperation EComponentError EOutOfResource 其中EInvalidOperation EOutOfResource在Controls单元中定义 EComponentError在Classes单元中定义

非法 *** 作异常 EInvalidOperation

EInvalidOperation 引发的原因可能有

● 应用程序试图对一个Parent属性为nil的部件进行一些需要Windows句柄的 *** 作

● 试图对一个窗口进行拖放 *** 作

● *** 作违反了部件属性间内置的相互关系等

例如 ScrollBar Gauge等部件要求Max属性大于等于Min属性 因而下面的语句

ScrollBar Max := ScrollBar Min

将引发一个EInvalidOperation异常

部件异常EComponentError

引发该异常的原因可能有

● 在Register过程之外试图登录一个部件(常用于自定义部件开发中)

● 应用程序在运行中改变了一个部件的名称并使该部件与另一个部件重名

● 一个部件的名称改变为一个Object Pascal非法的标识符

● 动态生成一个部件与已存在的另一部件重名

资源耗尽异常EOutOfResource

当应用程序试图创建一个Windows句柄而Windows 却没有多余的句柄分配时引发该异常

专用部件异常类

许多部件都定义了相应的部件异常类 但并不是有关部件的任何错误都会引发相应的异常类 许多情况下它们将引发一个运行时间异常或对象异常

下面列出几个典型的部件异常类

EMenuError

非法的菜单 *** 作 例如试图删除一个不存在的菜单项 这一异常类在Menus库单元中定义

EInvalidGridOpertion

非法的网格 *** 作 比如试图引用一个不存在的网格单元 这一异常类在Grids库单元中定义

EDDEError

DDE异常 比如应用程序找不到特定的服务器或会话 或者一个联接意外中止 这一异常类在DDEMan库单元中定义

EDatabaseError EReportError

数据库异常(EDatabaseError)和报表异常(EReportError) 在进行数据库和报表 *** 作出现错误时引发 有关数据库的问题请读者参阅本书第二编

小结

在这一节中重点介绍了Delphi提供的异常类体系 我们力求给读者一个清晰 全面的印象 使读者能在自己的程序开发中实际使用它们 为便于理解我们也提供了一些简单的说明性示例 虽然在具体的使用中读者还可能会碰到许多问题 但意识到应该用异常类来增强程序的健壮性却是程序设计水平走上新台阶的标志

异常保护

确保回收分配的资源是程序健壮性的一个关键 但缺省情况下异常发生时程序会在出错点自动退出当前模块 因此需要一种特殊的机制来确保即使在异常发生的情况下释放资源的语句仍能被执行 而Delphi的异常处理正提供了这种机制

需要保护的资源

一般说来需要保护的资源包括

● 文件

● 内存

● Windows资源

● 对象

比如下面一段程序就会造成 K内存资源的丢失

var

APointer : Pointer

AInt ADiv: Integer

begin

ADiv :=

GetMem ( APointer )

AInt := div ADiv

FreeMem ( Apointer )

end

由于程序从异常发生点退出从而FreeMem永远没有执行的机会

lishixinzhi/Article/program/Delphi/201311/25193


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12147660.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存