delphi完美经典--第七、八章

第七章 Object Pascal面向对象设计

一、Delphi的类分两种:①继承delphi内建类的class类②完全自定义的object类

1、继承自delphi内建类的class类

语法:

type

类名 = class(父类)

        类成员

end;

特点:①此种方法定义的类都是TObject类的子类。②类名是指针。导致无法定义一个类对象,定义的是类对象的指针,定义时并不调用类的构造函数。使用指针前必须先给指针赋值,同样的,使用定义的类对象指针前,必须先调用该类的create构造函数。有疑惑的可以试试sizeof(类名或类定义的变量名),xp+delphi7环境永远返回4。

构造和析构:create构造。对于析构,不要直接调用destroy,它只是删除对象的指针而并没有删除对象实体,在程序完全终止前,对象实体的内存空间将一直被占用。用free来代替destroy,不仅可删除对象指针,也可删除对象实体。

2、完全自定义的Object类

语法:

type

  类名 = object(父类)

    类成员

end;

特点:这种类型的类定义对象时,同C++中的类对象,不再是指针。sizeof返回类的大小,而非类指针的大小。

构造和析构:不需构造函数。对于析构,和record一样,当该对象离开其作用域时,自动释放占用的空间。

二、类成员的封装等级

private:仅可在该类声明所在的单元内使用。虽然父类的private成员可被子类继承,但子类不可访问它们。

protected:子类可访问。所以可在该类声明所在的单元和子类声明所在的单元使用,其他地方不可用。

public:类和子类的对象都可用。

published:其可见度同public一样,区别是delphi的对象监视器可直接显示本区域的成员,而此差别来自RTTI这个机制。

antomated:使用自动化服务器时,此保留字有用。

对开头不加保留字的类成员,其可见性参照前一个成员;若类中第一个成员不加保留字时,若该类本身或其父类是在使用“{$M+}”编译指令的情况下,则第一个成员默认为published成员,否则为public成员。

更改成员变量的封装等级:重新声明该成员就可更改父类成员变量在子类中的封装等级。但最好扩大其可见度而不要缩小其可见度。

三、类成员的定义与实现

    类成员包括字段、方法和属性。属性与字段的区别,属性有些可读取或修改其内部数据的方法有关联。声明时,若某个字段是属性,则必须在属性名称前加保留字“property”,且需写出关联方法。如:property Max : Integer read FMax wirte SetMax default 100;可无默认值。

子类成员的存在方式:子类仅复制父类的字段、属性和方法的声明部分,对于父类的方法定义与实现部分,则保持父类原有的一份,因此,当子类的对象实体要使用由父类继承来的方法时,是根据所调用的成员函数名,去唤起父类的成员函数的实现部分。

成员函数介绍:

         override、hide、overload:本质问题还是定义规则和使用规则(使用规则又分为适用条件和使用方法)。

1、override的定义规则:祖先类的virtual或dynamic方法才可被子类重写。祖先类的virtual和子类的override仅在声明时加,实现里不加。被重写的方法的声明(方法名、参数、返回值)必须完全与祖先类一样。

override的使用规则:导致动态绑定。

纯虚函数的定义规则:成员函数声明后加“virtual;abstract;”或“dynamic;abstract;”,且没有函数的实现部分。子类中必须override所有纯虚函数。

2、hide的定义规则:子类中有与父类函数名相同的函数,且该函数没有加overload。

hide的使用规则:导致不能使用动态绑定。即父类指针指向子类对象时,不能调用子类中与父类同名的方法。

3、overload的定义规则:同一个类中函数名相同参数不同的函数可构成重载。函数声明后加overload保留字,实现区不加overload。

4、静态绑定和动态绑定:静态绑定指在编译期间,就确定了函数调用的相应代码。动态绑定指在程序运行期间,据对象的实际类型调用相应的方法。

类中不加任何修饰符的成员函数,称之为静态方法。如:procedure Draw;编译期间,已绑定到它的实现方法。

对virtual成员函数,且子类override了此函数,即表示这个成员函数在编译时,会使用动态绑定的方式。

四、self、as、is、Sender、parent、owner、inherited介绍

1、self同this。可视为该对象的别名。

2、as:可将当前类或子孙类的对象强制转换为它本身或它的祖先类,然后调用祖先类的类成员。语法:object as class若object是class类的祖先类或无继承关系的类,则会引发编译时异常或运行时异常。运行时异常如图:说下这个图的由来:form上放置一个button和一个edit。在button的click事件中输入:ShowMessage((Sender as TButton).Caption);执行成功。然后将edit控件的click事件设置为button的click事件,则点击edit控件时就会触发此异常。

