1、Delphi编程入门讲解,Delphi历史 Delphi特性 Delphi 7开发环境介绍 面向对象程序设计(OOP) Object Pascal基本语法,Delphi发展历史,1995年 delphi1发布 1996年 delphi 2发布 1999年 delphi5发布 2002年 delphi7发布 2007年 delphi2007发布 2010年 delphi2010发布,Delphi特性,快速开发工具 最好的C/S程序开发工具 支持各种程序的开发 Win32原生程序,快速开发工具delphi语法:Object Pascal,是一种面向对象的计算机语言, 程序语法严谨,易学易用。VCL
2、库:提供丰富的可视化组件库,程序人员可根据需要直接进行调用。IDE开发环境:集编码、设计、调试如一身,大大方便了程序的开发调试。,最好的C/S程序开发工具支持所有的常用数据库可开发两层结构、三层结构的管理软件非常棒的VCL控件支持开发的程序易于发布,支持各种程序的开发数据库应用程序的开发网络应用软件的开发游戏软件的开发其它应用软件,Delphi7开发环境介绍,文件类型,pas:单元文件,dfm:窗体文件,dpr:项目文件,dpl:压缩库文件,dpk:包文件,res:资源文件,dcu:编译文件,定制工具栏ViewToolbarsCustomize,常用工具按钮介绍,定制代码编辑器ToolsEdi
3、tor Properties,保存定制开发环境ViewDesktopSave Desktop,项目目录设置ProjectOptions,组件库路径设置ToolsEnvironment Options,从当前工程已有基类继承,断点设置与调试,常用快捷键F3:继续查找F4:运行程序至光标处F5:设置断点F7:跟踪调试F8:单步调试F9:运行程序F11:在Form/Unit和Object Inspector(对象查看器)之间切换F12:在Form和Unit之间切换Ctrl+F9:编译Ctrl+Alt+F11:弹出Project Options(工程管理器)Ctrl+Shift+上/下方向键:在过程的
4、声明和实现间切换Ctrl+J:插入标准语法代码Ctrl+Shift+U,Ctrl+Shift+I:将所选择的代码整体右移或者左移Ctrl+Shift+C:完成已声明类的实现Shift+Alt+F11:对象树状视图,Object Pascal基本语法,运算符 常量和变量 过程和函数 数据类型 程序流程控制 单元的组织结构,一、运算符1、赋值运算符,2、比较运算符,3、逻辑运算符,4、算术运算符,5、按位运算符,6、其他运算对象类型的转化:a、使用is进行类型兼容性判断,然后用as转化,b、使用Tobject.InheritsFrom代替is运算符,二、常量与变量1、声明常量:const变量:va
5、r2、有类型常量和无类型常量consti = 5;ErrMsg = 被除不能为0;s: String=123456;,3、全局变量和局部变量注:全局变量可指定初始值,但局部变量不可以,三、过程与函数区别:函数,有返回值;过程,无返回值。声明:函数,function;过程,procedure。原则:先声明,后使用。,参数值传递与参数地址传递参数值传递:procedure ChangeMsg(s: String);参数地址传递:procedure ChangeMsg(var s: String);,procedure TForm1.btn1Click(Sender: TObject); varSt
6、r: string; beginStr := StrVar;ChangeMsg1(Str);ShowMessage(Str); /StrVarChangeMsg2(Str);ShowMessage(Str); /StrVarisChanged end;procedure TForm1.ChangeMsg1(s: String); begins := s+isChanged; end;procedure TForm1.ChangeMsg2(var s: String); begins := s+isChanged; end;,OUT参数输出参数,它传递的也是一个引用。然而,对于OUT参数,将其传
7、递到过程/函数中时,初始量会被丢弃。,procedure TForm1.btn1Click(Sender: TObject); varStr: string; beginStr := Message;ChangeMsg3(Str);ShowMessage(Str); /Changed end;procedure TForm1.ChangeMsg3(out s: String); beginShowMessage(s); /显示空字符串s := Changed; end;,四、数据类型常用类型: 复杂类型:整数(integer) 集合(Set)实数(Real) 数组(Array)布尔(Boole
8、an) 记录(Record)字符(串)(Char,String) 文件(File)枚举(Enumerated) 类(Class)子界(Subrange) 接口(Interface)可变类型(Variant),枚举数据类型 1、定义,2、枚举数据类型特点枚举元素只能是标识符type days=(sun,mon,tue,wed,thu,fri,sat); colors=(red,yellow,blue,white,black,green);varWeek: days; FormColor: colors; type colortype=(red,yellow,blue,white); number
9、s=(1,3,5,7,9);,枚举类型属于顺序类型根据定义类型时各枚举元素的排列顺序确定它们的序号,且序号从0开始。例如:type days=(sun,mon,tue,wed,thu,fri,sat);则: ord(sun)=0,ord(mon)=1,,以此类推。枚举类型中的第一个元素无前趋,最后一个元素无后继。 pred(sat)=fri; succ(sun)=mon; ord(sat)=6;,同一个枚举元素不能出现在两个或两个以上的枚举类型定义中type color1=(red,yellow,white); color2=(blue,red,black);,枚举类型变量只能进行赋值运算和关
10、系运算,不能进行算术运算和逻辑运算。在枚举元素比较时,实际上是对其序号的比较。例如: type days=(sun,mon,tue,wed,thu,fri,sat); colors=(red,yellow,blue,white,black,green); var color:colors; weekday:days; 则下面语句是合法的: weekday:=mon; if weekday=sun then ShowMessage();,3、枚举数据类型的应用,子界数据类型介绍 1、定义及定义规则type 子界类型标识符=常量1常量2 常量1称为子界的下界,常量2称为子界的上界; 下界和上界必须
11、是同一顺序类型(该类型称为子界类型的基类型),且上界的序号必须大于下界的序号。 如: type age=1100; letter=a z; 可以直接在变量说明中定义子界类型。 如:type letter=a z ; var ch1,ch2:letter;,var ch1,ch2:az;,2、子界类型数据的运算规则凡可使用基类型的运算规则同样适用该类型的子界类型。基类型相同的不同子界类型数据可以进行混合运算。varliInt1: 110;liInt2: 1020;liInt3: Integer;beginliInt1 := 5;liInt2 := 11;liInt3 := liInt1+liin
12、t2;ShowMessage(IntToStr(liInt3);end;,集合数据类型介绍 1、定义type集合类型名称 = Set of 基类型;基类型可以为:字符型、布尔型、枚举型和子界型。 例:typenumbers = set of 09;ch = set of char;varn: numbers;c: ch;d: set of (sun,mon,tue,wed,thu,fri,sat); 注:集合的元素个数不超过256个,因此 var s:set of integer; 是错误的。,2、集合的值a、 集合的值放在一对方括号中,中间各元素之间用逗号隔开 。如:1,2,5 和 a,e,
13、i 都是集合。b、 为空集。c、在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:1,2,3,4,5, 10,15可以表示成: 15,10,15d、集合的值与方括号内元素出现的次序无关。例如1,5,8 和5,1,8的值相等。e、在集合中同一元素的重复出现对集合的值没有影响。例如,1,8,5,1,8与1,5,8的值相等。f、每个元素可用基类型所允许的表达式来表示。如1,1+2、succ(ch)。,3、集合的运算集合类型变量不能进行算术运算;集合是无序的,不能使用ord、pred、succ等函数。a、赋值运算var liInt: set of 09;liInt := 0;b、集合的
14、并、交、差运算varA: Set of X,Y,Z;B: Set of X;并:A+B为X,Y,Z交:A*B为X差:A-B为Y,Z,c、集合的关系运算关系运算符:相等“=”、不等“”、包含“=”、被包含“B,A FalseA,B=B,A TrueA,B=B TrueA=A,B FalseA=A,B TrueA in A,B True,4、集合的应用 VarLanguage: set of (English,German,France); procedure TForm1.chkEnglishClick(Sender: TObject); beginif (Sender as TCheckBox
15、).Checked thenLanguage := Language + EnglishelseLanguage := Language - English; end; procedure TForm1.btn1Click(Sender: TObject); beginif English = Language thenShowMessage(English被选中); end;,数组数据类型介绍 1、静态数组定义一维: 数组名:array下标类型 of 元素类型 二维: 数组名:array下标类型1, 下标类型2 of 元素类型2、动态数组定义 一维: 数组名:array of 元素类型 二维
16、: 数组名:array of array of 元素类型 注:动态数组定义后需分配内存空间SetLength(动态数组名,数组长度,数组长度),3、数组应用 constMyArray: array 02 of string = (English,German,France); vari: Integer; beginfor i:=Low(MyArray) to High(MyArray) doShowMessage(MyArrayi); end;,varMyArray: array of array of Integer;i,j: Integer; beginSetLength(MyArray
17、,2,2);for i:=Low(MyArray) to High(Myarray) dobeginfor j:=Low(MyArray) to High(MyArray) dobeginMyArrayi,j := Random(10);end;end; end;,记录数据类型介绍 1、定义type 类型标识符=record 变量标识符1:类型; 变量标识符2:类型; : : : : 变量标识符n:类型; end;,2、记录类型应用 typeStudents = recordname: String20;age: 630;case className: Char of /变体记录,共享内存A:
18、(English: Real);B:(Math:Real);end; varStu1,Stu2: Students; beginStu1.name := 张三;Stu1.age := 13;Stu1.className := A;Stu1.English := 88.2;ShowMessage(FloatToStr(Stu1.Math); /88.2 end;,五、程序流程控制条件语句:,循环语句:,控制语句:Break:跳出当前循环。Continue:结束本次循环,执行下一次循环。Exit:退出当前代码块,如果当前代码块是主程序,则程序终止,如果程序块是被调用的模块,则跳到上一层程序继续执行
19、。Halt:强制终止程序,返回操作系统。Abort:中止程序运行,保留主程序。Goto:跳转。,六、单元的组织结构dpr(项目文件) 唯一pas(单元文件)工程项目dfm(窗体文件)其它文件(如res(资源文件),一个,不一定,项目文件(program)组织结构,单元文件(Unit)组织结构,单元的循环引用循环引用的意思是:A引用了B,而B又引用了A,且都是在interface部分进行引用。如下面的单元则通不过编译:unit Unit1; unit Unit2;interface interfaceuses usesUnit2; Unit1; 至于有一个引用放置在implementation部
20、分,面向对象程序设计(OOP),类的概念:指某一类事物共同特征的抽象描述。类使用属性和方法来描述某一事物的具体特征和行为。 对象的概念:即类的实例化。 面向对象编程的表现形式:封装继承多态,封装代码模块化指利用类将数据和方法封装起来,从而实现功能的隐匿,即控制功能的可见性。1、访问控制符私有成员访问符(private)受保护成员访问符(protected)公有成员访问符(public)发布的成员访问符(published)自动的成员访问符(automated)/不再使用,向后兼容保留,2、封装方式a、逻辑封装对类进行操作,将业务的功能和行为以类的形式呈现。b、物理封装表现形式:如动态链接库(D
21、LL)。,继承代码重用继承就是根据已有的类创建一个新类的过程。继承的类称为子类,被继承的类称基类。子类的功能就是完善与扩展基类。子类可以继承基类的变量、属性和方法。1、属性的继承属性通过继承不但可以增加可见性,还可以对其功能进行扩展。,2、方法的继承,方法,静态方法:默认类型,虚方法(virtual),动态方法(dynamic),抽象方法(abstract):基类无需实现,子类必须实现。,当代码被编译时,编译器会给静态方法一个地址;子类继承时,只是将基类方法的地址赋给了子类。,代码运行时通过动态查找VMT/DMT来指定地址。,unit Unit1; interface usesWindows,
22、 Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)edt1: TEdit;btn1: TButton;procedure btn1Click(Sender: TObject);private Private declarations public Public declarations end;,typeTMyBaseClass = classpublicprocedure BaseSetEdt;end;typeTMyChild
23、Class = class(TMyBaseClass)publicprocedure ChildSetEdt;end;varForm1: TForm1;,implementation$R *.dfm TMyBaseClass procedure TMyBaseClass.BaseSetEdt; beginForm1.edt1.Text := Form1.edt1.Text + 基类; end; TMyChildClass procedure TMyChildClass.ChildSetEdt; beginForm1.edt1.Text := Form1.edt1.Text + 子类; end;
24、, TForm1 procedure TForm1.btn1Click(Sender: TObject); varMyChildClass: TMyChildClass; beginMyChildClass := TMyChildClass.Create;MyChildClass.BaseSetEdt;MyChildClass.ChildSetEdt; end;end.,多态接口重用多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的
25、指针赋值给父类类型的指针。覆盖(override)和虚方法是多态的主要表现形式。注意:重载(overload)只是一种语言特性,与多态无关,与面向对象无关!,重载(overload):1、方法名一定相同。2、参数个数、参数类型及参数顺序不同。3、在Delphi中,返回值不同,不能区分两个重载的方法。例:function ShowMsg(psStr: String;piInt: integer): String;overload;function ShowMsg(piInt: integer;psStr: String): String;overload;function ShowMsg(piI
26、nt: Integer): String;overload;procedure ShowMsg(piInt: Integer);overload;function ShowMsg(piInt: integer): Integer;overload;,unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,ExtCtrls, StdCtrls;typeTMyPanel = class(TPanel)publicprocedure SetCol
27、or;virtual;abstract;end;,typeTForm1 = class(TForm)btn1: TButton;procedure btn1Click(Sender: TObject);privatepublicprocedure CreatePanel(poPanel: TMyPanel;piWidth,piHeight,piTop,piLeft: Integer;psCaption: String);end;typeTMyPanelA = class(TMyPanel)publicprocedure SetColor;override;end;,typeTMyPanelB
28、= class(TMyPanel)publicprocedure SetColor;override;end;varForm1: TForm1;implementation$R *.dfm, TMyPanel procedure TMyPanel.SetColor; beginSelf.Color := clGreen; end; TMyPanelA procedure TMyPanelA.SetColor; begin/inherited;Self.Color := clRed; end; TMyPanelB procedure TMyPanelB.SetColor; begin/inher
29、ited;Self.Color := clBlue; end;, TForm1 procedure TForm1.CreatePanel(poPanel: TMyPanel; piWidth, piHeight, piTop,piLeft: Integer; psCaption: String); beginwith poPanel dobeginCaption := psCaption;Left := piLeft;Top := piTop;Width := piWidth;Height := piHeight;Parent := Self;SetColor;end; end;,proced
30、ure TForm1.btn1Click(Sender: TObject); varloMyPanel: TMyPanel;loPanelA: TMyPanelA;loPanelB: TMyPanelB; beginloMyPanel := TMyPanel.Create(Self);CreatePanel(loMyPanel,100,100,50,20,基类Panel); loPanelA := TMyPanelA.Create(Self);CreatePanel(loPanelA,100,100,50,130,PanelA);loPanelB := TMyPanelB.Create(Sel
31、f);CreatePanel(loPanelB,100,100,50,240,PanelB); end;end.,VCL可视化组件库,VCL是可视化组件库(Visual Component Library)的简称;它是一个庞大的类、组件库,Delphi和C+Builder使用的组件库都是VCL。类似于C+的MFC。VCL架构VCL采用单根架构(Single-rooted Hierarchy),即所有类的祖先都是Tobject,且每次只能从一个类派生子类(即单继承而非多继承)。JAVA也采用单根架构,而C+不是。,使用VCL1、静态方式设计时加入组件进行属性和事件设计。2、动态方式用代码创建类的
32、实例(对象),然后使用它提供的功能,最后销毁它。,扩展VCL自定义组件当现有的类和组件无法满足我们的需要时,可以从VCL的现有类和组件上派生新的子类和子组件。,结构化查询语言 SQL(Structured Query Language),SQL语言组成: 数据定义语言(DDL)例如:CREATE、DROP、ALTER等语句。 数据操作语言(DML)例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。 数据查询语言(DQL)例如:SELECT语句。 数据控制语言(DCL)例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句,数据查询语言(DQL) SELE
33、CTALL|DISTINCT|DISTINCTROW|TOP *|talbe.*|table.field1AS alias1,table.field2AS alias2, FROM tableexpression,IN externaldatabase WHERE GROUP BY HAVING ORDER BY WITH OWNERACCESS OPTION,SELECT Customer,SUM(OrderPrice) as AllOrderPrice FROM Orders GROUP BY Customer order by SUM(OrderPrice) Desc,select b.
34、deptName as 部门,sum(case when a.mon=一月份 then a.yj else 0 end) as 一月份,sum(case when a.mon=二月份 then a.yj else 0 end) as 二月份,sum(case when a.mon=三月份 then a.yj else 0 end) as 三月份,sum(case when a.mon=四月份 then a.yj else 0 end) as 四月份,sum(case when a.mon=五月份 then a.yj else 0 end) as 五月份,sum(case when a.mon=
35、六月份 then a.yj else 0 end) as 六月份,sum(case when a.mon=七月份 then a.yj else 0 end) as 七月份,sum(a.yj) as 年销售额 from yjtable a join dept b on a.DeptId=b.DeptId group by b.deptname order by sum(a.yj) desc,数据操作语言(DML) INSERT INTO 表名称 (列1, 列2,.) VALUES (值1, 值2,) UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 DELETE FROM 表名称 WHERE 列名称 = 值INSERT INTO Orders VALUES (8,2011-04-25,5000.01,zheng) INSERT INTO Orders VALUES (8,2011-04-25,5000.01,zheng),truncate table 表名称不记录日志,不可回滚,执行速度快。 delete from 表名称记录日志,可回滚,相对来说比较慢。,附:http:/http:/