《Delphi编程入门讲解》由会员分享,可在线阅读,更多相关《Delphi编程入门讲解(89页珍藏版)》请在金锄头文库上搜索。
1、Delphi编程入门讲解Delphi历史Delphi特性Delphi7开发环境介绍面向对象程序设计(OOP)ObjectPascal基本语法1Delphi发展历史1995年 delphi1发布1996年 delphi 2发布1999年 delphi5发布2002年 delphi7发布2007年 delphi2007发布2010年 delphi2010发布2Delphi特性快速开发工具最好的C/S程序开发工具支持各种程序的开发Win32原生程序3快速开发工具delphi语法:ObjectPascal,是一种面向对象的计算机语言,程序语法严谨,易学易用。VCL库:提供丰富的可视化组件库,程序人员可
2、根据需要直接进行调用。IDE开发环境:集编码、设计、调试如一身,大大方便了程序的开发调试。4最好的C/S程序开发工具支持所有的常用数据库可开发两层结构、三层结构的管理软件非常棒的VCL控件支持开发的程序易于发布5支持各种程序的开发数据库应用程序的开发网络应用软件的开发游戏软件的开发其它应用软件6Delphi7开发环境介绍文件类型pas:单元文件dfm:窗体文件dpr:项目文件dpl:压缩库文件dpk:包文件res:资源文件dcu:编译文件78定制工具栏ViewToolbarsCustomize9常用工具按钮介绍10定制代码编辑器ToolsEditorProperties11保存定制开发环境Vi
3、ewDesktopSaveDesktop12项目目录设置ProjectOptions13组件库路径设置ToolsEnvironmentOptions14从当前工程已有基类继承15断点设置与调试16常用快捷键F3:继续查找F4:运行程序至光标处F5:设置断点F7:跟踪调试F8:单步调试F9:运行程序F11:在Form/Unit和ObjectInspector(对象查看器)之间切换F12:在Form和Unit之间切换Ctrl+F9:编译Ctrl+Alt+F11:弹出ProjectOptions(工程管理器)Ctrl+Shift+上/下方向键:在过程的声明和实现间切换Ctrl+J:插入标准语法代码C
4、trl+Shift+U,Ctrl+Shift+I:将所选择的代码整体右移或者左移Ctrl+Shift+C:完成已声明类的实现Shift+Alt+F11:对象树状视图17ObjectPascal基本语法运算符常量和变量过程和函数数据类型程序流程控制单元的组织结构18一、运算符1、赋值运算符运算符运算符PascalC/C+Java赋值:=192、比较运算符运算符运算符PascalC/C+Java等于=不等于!=!=小于小于等于=203、逻辑运算符运算符运算符PascalC/C+Java与and&或or|非not!214、算术运算符运算符运算符PascalC/C+Java加+减-乘*除(浮点数)/除
5、(整数)div/取模mod%225、按位运算符运算符运算符PascalC/C+Java与and&取反not或or|异或xor左移shl236、其他运算对象类型的转化:a、使用is进行类型兼容性判断,然后用as转化24b、使用Tobject.InheritsFrom代替is运算符25二、常量与变量1、声明常量:const变量:var2、有类型常量和无类型常量consti=5;ErrMsg=被除不能为0;s:String=123456;263、全局变量和局部变量注:全局变量可指定初始值,但局部变量不可以27三、过程与函数区别:函数,有返回值;过程,无返回值。声明:函数,function;过程,pr
6、ocedure。原则:先声明,后使用。28参数值传递与参数地址传递参数值传递:procedureChangeMsg(s:String);参数地址传递:procedureChangeMsg(vars:String);29procedureTForm1.btn1Click(Sender:TObject);varStr:string;beginStr:=StrVar;ChangeMsg1(Str);ShowMessage(Str);/StrVarChangeMsg2(Str);ShowMessage(Str);/StrVarisChangedend;procedureTForm1.ChangeMsg
7、1(s:String);begins:=s+isChanged;end;procedureTForm1.ChangeMsg2(vars:String);begins:=s+isChanged;end;30OUT参数输出参数,它传递的也是一个引用。然而,对于OUT参数,将其传递到过程/函数中时,初始量会被丢弃。31procedureTForm1.btn1Click(Sender:TObject);varStr:string;beginStr:=Message;ChangeMsg3(Str);ShowMessage(Str);/Changedend;procedureTForm1.ChangeMs
8、g3(outs:String);beginShowMessage(s);/显示空字符串 s:=Changed;end;32四、数据类型常用类型: 复杂类型:整数(integer)集合(Set)实数(Real)数组(Array)布尔(Boolean)记录(Record)字符(串)(Char,String) 文件(File)枚举(Enumerated)类(Class)子界(Subrange)接口(Interface)可变类型(Variant)33枚举数据类型1、定义342、枚举数据类型特点u枚举元素只能是标识符 typedays=(sun,mon,tue,wed,thu,fri,sat);colo
9、rs=(red,yellow,blue,white,black,green);varWeek:days;FormColor:colors;typecolortype=(red,yellow,blue,white);numbers=(1,3,5,7,9);35u枚举类型属于顺序类型根据定义类型时各枚举元素的排列顺序确定它们的序号,且序号从0开始。例如:typedays=(sun,mon,tue,wed,thu,fri,sat);则: ord(sun)=0,ord(mon)=1,,以此类推。枚举类型中的第一个元素无前趋,最后一个元素无后继。 pred(sat)=fri;succ(sun)=mon;
10、ord(sat)=6;36u同一个枚举元素不能出现在两个或两个以上的枚举类型定义中typecolor1=(red,yellow,white); color2=(blue,red,black);37u枚举类型变量只能进行赋值运算和关系运算,不能进行算术运算和逻辑运算。在枚举元素比较时,实际上是对其序号的比较。例如:typedays=(sun,mon,tue,wed,thu,fri,sat);colors=(red,yellow,blue,white,black,green);varcolor:colors;weekday:days;则下面语句是合法的:weekday:=mon;ifweekday
11、=sunthenShowMessage();383、枚举数据类型的应用39子界数据类型介绍1、定义及定义规则type子界类型标识符=常量1.常量2常量1称为子界的下界,常量2称为子界的上界;下界和上界必须是同一顺序类型(该类型称为子界类型的基类型),且上界的序号必须大于下界的序号。如: typeage=1.100;letter=a.z;可以直接在变量说明中定义子界类型。如:typeletter=a.z;varch1,ch2:letter;varch1,ch2:a.z;402、子界类型数据的运算规则 凡可使用基类型的运算规则同样适用该类型的子界类型。 基类型相同的不同子界类型数据可以进行混合运算
12、。varliInt1:1.10;liInt2:10.20;liInt3:Integer;beginliInt1:=5;liInt2:=11;liInt3:=liInt1+liint2;ShowMessage(IntToStr(liInt3);end;41集合数据类型介绍1、定义type集合类型名称 =Setof基类型;基类型可以为:字符型、布尔型、枚举型和子界型。例:typenumbers=setof0.9;ch=setofchar;varn:numbers;c:ch;d:setof(sun,mon,tue,wed,thu,fri,sat);注:集合的元素个数不超过256个,因此 vars:s
13、etofinteger;是错误的。422、集合的值a、 集合的值放在一对方括号中,中间各元素之间用逗号隔开 。如:1,2,5和 a,e,i都是集合。b、为空集。c、在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:1,2,3,4,5,10,15可以表示成: 1.5,10,15d、集合的值与方括号内元素出现的次序无关。例如1,5,8和5,1,8的值相等。e、在集合中同一元素的重复出现对集合的值没有影响。例如,1,8,5,1,8与1,5,8的值相等。f、每个元素可用基类型所允许的表达式来表示。如1,1+2、succ(ch)。433、集合的运算集合类型变量不能进行算术运算;集合是无序
14、的,不能使用ord、pred、succ等函数。a、赋值运算varliInt:setof0.9;liInt:=0;b、集合的并、交、差运算varA:SetofX,Y,Z;B:SetofX;并:A+B为X,Y,Z交:A*B为X差:A-B为Y,Z44c、集合的关系运算关系运算符:相等“=”、不等“”、包含“=”、被包含“=”以及“IN”。例:A,B=B,ATrueA,BB,AFalseA,B=B,ATrueA,B=BTrueA=A,BFalseA=A,BTrueAinA,BTrue454、集合的应用VarLanguage:setof(English,German,France);procedureT
15、Form1.chkEnglishClick(Sender:TObject);beginif(SenderasTCheckBox).CheckedthenLanguage:=Language+EnglishelseLanguage:=Language-English;end;procedureTForm1.btn1Click(Sender:TObject);beginifEnglish=LanguagethenShowMessage(English被选中);end;46数组数据类型介绍1、静态数组定义一维:数组名:array下标类型of元素类型二维:数组名:array下标类型1,下标类型2of元
16、素类型2、动态数组定义一维:数组名:arrayof元素类型二维:数组名:arrayofarrayof元素类型注:动态数组定义后需分配内存空间SetLength(动态数组名,数组长度,数组长度)473、数组应用constMyArray:array0.2ofstring=(English,German,France);vari:Integer;beginfori:=Low(MyArray)toHigh(MyArray)doShowMessage(MyArrayi);end;48varMyArray:arrayofarrayofInteger;i,j:Integer;beginSetLength(M
17、yArray,2,2);fori:=Low(MyArray)toHigh(Myarray)dobeginforj:=Low(MyArray)toHigh(MyArray)dobeginMyArrayi,j:=Random(10);end;end;end;49记录数据类型介绍1、定义type类型标识符=record变量标识符1:类型; 变量标识符2:类型; : : 变量标识符n:类型; end;502、记录类型应用typeStudents=recordname:String20;age:6.30;caseclassName:Charof/变体记录,共享内存A:(English:Real);B:(
18、Math:Real);end;varStu1,Stu2:Students;beginStu1.name:=张三;Stu1.age:=13;Stu1.className:=A;Stu1.English:=88.2;ShowMessage(FloatToStr(Stu1.Math);/88.2end;51五、程序流程控制条件语句:52循环语句:53控制语句:Break:跳出当前循环。Continue:结束本次循环,执行下一次循环。Exit:退出当前代码块,如果当前代码块是主程序,则程序终止,如果程序块是被调用的模块,则跳到上一层程序继续执行。Halt:强制终止程序,返回操作系统。Abort:中止程
19、序运行,保留主程序。Goto:跳转。54六、单元的组织结构dpr(项目文件)唯一pas(单元文件)工程项目dfm(窗体文件)其它文件(如res(资源文件)一个不一定55项目文件(program)组织结构56单元文件(Unit)组织结构5758单元的循环引用循环引用的意思是:A引用了B,而B又引用了A,且都是在interface部分进行引用。如下面的单元则通不过编译:unitUnit1;unitUnit2;interfaceinterfaceusesusesUnit2;Unit1;至于有一个引用放置在implementation部分59面向对象程序设计(OOP)类的概念: 指某一类事物共同特征的
20、抽象描述。类使用属性和方法来描述某一事物的具体特征和行为。对象的概念:即类的实例化。面向对象编程的表现形式: 封装 继承 多态60封装代码模块化指利用类将数据和方法封装起来,从而实现功能的隐匿,即控制功能的可见性。1、访问控制符私有成员访问符(private)受保护成员访问符(protected)公有成员访问符(public)发布的成员访问符(published)自动的成员访问符(automated)/不再使用,向后兼容保留612、封装方式a、逻辑封装对类进行操作,将业务的功能和行为以类的形式呈现。b、物理封装表现形式:如动态链接库(DLL)。62继承代码重用继承就是根据已有的类创建一个新类的
21、过程。继承的类称为子类,被继承的类称基类。子类的功能就是完善与扩展基类。子类可以继承基类的变量、属性和方法。1、属性的继承属性通过继承不但可以增加可见性,还可以对其功能进行扩展。63642、方法的继承方法静态方法:默认类型虚方法(virtual)动态方法(dynamic)抽象方法(abstract):基类无需实现,子类必须实现。当代码被编译时,编译器会给静态方法一个地址;子类继承时,只是将基类方法的地址赋给了子类。代码运行时通过动态查找VMT/DMT来指定地址。65unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes
22、,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)edt1:TEdit;btn1:TButton;procedurebtn1Click(Sender:TObject);privatePrivatedeclarationspublicPublicdeclarationsend;66typeTMyBaseClass=classpublicprocedureBaseSetEdt;end;typeTMyChildClass=class(TMyBaseClass)publicprocedureChildSetEdt;end;
23、varForm1:TForm1;67implementation$R*.dfmTMyBaseClassprocedureTMyBaseClass.BaseSetEdt;beginForm1.edt1.Text:=Form1.edt1.Text+基类;end;TMyChildClassprocedureTMyChildClass.ChildSetEdt;beginForm1.edt1.Text:=Form1.edt1.Text+子类;end;68TForm1procedureTForm1.btn1Click(Sender:TObject);varMyChildClass:TMyChildClas
24、s;beginMyChildClass:=TMyChildClass.Create;MyChildClass.BaseSetEdt;MyChildClass.ChildSetEdt;end;end.69多态接口重用多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。覆盖(override)和虚方法是多态的主要表现形式。注意:重载(overload)只是一种语言特性,与多态无关,与面向对象无关!70重载(over
25、load):1、方法名一定相同。2、参数个数、参数类型及参数顺序不同。3、在Delphi中,返回值不同,不能区分两个重载的方法。例:functionShowMsg(psStr:String;piInt:integer):String;overload;functionShowMsg(piInt:integer;psStr:String):String;overload;functionShowMsg(piInt:Integer):String;overload;procedureShowMsg(piInt:Integer);overload;functionShowMsg(piInt:inte
26、ger):Integer;overload;71unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,StdCtrls;typeTMyPanel=class(TPanel)publicprocedureSetColor;virtual;abstract;end;72typeTForm1=class(TForm)btn1:TButton;procedurebtn1Click(Sender:TObject);privatepublicpro
27、cedureCreatePanel(poPanel:TMyPanel;piWidth,piHeight,piTop,piLeft:Integer;psCaption:String);end;typeTMyPanelA=class(TMyPanel)publicprocedureSetColor;override;end;73typeTMyPanelB=class(TMyPanel)publicprocedureSetColor;override;end;varForm1:TForm1;implementation$R*.dfm74TMyPanelprocedureTMyPanel.SetCol
28、or;beginSelf.Color:=clGreen;end;TMyPanelAprocedureTMyPanelA.SetColor;begin/inherited;Self.Color:=clRed;end;TMyPanelBprocedureTMyPanelB.SetColor;begin/inherited;Self.Color:=clBlue;end;75TForm1procedureTForm1.CreatePanel(poPanel:TMyPanel;piWidth,piHeight,piTop,piLeft:Integer;psCaption:String);beginwit
29、hpoPaneldobeginCaption:=psCaption;Left:=piLeft;Top:=piTop;Width:=piWidth;Height:=piHeight;Parent:=Self;SetColor;end;end;76procedureTForm1.btn1Click(Sender:TObject);varloMyPanel:TMyPanel;loPanelA:TMyPanelA;loPanelB:TMyPanelB;beginloMyPanel:=TMyPanel.Create(Self);CreatePanel(loMyPanel,100,100,50,20,基类
30、Panel);loPanelA:=TMyPanelA.Create(Self);CreatePanel(loPanelA,100,100,50,130,PanelA);loPanelB:=TMyPanelB.Create(Self);CreatePanel(loPanelB,100,100,50,240,PanelB);end;end.77VCL可视化组件库VCL是可视化组件库(VisualComponentLibrary)的简称;它是一个庞大的类、组件库,Delphi和C+Builder使用的组件库都是VCL。类似于C+的MFC。VCL架构VCL采用单根架构(Single-rootedHie
31、rarchy),即所有类的祖先都是Tobject,且每次只能从一个类派生子类(即单继承而非多继承)。JAVA也采用单根架构,而C+不是。78使用VCL1、静态方式设计时加入组件进行属性和事件设计。2、动态方式用代码创建类的实例(对象),然后使用它提供的功能,最后销毁它。79扩展VCL自定义组件当现有的类和组件无法满足我们的需要时,可以从VCL的现有类和组件上派生新的子类和子组件。80结构化查询语言SQL(StructuredQueryLanguage)SQL语言组成:数据定义语言(DDL)例如:CREATE、DROP、ALTER等语句。数据操作语言(DML)例如:INSERT(插入)、UPDA
32、TE(修改)、DELETE(删除)语句。数据查询语言(DQL)例如:SELECT语句。数据控制语言(DCL)例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句81数据查询语言(DQL)SELECTALL|DISTINCT|DISTINCTROW|TOP*|talbe.*|table.field1ASalias1,table.field2ASalias2,FROMtableexpression,INexternaldatabaseWHEREGROUPBYHAVINGORDERBYWITHOWNERACCESSOPTION8283SELECTCustomer,SUM(OrderP
33、rice)asAllOrderPriceFROMOrdersGROUPBYCustomerorderbySUM(OrderPrice)Desc8485selectb.deptNameas部门,sum(casewhena.mon=一月份thena.yjelse0end)as一月份,sum(casewhena.mon=二月份thena.yjelse0end)as二月份,sum(casewhena.mon=三月份thena.yjelse0end)as三月份,sum(casewhena.mon=四月份thena.yjelse0end)as四月份,sum(casewhena.mon=五月份thena.y
34、jelse0end)as五月份,sum(casewhena.mon=六月份thena.yjelse0end)as六月份,sum(casewhena.mon=七月份thena.yjelse0end)as七月份,sum(a.yj)as年销售额fromyjtableajoindeptbona.DeptId=b.DeptIdgroupbyb.deptnameorderbysum(a.yj)desc86数据操作语言(DML)INSERTINTO表名称 (列1,列2,.)VALUES(值1,值2,.)UPDATE表名称 SET列名称 =新值 WHERE列名称 =某值DELETEFROM表名称 WHERE列名称 =值INSERTINTOOrdersVALUES(8,2011-04-25,5000.01,zheng)INSERTINTOOrdersVALUES(8,2011-04-25,5000.01,zheng)87truncatetable表名称不记录日志,不可回滚,执行速度快。deletefrom表名称记录日志,可回滚,相对来说比较慢。88附:89