3、is:用来判断左方操作数这个对象实体,是否属于右方操作数那种类。语法:object is class;返回值为boolean型。Object对象是右方的class类或它的子类时,返回true;是其祖先类时,返回false。若无继承关系,编译错误。

as和is都遵循一个规则:男人是人,人不一定是男人。子类对象is/as父类。

4、sender:delphi中多个控件可共享同一个方法。比如button1、button2、button3的click事件都共用button1的click。其click方法的sender参数用来指明当前点击的是哪个button。简而言之,sender就是用来指出响应此事件的控件的句柄。

5、parent:读写属性。一个组件的parent,是指拥有该组件的父类。组件的parent必定是一个窗口控制组件,通常组件有parent这个属性,此属性用来设定父窗口。

组件的父类析构后,无法在画面上看到该组件的外观,并不表示它已经析构了。若当时组件的parent和owner是同一个组件,它才会被析构。

6、owner:只读。当owner析构时,它包含的组件也一块被析构。一个form上的所有控件其owner都是该form。

停靠:要让某个窗口具有可停靠属性,设置其DockSite = True;设置某控件具有停靠属性:设置其DragKind = dkDock; DragMode = dmAutomatic;然后就可以拖动该控件到设定了具有可停靠属性的窗口。

7、inherited:用在方法的实现区里,当设定子类的某个方法的实现内容时,若它只比父类的方法多些代码,这种情况,只需写inherited+父类的成员函数的标识符。相当于把父类的代码引入到子类中,可以少写不少代码。对引入父类的构造函数:首先,必须引入到子类的构造函数中;其次,只用写inherited;就行了。

五、静态成员函数

Delphi的成员函数在其他程序中相当于静态方法。像在C++、java都是在成员函数前加static。在C++、java中的static可用于成员变量和成员函数,是将该成员定义为类成员,而不是实体的成员。即static是用来定义类变量或类方法;反之,若不加static,则是定义实体变量或实体方法。Delphi不支持静态数据成员。

定义类方法时,需在方法名前加“class”,注意声明和实现部分都要加。对类方法,虽有self关键字,却无法访问成员变量、属性及一般方法,可访问类方法和构造函数。所有代码共享一开始就设置好的“类方法”。而对象方法,存在于此类的对象实体,每个对象实体都有自己的对象方法,且指向共享程序区段的对象方法,且可用self指出由哪个对象调用。

仿真静态数据成员:虽delphi不支持静态成员,但可用模拟方法做到这点。利用编译指令来实现。{$J+}之后以const关键字定义的常量是可被修改的,在{$J-}之后以const关键字定义的常量是不可被修改的。

下面是将number类方法当做静态数据成员来用。

TStaticMethod = class
  class function Number(const nval : integer=0; const ischange : boolean=false):integer;
end;

class function TStaticMethod.Number(const nval : integer; const ischange : boolean):integer;
const
  {$J+}data : integer = 0; {$J-}	
begin
  if (ischange)  then
    data := nval;
  result := data;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TStaticMethod.Number(100, true);
  ShowMessage(inttostr(TStaticMethod.Number));//若不用{J+}和{J-},则弹出0。
end;



第八章 异常处理

         比如说一个学校,有自己的运转规则,有自己的校规,对于触犯了规则的学生或老师,就会受到相应的规则处理。校规有很多条,触犯其中任何一条都会受到惩罚。随着社会发展,校规自然也会加入些新的规则。

异常处理就是预见程序可能发生异常的情况,并加以处理,避免程序因未处理异常而终止。异常就相当于触犯了规则的学生或老师,而异常处理就是教务处据校规作出的处罚。

         一、异常的分类

如同校规有既有校规和新加校规一样,异常也分为delphi内建的异常类和自定义的异常类。在此,罗列下既有校规。

1、delphi内建的异常类:都继承自Exception类,都定义与“SysUtils”这个文件中,内建的异常类都以“E”开头。

         Delphi提供的内建的异常类:

2、自定义异常类

异常类和一般类的自定义有个区别:它必须继承内建类Exception或某个子类。

二、触发异常的方法

触发异常不就是触犯校规吗。触发异常的方式,有两种:程序自动触发和自行触发。无论哪种方式触发异常,都需异常处理。

