《Borland_Delphi教学讲义_第3章.ppt》由会员分享,可在线阅读,更多相关《Borland_Delphi教学讲义_第3章.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章 面向对象程序设计面向对象程序设计面向对象程序设计(Object-orientedProgramming,简称OOP)方法是一种以模拟现实世界的概念来组织程序的全新方法,其立意于创建软件重用代码,具备更好地模拟现实世界环境的能力。能够支持面向对象程序设计的语言称之为面向对象的程序设计语言。Delphi是完全面向对象的,具有真正OOP扩展的可视化编程环境,将可视化编程与面向对象的开发框架紧密地结合起来。本章主要介绍面向对象的程序设计方法。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤面向对象的可视化编程一般包括以下步骤:l创建应用程序。l设计应用程序的界面,添加各窗体的
2、组件对象。l设置主窗体组件对象的属性。l编写程序代码(主要是按钮的事件处理代码)。l保存文件。l编译、运行程序。【例3-1】创建一个工程,其中有一个窗体InputForm,用于输入教师基本信息。下面以例3-1为例,介绍面向对象的可视化编程的步骤。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.1 建立新工程建立新工程在Delphi7集成环境下选择FileNewApplication菜单项,或使用工具条上New按钮,然后在NewItems窗口中选择Application,若此前未打开任何工程,确认后,FormDesigner窗口中会出现一个空白窗体Forml,在CodeEdi
3、t窗口中还会出现与Forml对应的代码单元Unitl。若先前已打开了工程并且没有对修改过的工程进行保存,则系统会提示是否保存等信息,处理完毕后系统将关闭该工程,然后新建一个应用程序。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.2 设计程序界面设计程序界面InputForm窗体设计界面如图3-1所示,界面上包含五个标签(Label),用于显示输入提示信息,两个文本框(Edit),分别用于输入姓名、工龄;二个组合列表框(ComboBox),分别用于选择职称和部门的输入内容;三个按钮(Button),分别用于清除、显示和退出程序。InputForm窗体及其包含的组件属性见书表
4、3-1。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤图3-1 InputForm窗体设计界面3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.3 编写程序代码编写程序代码本本例例所所要要设设计计的的是是按按钮钮组组件件对对象象的的事事件件处处理理程程序序。双双击击窗窗体体上上的的按按钮钮,将将打打开开代代码码编编辑辑器器,在在begin和和end之间输入如下各按钮的事件处理代码。之间输入如下各按钮的事件处理代码。(*“清除清除”按钮事件处理代码按钮事件处理代码*)procedureTInputForm.BtnClearClick(Sender:TObject)
5、begin(*清空各文本框*)Edit1.Text:=;Edit2.Text:=;end;3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤(*“显示显示”按钮事件处理代码按钮事件处理代码*)procedureTInputForm.BtnShowClick(Sender:TObject);beginMessageDlg(显示教师基本信息的窗体,mtInformation,mbOk,0);end;(*“退出”按钮事件处理代码*)procedureTInputForm.BtnExitClick(Sender:TObject);beginClose;/关闭TInputForm窗体end;3
6、.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.4 保存所有文件保存所有文件选择FileSaveAll选项,由于这个新建的工程还没有命名,所以首先会出现一个SaveAs对话框,默认的单元名是Unitl,用户可以用更具描述意义的名字代替它。在这里,使用InputUnit.pas进行命名。保存完单元文件后,又会出现SaveAs对话框,要求为工程文件命名,在这里,把它命名为InputPrj.dpr。注注意意:在进行程序设计前,应该先建立一个目录,用来存放工程文件,便于管理。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.5 运行程序运行程序运行程序的方法主要有以
7、下几种:l打开Run菜单,选择Run子菜单。l快捷键:F9。l单击工具栏的按钮。其他的程序运行方式在本章第五节程序调试中将详细介绍。其运行后,在文本框中分别输入姓名(张红)、工龄(19),并选择职务(副教授)和部门(外语系)的值,如图3-2所示。按下“退出”按钮,将关闭“教师基本信息”窗口,结束程序的运行。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.6 生成生成exe文件文件打开工程文件,选择菜单项ProjectBuild,生成可执行文件,文件名与工程文件名同名,扩展名为.exe。可以通过双击.exe文件图标启动应用程序。例如:由工程文件InputPrj.dpr生成ex
8、e文件的过程是:选择菜单项ProjectBuildInputPrj,生成InputPrj.exe文件,双击InputPrj.exe文件图标,即可运行应用程序。图3-2 InputForm运行界面3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤3.1.7 制作安装包制作安装包在完成了应用程序的设计后,就要将最终的产品打包发送给用户。目前一般使用安装程序InstallShield来制作安装盘。1创建新的项目(1)进入Delphi7集成开发环境,编译并执行应用程序InputPrj.exe。(2)单击 开始程序InstallShieldExpress,打开InstallShieldExpr
9、essBorlandLimitedEdition窗口。(3)选择FileNew命令,将弹出如图3-3所示的NewProject对话框。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤(4)单击按钮,弹出“SelectaFileName”对话框。输入安装程序名为“人事管理”,然后选择保存位置为C:DocumentsandSettingsAdministratorMydocumentsMysetups,单击“保存”按钮,返回到图3-3所示的界面,单击“OK”按钮。图3-3 New Project对话框3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤这样就在C:Documen
10、ts and SettingsAdministratorMydocumentsMysetups路径下创建一个名为“人事管理”的安装项目,如图3-4所示。图图3-4 3-4 制作新安装项目的界面制作新安装项目的界面3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤2制作安装程序的步骤整个安装程序的制作分为以下6个步骤。(1)组织安装项目。安装制作的第1步是配置项目中常见的设置,可再细分为以下几步。GeneralInformation:配置整个项目的一些基本信息。选择OrganizeYourSetupGeneralInformation,可以在屏幕的右方设置项目的基本信息。在这些基本信息
11、中以下几个是必须设置的。Subject:项目名。ProductName:产品名。Installdir:安装的目标文件夹。安装项目的基本信息的设定如图3-5所示3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤图3-5 基本信息的设定 Features:使整个项目中需要安装的文件按不同的用途分组。Setup Types:安装类型设置,用户根据不同的需求选择不同的安装类型。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤(2)指定项目文件。安装制作的第2步工作是向安装项目中添加文件。选择SpecifyApplicationDataFiles,可以在屏幕右方的几个窗口向安装项目
12、中添加文件,如图3-6所示。在“Source computers folders”窗 口 中 定 位 到F:Delphi61第三章,此时“Sourcecomputersfiles”列表中显示了该文件夹下的文件。鼠 标 单 击“Source computers files”列 表 中 的“InputPrj.exe”文 件,将 其 拖 到“Destinationcomputersfolders”的“ProgramFilesFolderINSTALLDIR”上松开鼠标,这样在该文件夹中就多了一个名为“InputPrj.exe”的文件。若系统有数据库文件,用同样的方法将数据库文件拖动到“Databas
13、eDATABASEDIR”文件夹中,本例中没有数据库文件。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤图3-6 向安装项目中添加文件窗口(3)配置目标系统(Configure the Target System)。是让安装程序在安装过程中能够自动配置目标系统的一些参数,如桌面快捷方式、ODBC数据源(若有数据库文件)等。选择Configure the Target SystemShortcuts/Folders,将显示如图3-7所示的视图。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤图3-7 创建快捷方式的窗口 鼠标右击中间窗口的“Desktop”,选择弹出式菜
14、单中的New Shortcuts命令,创建名为“InputPrj”的快捷方式(如图3-7所示)。若有数据库文件,则还需要配置ODBC数据源:选择Configure the Target SystemODBCresources,系统显示了本机上存在的ODBC数据源,可以通过选择决定是否将其中的某些数据源安装到目标机器上。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤(4)设置安装界面(CustomizetheSetupAppearance)。安装制作的第4步工作是选择安装过程中将要显示的界面。选择CustomizetheSetupAppearanceDialogs,将显示如图3-8
15、所示的界面。选中需要显示的对话框前面的复选框。(5)设 定 安 装 所 需 的 前 提 条 件(Define SetupRequirementsandActions)。安装制作的第5步工作主要是定义安装的前提条件,包含以下几个步骤:Requirements:选择安装的软硬件环境。CustomAction:选择需进行的安装操作。SupportFiles:选择所支持的文件。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤图3-8 安装过程中显示对话框的设置(6)制作安装程序的最后阶段(Prepare for Release)。选择Prepare for ReleaseBuild You
16、r Release,编译安装项目。选择Prepare for ReleaseTest Your Release,测试安装程序。3.13.1面向对象的可视化编程步骤面向对象的可视化编程步骤选择PrepareforReleaseDistributeYourRelease,发布安装程序。至此应用程序InputPrj的安装程序就制作完成。最后,测试安装程序,如图3-9所示。图3-9 安装程序运行界面3.23.2对象和类的概念对象和类的概念3.2.1 对象对象对象是一种数据结构,是类的实例。了解对象,最关键的是掌握对象的特性。一个对象最突出的三个特征是封装性、继承性、多态性。定义了类之后,就可以创建该类
17、的实例,即对象,通过对象来访问类的成员。对象声明的语法格式如下:varObjectName:Classname;其中Classname是已定义过的类名。例如:声明Tstudent类(已定义过)的对象Classmate可以用以下语句,varClassmate:Tstudent;3.2.2 类类在ObjectPascal语言中,类和记录比较相似,也是一个构造类型,并且由属性和方法构成。其中属性又包括类的内部属性和外部属性,也就是供内部使用的一些数据变量和供外部使用的一些数据变量;方法则是该类或其实例可以操作的过程和函数。通常把类的内部属性称为字段,把字段、属性和方法统称为类的成员。类的定义形式如下
18、:typeClassName=Class(ParentClassname)MemberListend;3.23.2对象和类的概念对象和类的概念3.23.2对象和类的概念对象和类的概念1成员属性类的成员属性由保留字private、protected、public、published或automated来说明,通过这些保留字,可以控制对类中成员的访问权限。每个保留字的具体含义如下:private:私有成员,不能被类所在单元以外的程序访问。protected:保护成员,可以被该类的所有派生类访问,并且成为派生类的私有成员。public:公有成员,可以被该类以外的类访问。published:发行类型成
19、员,它的访问权限基本与公有成员相同,只是在设计期间可以被访问。automated:自动类型成员,它的访问权限基本与公有成员相同,一般用在从TAutoObject类派生的类中。3.23.2对象和类的概念对象和类的概念构造函数和析构函数是类定义中两个非常重要的函数。声明类的一个变量后,调用类的构造函数来进行一些初始化工作,再对类的实例对象进行操作、使用,使用完毕,调用类的析构函数,删除创建的对象,同时释放相应的内存资源等。构造函数完成对象的创建和初始化工作,根据类的结构为类的对象分配内存空间,而且还可以打开文件或数据库,读取一些初始数据,或者控制一些设备进行复位等。定义构造函数使用保留字Const
20、ructor,通常函数名使用Create。如果在定义类的时候没有定义构造函数,系统会自动为该类生成一个默认的构造函数。3.23.2对象和类的概念对象和类的概念析构函数的作用是将对象删除并释放相应的内存资源,此外还可以在这之前保存一些数据信息并关闭文件或数据库等,或者对一些设备进行复位。定义析构函数使用保留字Destructor,函数名为Destroy。如果在定义类的时候没有定义析构函数,则系统会自动为该类生成一个默认的析构函数。下面的例子说明了类的定义和使用。3.2.3 方法方法方法是属于一个给定对象的过程或函数,反映的是对象的行为而不是数据。1方法的声明和定义创建一个方法分两步:首先是在对象
21、类型的声明中声明这个方法,然后再用代码来定义方法。方法的声明格式如下:3.23.2对象和类的概念对象和类的概念typeTPerson=Class/人类publicname:String;/姓名FunctionGetAge:Integer;/获取年龄procedureSetAge(a:Integer);/设置年龄privateage:Integer;/年龄end;3.23.2对象和类的概念对象和类的概念2方法的类型对象的方法能定义成静态(static)、虚拟(virtual)、动态(dynamic)或消息处理(message)。请看下面的例子:TMyclass=classProcedureMyS
22、tatic;/静态方法ProcedureMyVitual;virtual;/虚拟方法ProcedureMyDynamic;dynamic;/动态方法ProcedureMyMessage(varM:TMessage);messagewm_SomeMessage;/消息处理方法end;3.23.2对象和类的概念对象和类的概念3方法的覆盖在ObjectPascal中利用覆盖一个方法来实现OOP的多态性概念。通过覆盖使一种方法在不同的派生类间表现出不同的行为。ObjectPascal中能被覆盖的方法是在声明时被标识为virtual或dynamic的方法。为了覆盖一个方法,在派生类的声明中用overri
23、de代替virtual或dynamic。例如:能用下面的代码覆盖yVirtual和MyDynamic方法。TmyclassChild=Class(TMyclass)procedureMyVitual;override;procedureMyDynamic;override;procedureMyMessage(varM:TMessage);messagewm_SomeMessage;end;3.23.2对象和类的概念对象和类的概念4方法的重载就像普通的函数和过程,方法也支持重载,使得一个类中有许多同名的方法带着不同的参数表,能重载的方法必须用overload关键字标识出来,可以不对第一个方法用
24、overload。下面的代码演示了一个类中有三个重载的方法:TypeTSomeClass=classprocedureAmethod(i:Integer);overload;/方法的重载procedureAmethod(s:String);overload;/方法的重载procedureAmethod(d:Double);overload;/方法的重载end;3.23.2对象和类的概念对象和类的概念3.2.4 继承和多态继承和多态1继承性继承性是指一个子类能够从父类中获取属性和方法,继承的好处是能共享代码,在往子类中添加任何新内容之前,父类的每一个属性和方法都已存在于子类中。在定义一个实体的时
25、候,可能会使用一些抽象的概念来概括一类事物。但是在现实生活中,接触到的都是某一类具体的事物。由于类具有继承性,所以可以在父类的基础上派生出子类,同时为了避免直接创建类的实例,可以把类定义为抽象类。在编程时,可以首先建立通用类,然后创建这些通用类所有专用功能的子类。3.23.2对象和类的概念对象和类的概念2多态性在ObjectPascal语言中定义的类的方法通常是“静态”的,也就是说在编译和链接阶段就确定了对象方法的调用地址。另外,还可以在运行时才确定对象方法的调用地址,这种调用函数的方式叫做多态性。在ObjectPascal语言中,多态性是通过virtual方法或dynamic方法实现的,方法
26、的调用取决于对象的类型。3.33.3消息消息3.3.1 消息机制消息机制1什么是消息在Windows中,消息是被定义成如下形式的变体记录:TMessage=recordmsg:Word:caseIntegerOf0:(wparam:Word;lparam:Longint;result:Longint);1:(1:(wparamLo:BytewparamLo:Byte;wparamHi:BytewparamHi:Byte;lparamLo:WordlparamLo:Word;lparamHi:WordlparamHi:Word;resultLo:WordresultLo:Word;resultH
27、i:WordresultHi:Word););end;end;3.33.3消息消息2消息处理方法注注意意:(1)组件Message;(2)组件Defaulthandler;(3)父类Message;(4)组件Defaulthandler;(5)TwinControl.Defaulthandler;(6)TControl.Defaulthandler;(7)TObject.Defaulthandler;图图3-10 Delphi消息处理过程表消息处理过程表3.33.3消息消息表3-2处理消息的虚拟方法Tcontrol.WndProc定义了鼠标的基本消息,如点击和拖动。其他消息调用TObject.
28、DispatchTwinControl.WndProc覆盖了TControl.WndProc,定义对聚焦、鼠标、键盘消息的响应。其他消息继承TControl.WndProcTcontrol.DefaultHandler处 理 Windows管 理 组 件 的 文 本 串 的 消 息:WM_GETTEXT,WM_SETTEXT及WM_GETTEXTLENGTHTwinControl.DefaultHandler通过调用API函数CallWindowProc来处理各种消息3.33.3消息消息3Windows消息分类Windows的消息分类如下:(1)窗口管理消息(Windows-managemen
29、t):当一个窗口状态改变时,由Windows送给应用程序。(2)初始化消息:当应用程序建立一个菜单或者对话框时发送。(3)输入消息:Windows发送的鼠标、键盘、滚动条、时钟等消息。(4)系统消息:用户操作系统的控制菜单、滚动条、边界时,由Windows发给应用程序的消息。(5)剪贴板消息。(6)系统信息修改消息。(7)组件操作消息:Windows发给子组件,如按钮、列表、编辑框等。(8)组件通知消息:通知组件的父窗口发生在该控制内的动作。(9)多文档MDI消息。(10)非客户区消息。(11)滚动条通知消息。3.33.3消息消息3.3.2 发送消息发送消息Windows允许应用程序发送消息给
30、自己、其他应用程序或者Windows本身。Windows的API函数SendMessage和PostMessage都可以实现发送功能(格式如下)。FunctionSendMessage(Wnd:HWnd,Msg,Wparam:Word;Lparam:LongInt):LongInt;FunctionPostMessage(Wnd:HWnd,Msg,Wparam:Word;Lparam:LongInt):Boolean;发送函数的参数Wnd指出接收消息的窗口句柄。其他参数都是TMessage的记录域。Delphi组件还允许使用Perform方法给组件自己发送消息,格式如下:FunctionPer
31、form(Msg,Wparam:Word;Lparam:LongInt);LongInt;3.33.3消息消息3.3.3 处理消息处理消息1覆盖WndProc在程序中对WndProc进行覆盖,例如以下的定义和实现:procedureWndProc(varMessage:TMessage);override;procedureTMyControl.WndProc(varMessage:TMessage);beginif(Message.MsgWM_KeyDown)inheritedWndProc(Message);end;以上程序段屏蔽了键盘按下的消息。3.33.3消息消息2使用关键字Messa
32、ge可以使用关键字Message来声明Windows消息处理的程序。这种消息方法的定义可以使用消息的记录名字。在消息处理的过程中,也可以继承父类的消息处理过程,只需Inherited就可以了,不必指明继承哪个函数。3.33.3消息消息TypeTMyControl=class(TComponent)procedureKeyDownEvent(varMessage:TWMKeyDown);end;procedureTMyContro1.KeyDownEvent(varMessage:TWMKeyDown);beginShowMessage(IntToStr(Message.CharCode);In
33、herited;end;以上程序段输出被按下的键码。3.33.3消息消息3覆盖DefaultHandler在程序中对Defaulthandler进行覆盖,例如以下的定义和实现:procedureDefaulthandler(varMessage:TMessage);override;它的实现同WndProc。4Application.OnMessage可以通过给Application.OnMessage赋值的方法,使用自己编写的代码代替系统提供的消息处理过程。Application.OnMessage事件为应用程序的所有窗口查看消息队列。不要在这个事件中做耗时的操作,这会影响整个应用程序的速度
34、和安全性。3.33.3消息消息3.3.4 用户自定义消息用户自定义消息Windows允许定义自己消息的名字。常数WM_USER代表了第一条新消息的序号。例如:constWM_USERl=WM_USER+0;自定义的消息序号范围在0 x4000 x7fff,自定义的消息的使用方法同系统消息一样。3.43.4异常处理异常处理1异常异常(Exception)是所有的应用程序不可避免的。受异常的影响,程序常常被迫终止或者不能及时释放资源。Delphi提供了异常处理机制,使应用程序能够处理几乎所有的异常情况。2异常类(1)运行时间库异常类(RTLException)运行时间库异常类可以分为7类,见书表3
35、-3,它们定义在SysUtils库单元中。(2)对象异常类所谓对象异常类是指非部件的对象引发的异常类。Delphi定义的对象异常类见书表3-4。(3)组件异常类Delphi定义的组件异常类有3种3.43.4异常处理异常处理3.4.2 tryexcept子句子句tryexcept子句用于异常发生后,判断异常的类型,正确处理异常。在tryexcept语句中,except块包含异常发生时执行的动作。如果不发生异常,except块不被调用。tryexcept语法格式如下:try被保护语句except异常处理语句(异常不发生,不处理)end;3.43.4异常处理异常处理3.4.3 tryfinally语
36、句语句tryfinally语句用于异常发生时,要释放已分配的资源。tryfinally语句无论是否发生了异常,程序都会执行释放资源的语句,如果发生了异常,tryfinally不会处理异常,当finally代码被执行以后,异常被转到下一个合法的异常处理程序。tryfinally的语法格式如下:try资源使用情况finally释放资源end;3.43.4异常处理异常处理3.4.4 raise语句语句在tryexcept子句中,except处理了异常,然后便释放了异常对象,程序继续执行。但有时候,不需要释放异常对象,希望外层的异常保护程序能够继续处理该异常,那么就可以使用raise再次产生相同异常,
37、退到外层保护程序处理。例如:try被保护语句1try被保护语句2exceptononESomethingESomethingdodobeginbegin为为被被保保护护语语句句2 2提提供供异异常常保护保护 raise;raise;再次提出异常再次提出异常 end;end;end;end;exceptexceptononESomethingESomething dodo;所所有有的异常处理的异常处理 end;end;3.53.5程序调试程序调试在开发应用程序过程中,编写的代码难免会出现一些错误。常见的错误有:(1)语法错误。这种错误是最常见的错误,它们可以被编译器检查出来,因此容易修改。(2)
38、逻辑错误。程序员设计上的错误,这种错误较语法错误难发现,它们与程序员解决问题的思路有关。对于语法错误,Delphi的编译器会用高亮彩条标出错误的位置,并在编辑窗口底部显示错误信息;对于逻辑错误,就只能通过程序调试去发现和纠正。程序调试的主要内容可以概括为以下几个方面:l控制程序的运行。l断点的使用。l监视变量和数据结构项的数值变化。3.53.5程序调试程序调试3.5.1 调试的准备和开始调试的准备和开始在默认的状态下,调试程序不需要做任何准备,除非修改了Delphi7的配置。如果调试发生了问题,请按如下过程检查并将调试信息编译到程序中。首先激活集成调试器。激活的方法为:单击ToolsDebug
39、gerOption,打开Debugger Options对话框;然后选中窗口下部IntegeratedDebugging复选框(默认情况下该框选中)。在 开 始 调 试 前,还 需 要 将 符 号 调 试 信 息(Symbols DebugInformation)编译进程序。在Delphi环境中编译运行程序时,符号调试信息能够使调试器在程序的源代码与编译器产生的机器代码间建立联系,这样在程序执行中可以同时查看对应的源代码。符号调试信息被存放在一个符号表中,当产生的调试符号信息供集成调试器使用时,编译器把调试符号表储存在每个相应的.dcu文件中。3.53.5程序调试程序调试3.5.2 程序运行的
40、控制程序运行的控制通过调试器(包括集成调试器)运行程序,当程序处于等待状态时调试器可以获得控制,主要的控制方式有以下几种:(1)全速运行(Run)(2)单步执行(StepOver)(3)追踪执行(TraceInto)(4)运行到光标位置(RuntoCursor)(5)运行到断点(6)暂停执行(ProgramPause)(7)程序复位(ProgramReset)3.53.5程序调试程序调试3.5.3 断点的使用断点的使用 1设置断点在Delphi7中,通过设置断点,使程序在预先设置的代码上暂停,以便追踪变量值。设置断点有以下四种常用的方法:(1)单击CodeEditor中选定代码行左边的空白。(
41、2)将光标放置在要设置断点的那一行,按F5键。(3)选择CodeEditor菜单中的“DebugToggleBreakPoint”选项。(4)选择Run菜单中AddBreakPoint子选项打开断点编辑对话框进行设置。2断点的操作断点列表窗口(BreakPointListWindow)列出了所有断点所在的源文件名、行号、条件,以及已通过的次数。如果一个断点非法或失去功能,则在列表窗口中变灰。3.53.5程序调试程序调试 图3-10断点列表窗口(1)临时使某断点无效。(2)显示和编辑断点处的代码。(3)设置有条件断点和断点通过次数。3.53.5程序调试程序调试1通过Watch List 窗口监视
42、变量或表达式监视列表窗口(WatchListWindow)显示程序运行中当前监视变量或表达式的值。选择ViewDebugWindowsWatches选项,打开WatchList窗口,如图3-11所示。图3-11监视列表窗口当单步执行代码时,WatchList窗口动态更新,这样就可以看到每行代码对变量或表达式的影响。在WatchList窗口可以显示任何类型的变量或表达式,每个变量或表达式按适当的格式显示。WatchList窗口只能显示在作用域内有意义的变量值,变量在程序没有运行时显示Processnotaccessible,在断点处没有处于作用域内将显示Unknown identifier。当W
43、atchList窗口首次显示时,变量列表为空。3.53.5程序调试程序调试可以用以下几种方法将变量或表达式添加到WatchList窗口中:(1)在CodeEditor中选中一个变量或表达式,按Ctrl+F5组合键,Delphi7会弹出一个“WatchProperties”对话框,如图3-12。确认后,该变量就添加到WatchList窗口中。图3-12 “Watch Properties”对话框3.53.5程序调试程序调试(2)从CodeEditor中选中一个变量或表达式,按下鼠标右键,从快捷菜单中选择DebugAddWatchatCousor选项,把变量或表达式添加到WatchList窗口。(
44、3)单击主菜单RunAddWatch选项,打开“WatchProperties”对话框。输入要查看的变量或表达式。(4)从WatchList窗口选定一个变量或表达式,双击WatchList窗口或从WatchList窗口的快捷菜单中选择AddWatch或EditWatch。(5)当WatchList窗口为当前窗口时,按Ctrl+A键。3.53.5程序调试程序调试2修改变量或表达式的值在 WatchList窗 口 中 只 能 查 看 变 量,而 在“Evaluate/Modify”(如图3-13所示)对话框允许快速查看并修改某个变量或表达式的值。图3-13“Evaluate/Modify”对话框3
45、.53.5程序调试程序调试为激活“Evaluate/Modify”对话框,可运行程序到某个断点,在CodeEditor窗口中选中要查看的变量,然后利用以下几种方法之一,激活“Evaluate/Modify”对话框。(1)按Ctrl+F7键,出现“Evaluate/Modify”对话框。(2)单击主菜单RunEvaluate/Modify选项。(3)从 CodeEditor的 快 捷 菜 单 中 选 择“Evaluate/Modify”选项。激 活“Evaluate/Modify”对 话 框 后,可 在“Expression”框中输入任何合法的ObjectPascal表达式,但该表达式不能包含任
46、何函数调用。所查看的变量必须在当前断点的作用域内。单击“Evaluate”按钮,表达式的值显示在“Result”域中。在Newvalue栏中,输入新值后,单击“Modify”按钮,即可修改表达式的值。3.53.5程序调试程序调试3显示函数调用当调试带多层嵌套函数,特别是有递归过程的复杂程序时,要准确记住调用哪个过程以获得程序中的特定指针是很困难的。CallStack窗口(如图3-23所示)提供了一个调用过程 列 表,减 轻 了 这 种 负 担。使 用 ViewDebugWindowsCall Stack选项,打开Call Stack窗口。在CallStack窗口上面的项是当前函数,第一个函数下
47、面的项是调用第一个函数,依次类推。在CallStack窗口中既显示函数名,又显示传递给它们的参数,这样就不需要在WatchList窗口或Evaluate/Modify对话框中建立这些变量。在CallStack窗口中查看函数的调用,可使用以下几种方法:(1)双击CallStack窗口中的函数,光标会自动停在CodeEditor中该函数的最后一行上。(2)选择快捷菜单中的ViewSource或EditSource选项。(3)使用Ctrl+I键。3.53.5程序调试程序调试3.5.5 其他调试工具其他调试工具Delphi的内置调试器虽然功能很强大,但并不能胜任所有的任务,同时由于内置调试器在执行中引
48、起程序环境的细微变化,所以可能影响错误的发生方式。为此,需要其他的调试工具来完成调试任务。1Turbo DebuggerTurboDebugger是Borland公司推出的第三代语言调试器,在字符模式下执行。TurboDebugger的操作大部分与内置调试器相同或类似。利用FileOpen菜单装入要调试的文件就可以开始一个调试过程。利用TurboDebugger必须把调试符号信息储存在可执行文件中。3.53.5程序调试程序调试2WinSightWindows程序通过一系列的对象发送和接收消息来实现功能。WinSight32是一个用于查看Windows对象并跟踪消息发送和接收的调试工具,它的图标
49、可以在Delphi程序组中找到。WinSight32界面分为两部分,上面为对象树窗口,下面为消息跟踪窗口。3BrowserBrowser是Delphi内置的又一调试工具,可以帮助查找与程序相关联的大量细节,如直观地查看对象层次关系,列出所有符号的声明和程序涉及的代码单元等等。这样就使用户不必去阅读源代码就能了解和掌握程序的大致内容和结构。选择View菜单下的Browser命令就可以打开该窗口。3.53.5程序调试程序调试4WinSpectorWinSpector是 一 个 用 于 帮 助 跟 踪 UnrecoverableApplicationErrors(UAE)和 GeneralProte
50、ctionFault(GPF)错误保护的工具。当发生其中一个错误时,WinSpector被激活并请求输入解释环境问题的说明,然后记录所有信息并使自己极小化,为查阅WinSpector记录,用户可切换到WinSpector窗口并单击ViewLog按钮,此时屏幕将会显示文本文件WinSpector.log,用户可查看错误信息。为 了 加 载 WinSpector,可 以 双 击 Delphi 7组 的WinSpector图标,WinSpector会马上运行同时立即极小化,因此用户看不到它。习题习题1在Delphi中新建一个工程,编译运行后,保存工程中的文件。2什么是类?什么是对象?什么是方法?三者