自行触发是利用raise指令触发。语法:raise异常对象实体;注意raise指令必须用于try…except或try…finally区。

三、异常处理情况

教务处对犯错的学生或老师就行处理就是异常处理。学校的处罚按照严重性可分为两种,开除和不开除。异常处理也分为两种:try…except…end和try…finally…end。

1、try…finally…end:先执行try…finally块,当有异常发生时跳出此块执行finally…end块,之后自动捕获被触发的异常,并将信息显示出来。无异常发生,顺序执行直到结束。

2、try…except…end:try…except块没有异常发生时,不执行except…end块;有异常发生时,直接跳到except…end块开始执行。except…end块用来对异常进行处理。

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 : 第0章 认识Delphi 0-1 前言 0-2 Delphi简介 0-3 进入Delphi7 0-4 退出Delphi 第1章 常用的窗口工具 1-1 窗体(Form) 1-2 代码编辑器(Code Editor) 1-3 代码浏览器(Code Explorer) 1-4 组件面板(Componet Palette) 1-5 对象检视器(Object Inspector) 1-6 快捷工具栏(Speed Menu) 1-7 项目管理器(Project Manager) 1-8 桌面工具栏(Desktops Tollbar) 1-9 图像编辑器(Image Editor) 1-10 对象浏览器(Object TreeView) 1-11 关联选项卡(Digram Page) 第2章 常用的菜单 2-1 File菜单 2-2 Edit菜单 2-3 Search菜单 2-4 View菜单 2-5 Project菜单 2-6 Run菜单 2-7 Tools菜单 2-8 Windows菜单 第3章 集成开发环境的改变 3-1 Delphi集成开民环境介绍 3-2 操作菜单方面的改进 3-2-1 外面方面的改变 3-2-2 内容方面的改变 3-3 对象检视器方面的改进 3-4 组件面板的改进 3-5 代码编辑器的改进 3-6 设计陈列室的改进 3-7 编译信息的显示 3-8 调试器方面的改进 3-8-1 Watch List改进 3-8-2 Debugger选项的改进 3-8-3 Run Parameters对话框的改进 第4章 Delphi Object Pascal的初步印象 4-1 面向对象程序概论 4-1-1 类 4-1-2 对象 4-1-3 继承 4-1-4 封装 4-1-5 信息 4-2 Delphi项目结构及窗体的建立 4-2-1 GUI模式的项目 4-2-2 Console模式的项目 4-3 Object Pascal程序结构 4-3-1 项目程序(Program)的结构 4-3-2 单元程序(Unit)的结构 4-4 如何完成一个简单的窗体程序 第5章 简单的常用指令介绍 5-1 TLabel类对象 5-1-1 Caption属性 5-2 TButton类对象 5-2-1 Caption属笥 5-2-2 OnClick事件 5-3 TEdit类对象 5-4 TCanvas类对象 5-5 Showmessage函数 5-6 InputBox函数 5-7 MessageDlg函灵敏 第6章 Delphi与Object Pascal程序的基本概念 6-1 Object Pascal Program程序结构与Delphi项目结构的关系 6-1-1 标头(Heading) 6-1-2 Uses子句 6-1-3 编译指令(Compiler directive) 6-1-4 源代码区(begin end) 6-2 Unit程序结构与窗体的关系 6-2-1 Unit代码结构 6-2-2 语句(Statement) 6-2-3 Unit间Use的状况 6-3 数据类型与定义变量 6-3-1 数据类型概论 6-3-2 不需要使用type声明的数据类型 6-3-3 必须使用type声明的数据类型 6-3-4 定义变量 6-3-5 变量的作用域 6-3-6 定义常量 6-3-7 变量的类型转换(Typecast) 6-4 Object Pascal的运算符(Operator) 6-4-1 设置运算符(assign Operator) 6-4-2 算数运算符(Arithmetic Operator) 6-4-3 关系运算符(Relational Operator) 6-4-4 布尔运算符 6-4-5 集合运算符 6-4-6 字符串运算符 6-4-7 位逻辑运算符 6-4-8 运算符优先级 6-5 流程控制 6-5-1 语句的基本概念 6-5-2 表达式语句(Expression-Statement) 6-5-3 流程控制语句 6-5-4 可视化程序与嵌套程序 6-6 数组与指针 6-6-1 数组类型 6-6-2 指针类型 6-6-3 浅谈指针与数据结构 6-7 程序与函数(Procedures and Functions) 6-7-1 函数的意义与优点 6-7-2 函数的分类与效用 6-7-3 自定义函数使用方法概述 6-7-4 函数的声明、定义及其实现 6-7-5 参数传递方式 6-7-6 声明修饰字 6-7-7 常用的内建函数 第7章 Object Pascal面向对象设计 7-1 类和对象 7-1-1 类(Class)与对象(Object)的基本概念 7-1-2 对象的构造与类的关系 7-2 类的声明与对象的定义 7-2-1 类的声明与对象的实现 7-2-2 对象的构造与析构 7-3 类成员的封装等级与可见度 7-3-1 封装的意义 7-3-2 Object Pascal类成员的封装等级 7-3-3 以实例说明类成员封装等级的可见度 7-3-4 开头不加保留字的类成员 7-3-5 成员封装等级的变更法则 7-4 类成员的定义与实现 7-4-1 字段(Field)与对象引用(Object Reference)的实现 7-4-2 方法(Method) 7-4-3 属性(Property) 7-5 类的继承 7-5-1 继承的意义与优点 7-5-2 子类成员的存在方式 7-6 成员函数的Override及 Overload 7-6-1 Override 适用的情况——Virtual与 Dynamic的成员函数 7-6-2 Override成员函数的定义语法 7-6-3 Virtual成员函数与动态绑定(Dynamic Binding) 7-6-4 覆盖(Overriding)与隐藏(Hiding)的差别 7-6-5 Override与OVerload的差别 7-7 Abstract成员函数与多态(Polymorphic) 7-7-1 一般纯虚函数的多态实现概念 7-7-2 纯虚函数的定义语法及实现 7-8 Self、AS、is、Sender、Parent、owner、inerited 7-8-1 Self变量 7-8-2 AS运算符 7-8-3 is运算符 7-8-4 Sender 7-8-5 Parent 7-8-6 owner 7-8-7 inerited保留字 7-9 静态成员方法——Class Methods 第8章 异常处理 8-1 异常处理存在的目的 8-2 Object Pascal异常的种类 8-2-1 Delphi内建的异常类 8-2-2 自定义异常类 8-3 触发异常的方法 8-3-1 由程序系统自动触发 8-3-2 使用Raise指令触发 8-4 处理异常情况 8-4-1 try…finally…end语法说明 8-4-2 ty…except…end语法说明 第9章 Delphi用户接口设计详述 9-1 基本概念 9-2 TForm的属性 9-2-1 由TComponent继承而来的属性 9-2-2 由TControl继承而来的属性 9-2-3 由TWinControl继承而来的属性 9-2-4 由TScrollingWindControl继承而来的属性 9-2-5 由TCustomForm继承而来的属性 9-3 TForm的方法 9-3-1 由TObject继承而来的属性 9-3-2 由TPersistent继承而来的属性 9-3-3 由TComponent继承而来的属性 9-3-4 由TControl继承而来的属性 9-3-5 由WinControl继承而来的属性 9-3-6 由TScrollingWinControl继承而来的属性 9-3-7 由TCustomForm继承而来的属性 9-3-8 由TForm继承而来的属性 9-4 TForm的事件 9-4-1 由TControl继承而来的属性 9-4-2 由TWinControl继承而来的属性 9-4-3 由TCustomForm继承而来的属性 9-5 TLabel的类成员 9-5-1 TLabel的属性 9-5-2 TLabel的方法 第10章 标准组件介绍及实作范例 10-1 Frames组件 10-2 MainMenu组件 10-3 PopuMenu组件 10-4 Label组件 10-5 Edit组件 10-6 Memo组件 10-7 Button组件 10-8 CheckBox组件 10-9 RadioButton组件 10-10 ListBox组件 10-11 ComboBox组件 10-12 ScrollBar组件 10-13 GroupBox组件 10-14 RadioGroup组件 10-15 Panel组件 10-16 ActionList组件 第11章 TApplication与TScreen类介绍及应用 11-1 TApplication类 11-1-1 TApplication类对象常用的属性 11-1-2 TApplication类对象常用的方法 11-2 TScreen类 第12章 高级组件介绍 12-1 Additional选项卡中的常用组件 12-1-1 TBitBtn组件 12-1-2 TMaskEdit组件 12-1-3 TImage组件 12-1-4 TShape组件 12-2 Win32选项卡中的常用组件 12-2-1 TPageControl组件 12-2-2 TImageList组件 12-2-3 TRichEdit组件 12-2-4 TDateTimePicker组件 12-2-5 TStatusBar组件 12-3 System选项卡中的常用组件 12-3-1 TTimer组件 12-4 Dialogs选项卡中的常用组件 12-4-1 TOpenDialog组件 12-4-2 FTontDialog组件 12-4-3 TColorDialog组件 第13章 封装Delphi7开发的应用程序 13-1 安装Borland的InstallShiled程序 13-2 利用InstallShield封装 Delphi7开发的程序 13-2-1 InstallShield环境界面简介 13-2-2 封装一个简单的Delphi项目 第14章 数据库概念及SQL指令介绍 14-1 数据库基本概念 14-1-1 数据库结构 14-1-2 开放数据库连接协议(ODBC) 14-1-3 SQL Explorer 14-2 结构化查询语言SQL 14-2-1 CREATE语句 14-2-2 ALTER TABLE语句 14-2-3 DROP语句 14-2-4 SELECT语句 14-2-5 INSERT、UPDATE语句 14-2-6 DELETE语句 14-3 SQL指令高级使用 14-3-1 UNION运算 14-3-2 JOIN运算 14-3-3 特殊运算符 14-3-4 子查询(Sub Query) 第15章 Delphi数据库程序基础 15-1 Delphi各种数据库连接设置 15-1-1 建立dBase、Paradox连接 15-1-2 建立Access连接 15-1-3 建立MSSQL连接 15-1-4 建立MySQL连接 15-2 Delphi的Database Desktop使用方法 15-2-1 字段定义 15-2-2 输入数据 15-2-3 设置BDE数据库别名与连接数据库 第16章 Delphi数据库程序设计——使用BDE组件 16-1 TDataSet组件 16-1-1 TDataSet组件常用的属性 16-1-2 TDataSet组件常用的方法 16-1-3 TDataSet组件常用的事件 16-2 TTable组件 16-2-1 TTable组件常用的属性 16-2-2 TTable组件常用的方法 16-3 TQuery组件 16-3-1 TQuery组件常用的属性 16-3-2 TQuery组件常用的方法 16-4 TDataModule组件 16-5 TDatabase组件 16-5-1 TDatabase组件常用的属性 16-5-2 TDatabase组件常用的方法 16-5-3 TDatabase组件常用的事件 16-6 综合范例 16-6-1 员工管理系统——使用TTable组件 16-6-2 员工管理系统——使用TQuery组件 16-6-3 订单管理系统——使用TTable组件 16-6-4 订单系统——使用TQuery组件 第17章 数据程序设计——使用Delphi组件 17-1 TADOConnection组件 17-1-1 TADOConnection组件常用的属性 17-1-2 TADOConnection组件常用的方法 17-1-3 TADOConnection组件常用的事件 17-2 TADOCommand组件 17-2-1 TADOCommand组件常用的属性 17-2-2 TADOCommand组件常用的方法 17-3 TADODataSet组件 17-3-1 TADODataSet组件常用的属性 17-3-2 TADODataSet组件常用的方法 17-3-3 TADODataSet组件常用的事件 17-4 TADOTable组件 17-4-1 TADOTable组件常用的属性 17-4-2 TADOTable组件常用的方法 17-5 TADOQuery组件 17-6 综合范例 17-6-1 客户管理系统——使用TADODataSet组件 17-6-2 客户管理系统——使用TADOTable组件 17-6-3 客户管理系统——使用TADOQuery组件 17-6-4 订单管理系统——使用TADOTable组件 17-6-5 订单系统——使用TADOQuery组件 第18章 数据感知组件 18-1 TDBText组件 18-2 TDBEdit组件 18-3 TDBMemo组件 18-4 TDBImage组件 18-5 TDBListBox组件 18-6 TDBComboBox组件 18-7 TDBLookupListBox与TDBLookupComboBox组件 18-8 TDBNavigator组件 18-9 TDBGrid组件 第19章 设计Delphi数据库报表 19-1 设计报表的基本观念 19-1-1 报表的组成 19-1-2 报表的主体组件——TquickRep 19-1-3 建立第一个报表程序 19-2 QuickReport中可打印出组件 19-2-1 TQR系列组件介绍 19-2-2 TQRDB系列组件介绍 19-3 综合范例 19-3-1 一般表达报表范例 19-3-2 标签式报表范例 19-3-3 主/明细报表范例 19-3-4 一般表达式附图片报表范例 19-3-5 分组式报表范例——打印多色报表 19-3-6 报表输出及输出范例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值