Delphi2010手册_1
Delphi编程从入门到精通 01(共4册)

第1章Delphi使用概論第1章Delphi使用概論本書的第一章在內容上力求淺顯,其中甚至有一步接一步的操作說明,即使是從來沒有使用過Delphi的程式設計師,閱讀本章相信也不至於有任何問題。
我在這一章中示範性的完成一個簡單的應用程式,除了用以說明典型的Delphi的程式開發流程,並且也以這個實例探討Delphi專案是由哪些檔案所組成,接著是與寫作程式息息相關的工具,包括程式編輯器(Program Editor)、除錯器(Debugger)的使用等等。
Delphi程式開發流程典型的Delphi應用程式開發流程大致上可分為以下兩大步驟:☐設計包括視窗外觀、主選單、按鈕等等的使用者操作介陎。
☐撰寫使用者操作介陎引發的事件處理程序以及其他相關程式。
上述的兩大設計工作不論是介陎的設計或者程式的撰寫,都是在所謂的整合開發環境(IDE,Integrated Development Environment)中進行的,此環境不僅能在設計階段就對未來成品的外觀擁有立即的視覺效果,其他的開發工具如程式編輯器與除錯器等也都整合在同一個環境中隨手可得。
關於這些我在本章將會一一加以說明,首先,讓我們快速的瀏覽一遍Delphi的整合開發環11第一篇Delphi 與Object Pascal12境。
介紹Delphi的整合開發環境Delphi在啟動後,會自動幫我們建立一個新的專案,內含一個空白的視窗(按Delphi的說Code EditorCode ExplorerForm (Windows)在這裏進行設計Object Inspector1-1 / Delphi 4 的整合開發環境圖1-1中明顯看得到的工具還有:☐Speedbar,快速工具列。
☐Component Palette,元件盤。
☐Object Inspector,物件檢視器,用來檢視並調整Form或Form上頭各元件的屬性值。
第1章 Delphi 使用概論13 ☐ Code Editor 1,程式編輯器,我們在此編輯區編修程式。
delphi1-语法基础

数据类型
Object Pascal的数据类型分为两大类
标准类型
整型:Integer(2)、LongInt(4)、Byte(1). 实型:Double(8)、 Float× 布尔型:Boolean. 字符型:String、Char
自定义类型
枚举类型 子界类型 数组类型 集合类型 类类型
运算符
赋值运算符 字符串运算符 算术运算符 关系运算符 逻辑运算符
对象三要素:属性、方法、事件。 ➢属性:描述对象的一些特性,如按钮的大小、颜色。 ➢方法:对象固有的行为、动作,如按钮的move ➢事件:能被对象识别的外部动作。当单击按钮,称在 按钮上有事件(单击)发生。
任何对象都有一组预定义的属性、事件、方法,对 象只能使用其预定义的属性、方法并对预定义事件做 出响应。
事件驱动:对象根据具体的事件(外部动作) 做出相应的响应处理。
希望某对象对某特定事件做出响应处理,在其特 定事件处理过程中编写代码实现(设置对象属性 或调用对象方法等).
例:按钮对鼠标的mouseDown、mouseUp的感知。
流程控制
复合语句 条件语句 循环语句
复合语句
delphi中复合语句用保留字Begin和End;界定,同C的{ }。
赋值运算符
赋值符:由“冒号”与“等号”结合在一起 构成 使用格式:“:=” 例如,将整数5赋给变量x:
x:=5;
字符串运算符
字符串操作符:+,用于字符串连接。
‘世界’ + ‘地图’
‘世界地图’
算术运算符
Object Pascal中共有6种算术运算操作符:
+ (加号)
- (减号)
* (乘号)
/ :不管操作数是整数还是实数,操作结果都是实数。
DELPHI DATASNAP 2010 入门操作

DELPHI DATASNAP 2010 入门操作(1)为什么要用datasnap 2010网上关于新版本的datasnap的资料不是太多,我现在所能找到的全面一些的,也就是我们QQ群(DATASNAP[DELPHI]三层:67803772)里面的两位高手写的分析文章,且已经转到了我的BLOG文章中,还有群里面的一位朋友翻译了的datasnap 的一些资料。
对于datsanp 来说,其实我也只能算是一个入门者,因为一些相关知识不是太熟悉,所以我现在的水平也只能说是入门级的水平,对一些深入的知识,我并不能很好的理解,写下这个入门级的BLOG,主要目的是为了群里面的一些与我一样的朋友,让他们对最简单的d atasnap 能有一个了解,因为很少有文章介绍这种简单的,入门级的操作,在过程中如果有写错或者理解错误的,还请各位高手指点.关于多层很多朋友是望而止步,因为确实多层,需要考滤很多的相关因素,不过,很多时候,我们的一个小的应用程序,并不需要哪么多的容错处理,有一些朋友,应用三层,只是为了屏蔽我数据库的地址及端口号,因为如果是用SQL SERVER 的数据库,给别人攻击太容易了,其实多层应用,很多时候并没有我们想像中的哪么复杂关于datasnap 2010 与DBX在群里面聊天的过程中,有很多朋友认为,datasnap 2010 只可以与DBX 捆绑在一起,而如果是想用ADO的话,哪就得放弁DATASNAP 2010 了,这个想法是错误的,d atasnap 2010 是调用了DBX 库中的一些相关的东西,也就是我们如果用ADO来连接目标库的话,哪么我们还是需要USES DBX相关的单元,但是这并不影响我们使用ADO 关于2009-2010 的datasnap 与低版块的差异delphi 09/10 添加了新的datasnap ,但是并没有放弁对旧的datansp的支持,我们在d elphi 2010 上面,还是可以采用D7-D2010 上面所采用的三层的开发方法,但是delp hi 2009 开始新添加了的datasnap ,让delphi 在数据处理方面又有了一个质的提升,可以说新版本的datasnap是delphi 的一个重要的亮点功能不过,新版本也不是完全都如意,如果你还在用SQL SERVER 2000的话,哪么你想用DBX的话,你的客户端必需要装到sql server 2008的客户端,否则,一系列的错误,会搞的你不知是什么一回事!但是,这个问题并不会阻止delphi的兄弟们探索delphi 2010 datasnap 的真面目,已有不少的朋友,把新的应用架到了delphi 2010 + datasnap 上面,因为相对旧版本来说,做一个三层太简单了在D2007以前的版本中,我们的SOCKT 三层,必须要运行scktsrv.exe ,就算是有的兄弟给改了面目,但是这还是没的让用户觉得你系统很强,特别是一些多年的BUG一直让大多数人解决不了,大点的公司则选择了RO等专业的解决方案,但是一些公司不用盗版,又不愿意购卖正版的,则只能忍痛了....用了delphi 2010 的新的datasnap后,我们可以对scktsrv.exe 说再见了,因为现在,已经不在需要他了,如果我们需要足够的简单,我可以做到,服务器只有一个EXE文件,客户机只有一个EXE文件,并且服务器放在U盘上携带到任何地方都可以用(数据呢?当然数据不算在内,如果只是为了影示的话,我可以用clientdataset 内存数据库)同样的是这个EXE,我可以设置成服务,让电脑开机就自动运行服务器端,以前的需要登录后才能用的悲剧,再见吧......datansp 2010与RO在专业与稳定性方面,RO永远走在前面,如果:1、你不觉得RO很复杂2、你用正版或者你不怕用了盗版的RO有版权问题哪么,你可以去选择RO,而且新版本的RO,也支持用datasnap我选择datasnap 的理由datasnap 支持独立EXE模式的TCP或HTTP方式连接,也支持ISAPI模式的HTTP连接,选用哪一种方式,需要看你的项目的情况而定,但是我相信,datasnap 的简单,是我选择他的理由!让我们在后面的文章中,慢慢的体现datasnap的优秀之处吧再次说明,我的文章,只适合入门级的新手,各位大侠如果有不同的意见,也欢迎指出!datasnap 东家没有给我们太多的希望,但是datasnap 还是一个有力的工具,可以让我们更快速地开发满足客户要求的应用程序,旧版块的哪些BUG,再见吧DELPHI DATASNAP 2010 入门操作(2)不写一行代码,绿色三层我也行没有一行代码的三层,功能肯定非常的简单,但是,再简单,我们也三层了,学习一个东西,需要从入门开始就有兴趣,如果入门就给吓怕了,哪么后来何来信心学习呢?现在就让我们开始吧,不只是没有华丽的词语,而是连用词都不专业,因为,我也只是一个入门者。
DELPHI_DATASNAP_2010_教程

DELPHI DATASNAP 2010 入门操作(1)为什么要用datasnap 2010网上关于新版本的datasnap的资料不是太多,我现在所能找到的全面一些的,也就是我们QQ群(DATASNAP[DELPHI]三层:67803772)里面的两位高手写的分析文章,且已经转到了我的BLOG文章中,还有群里面的一位朋友翻译了的datasnap的一些资料。
对于datsanp来说,其实我也只能算是一个入门者,因为一些相关知识不是太熟悉,所以我现在的水平也只能说是入门级的水平,对一些深入的知识,我并不能很好的理解,写下这个入门级的BLOG,主要目的是为了群里面的一些与我一样的朋友,让他们对最简单的datasnap能有一个了解,因为很少有文章介绍这种简单的,入门级的操作,在过程中如果有写错或者理解错误的,还请各位高手指点.关于多层很多朋友是望而止步,因为确实多层,需要考滤很多的相关因素,不过,很多时候,我们的一个小的应用程序,并不需要哪么多的容错处理,有一些朋友,应用三层,只是为了屏蔽我数据库的地址及端口号,因为如果是用SQL SERVER 的数据库,给别人攻击太容易了,其实多层应用,很多时候并没有我们想像中的哪么复杂关于datasnap 2010 与DBX在群里面聊天的过程中,有很多朋友认为,datasnap 2010 只可以与DBX 捆绑在一起,而如果是想用ADO 的话,哪就得放弁DATASNAP 2010 了,这个想法是错误的,datasnap 2010 是调用了DBX 库中的一些相关的东西,也就是我们如果用ADO来连接目标库的话,哪么我们还是需要USES DBX相关的单元,但是这并不影响我们使用ADO关于2009-2010 的datasnap与低版块的差异delphi 09/10 添加了新的datasnap ,但是并没有放弁对旧的datansp的支持,我们在delphi 2010 上面,还是可以采用D7-D2010 上面所采用的三层的开发方法,但是delphi 2009 开始新添加了的datasnap,让delphi 在数据处理方面又有了一个质的提升,可以说新版本的datasnap是delphi的一个重要的亮点功能不过,新版本也不是完全都如意,如果你还在用SQL SERVER 2000的话,哪么你想用DBX的话,你的客户端必需要装到sql server 2008的客户端,否则,一系列的错误,会搞的你不知是什么一回事!但是,这个问题并不会阻止delphi的兄弟们探索delphi 2010 datasnap的真面目,已有不少的朋友,把新的应用架到了delphi 2010 + datasnap上面,因为相对旧版本来说,做一个三层太简单了在D2007以前的版本中,我们的SOCKT 三层,必须要运行scktsrv.exe ,就算是有的兄弟给改了面目,但是这还是没的让用户觉得你系统很强,特别是一些多年的BUG一直让大多数人解决不了,大点的公司则选择了RO 等专业的解决方案,但是一些公司不用盗版,又不愿意购卖正版的,则只能忍痛了....用了delphi 2010 的新的datasnap后,我们可以对scktsrv.exe 说再见了,因为现在,已经不在需要他了,如果我们需要足够的简单,我可以做到,服务器只有一个EXE文件,客户机只有一个EXE文件,并且服务器放在U盘上携带到任何地方都可以用(数据呢?当然数据不算在内,如果只是为了影示的话,我可以用clientdataset 内存数据库)同样的是这个EXE,我可以设置成服务,让电脑开机就自动运行服务器端,以前的需要登录后才能用的悲剧,再见吧......datansp 2010与RO在专业与稳定性方面,RO永远走在前面,如果:1、你不觉得RO很复杂2、你用正版或者你不怕用了盗版的RO有版权问题哪么,你可以去选择RO,而且新版本的RO,也支持用datasnap我选择datasnap的理由datasnap支持独立EXE模式的TCP或HTTP方式连接,也支持ISAPI模式的HTTP连接,选用哪一种方式,需要看你的项目的情况而定,但是我相信,datasnap的简单,是我选择他的理由!让我们在后面的文章中,慢慢的体现datasnap的优秀之处吧再次说明,我的文章,只适合入门级的新手,各位大侠如果有不同的意见,也欢迎指出!datasnap东家没有给我们太多的希望,但是datasnap还是一个有力的工具,可以让我们更快速地开发满足客户要求的应用程序,旧版块的哪些BUG,再见吧(注:datasnap 2010 也有一些BUG,但是是可以解决的,因为我们可以看源码)没有一行代码的三层,功能肯定非常的简单,但是,再简单,我们也三层了,学习一个东西,需要从入门开始就有兴趣,如果入门就给吓怕了,哪么后来何来信心学习呢?现在就让我们开始吧,不只是没有华丽的词语,而是连用词都不专业,因为,我也只是一个入门者。
第一章 delphi基础

1
本章内容
本章内容 学习要求
§1.1 §1.2 §1.3 §1.4
Delphi7特点 Delphi7的集成开发环境 Delphi7可视化编程 Delphi7常用组件的使用
2
学习要求
熟悉集成开发环境 熟练掌握可视化编程的步骤,会编写简单的程序 掌握Delphi文件结构。 熟练掌握Delphi7常用组件的使用
一、Delphi 7集成开发环境的组成
本章内容 学习要求
5
1、主菜单:掌握几个主要的菜单。 2、工具栏 (Tools Bar) :
本章内容 学习要求
6
本章内容 学习要求
3、组件面板 可视组件 非可视组件:如Dialogs和Data Access等面板上的组 件 使用组件面板
重点掌握Standard,additional,Data access,Data controls,ADO,BDE
可视化的开发环境 快捷高效的编译器:Pascal编译器 编程语言规范,易于调试: Object Pascal语言 灵活的数据库结构:支持Paradox, Foxpro, Access,Oracle,MS SQL Server,Sybase数据库 组件功能的灵活扩充
4
1.2 Delphi 7 的集成开发环境
5、对象观察器 (Object Inspector)
(1)属性,属性修改 (2)事件,编写事件代码 技巧 属性太多,不知其意思,怎么办? 先选中该属性或事件,再F1键(帮助)
6、代码编辑器(Code Editor)
8
Delphi7可视化编程 1.3 Delphi7可视化编程
一、工程
本章内容 学习要求
7
delphi_2010_fastMM

//创建并显示窗体。模式窗体。
procedure ShowModalForm(const AStrForm:string);overload;
procedure ShowModalForm(AFormClass:TFormClass);overload;
//创建并显示窗体。非模式窗体。
Dialogs, StdCtrls, ExtCtrls, RzStatus, Menus;
type
TForm1 = class(TForm)
Timer1: TTimer;
RzProgressStatus1: TRzProgressStatus;
PopupMenu1: TPopupMenu;
Application.Initialize;
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//使程序不显示在任务栏中
Application.Title := '电池电量显示';
Application.CreateForm(TForm1, Form1);
end; *)
简单电池电量显示2009年10月14日 星期三 上午 11:02Project1.dpr
program Project1;
uses
Forms,Windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
begin
//
YShowFormClass.ShowModalForm(TFormArea);
end;
delphi2010资源文件使用

delphi2010资源⽂件使⽤ProjectRecources...//1提取出资源procedure TForm1.Button1Click(Sender: TObject);beginwith TResourceStream.Create(HInstance, 'SnapShot_EXE',RT_RCDATA) dobeginSavetoFile('SnapShot.exe');Free;end;end;//播放wav⽂件//使⽤icon ⽂件TResourceStream = class(TCustomMemoryStream)privateHResInfo: THandle;HGlobal: THandle;procedure Initialize(Instance: THandle; Name, ResType: PChar; FromID: Boolean);publicconstructor Create(Instance: THandle; const ResName: string; ResType: PChar);constructor CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);destructor Destroy; override;function Write(const Buffer; Count: Longint): Longint; override;end;const{ Predefined Resource Types }{$EXTERNALSYM RT_CURSOR}RT_CURSOR = MakeIntResource(1); //光标⽂件{$EXTERNALSYM RT_BITMAP}RT_BITMAP = MakeIntResource(2);//位图{$EXTERNALSYM RT_ICON}RT_ICON = MakeIntResource(3);//图标{$EXTERNALSYM RT_MENU}RT_MENU = MakeIntResource(4);{$EXTERNALSYM RT_DIALOG}RT_DIALOG = MakeIntResource(5);{$EXTERNALSYM RT_STRING}RT_STRING = MakeIntResource(6);{$EXTERNALSYM RT_FONTDIR}RT_FONTDIR = MakeIntResource(7);{$EXTERNALSYM RT_FONT}RT_FONT = MakeIntResource(8);{$EXTERNALSYM RT_ACCELERATOR}RT_ACCELERATOR = MakeIntResource(9);{$EXTERNALSYM RT_RCDATA}RT_RCDATA = Types.RT_RCDATA; //MakeIntResource(10);{$EXTERNALSYM RT_MESSAGETABLE}RT_MESSAGETABLE = MakeIntResource(11);DIFFERENCE =11;{$EXTERNALSYM DIFFERENCE}RT_GROUP_CURSOR = MakeIntResource(DWORD(RT_CURSOR) + DIFFERENCE);{$EXTERNALSYM RT_GROUP_CURSOR}RT_GROUP_ICON = MakeIntResource(DWORD(RT_ICON) + DIFFERENCE);{$EXTERNALSYM RT_GROUP_ICON}RT_VERSION = MakeIntResource(16);{$EXTERNALSYM RT_VERSION}RT_DLGINCLUDE = MakeIntResource(17);{$EXTERNALSYM RT_DLGINCLUDE}RT_PLUGPLAY = MakeIntResource(19);{$EXTERNALSYM RT_PLUGPLAY}RT_VXD = MakeIntResource(20);{$EXTERNALSYM RT_VXD}RT_ANICURSOR = MakeIntResource(21);{$EXTERNALSYM RT_ANICURSOR}RT_ANIICON = MakeIntResource(22);{$EXTERNALSYM RT_ANIICON}RT_HTML = MakeIntResource(23);{$EXTERNALSYM RT_HTML}RT_MANIFEST = MakeIntResource(24);{取出现Wav资源}with TResourceStream.Create(HInstance, 'warning', RT_RCDATA) do beginSaveToFile('warning.wav');Free;end;//把EXE⽂件打包到资源⽂件中⼀.编写rc脚本⽂本新建⼀个记事本,输⼊ ExeFile1 ExeFile "myExeFile.exe"保存⽂件为 ExeRes.rc ⼆.将rc⽂件编译成res资源⽂件在dos中输⼊brcc32 C:\Users\Administrator\Desktop\ExeRes.rc//brcc32.exe在DelphiX\Bin⽬录中将其复制到 C:\Windows⽬录下⾯三.在Delphi单元中加⼊资源⽂件新建⼀个项⽬,把ExeRes.RES⽂件复制到项⽬⽬录下,在implementation的{$R *.dfm}的下⾯输⼊:{$R ExeRes.RES}四.把资源⽂件中exe⽂件提取出来uses classes;procedure ExtractRes( ResType, ResName, ResNewName : String );varRes : TResourceStream;beginRes := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));Res.SavetoFile(ResNewName);Res.Free;end;//把资源⽂件中exe⽂件提取出来procedure TForm1.Button1Click(Sender: TObject);beginExtractRes('exefile','ExeFile1','C:\Users\Administrator\Desktop\aaa.exe'); end;。
[原创]Delphi(一)
![[原创]Delphi(一)](https://img.taocdn.com/s3/m/876611d17d1cfad6195f312b3169a4517723e5e7.png)
[原创]Delphi(一)[原创] Delphi(一) --探索Posted on 2007-04-25 09:35 joyyuan97 阅读(330) 评论(0) 编辑收藏注:以前在大富翁上的文章,希望一起整理到这里来。
{ No. 1 }//创建模式窗体的句子class procedure TMyForm.RunForm(AObj1, AObj2: TObject);varvForm: TMyForm;beginvForm := TMyForm.Create(Application);with vForm doTryInitForm(AObj1, AObj2);ShowModal;FinallyFree;end;end;(*说明:通过class声明的函数,类似与VC中的静态函数;使用语句:TMyForm.RunForm(vObj1, vObj2);其他具体的,参考:Delphi 帮助中的,class 类说明。
强调这个惯用法,就是为了:1、如果此窗体在多处被使用,那么可以保证统一都调用此段代码;2、如果功能上有所修改,比如:根据ShowModal的返回值不同进行处理,那么只修改此函数就行了。
3、程序封装性好,易于维护和工作交接。
*){ No. 2 } Tag 的使用//窗体工具栏按钮事件的响应procedure TMyForm.RunOperate(ATag: Integer);beginCase ATag of1: MyButton.Color := clRed;2: MyButton.Color := clGreen;3: MyButton.Color := clBlack;end;end;procedure TMyForm.ToolBtnClick(Sender: TObject);beginRunOperate(TControl(Sender).Tag);end;//如果你在某下拉菜单中,也需要执行类似功能则procedure TMyForm.MenuItemClick(Sender: TObject);beginRunOperate(TMenuItem(Sender).Tag);end;(*说明:1、结构清晰2、相关的信息集中,比较容易查错、修改和维护3、提高程序的适应、扩展能力;比如现在要求不在工具栏按钮中实现,而要求在不同按钮中实现,则修改容易。
Delphi2010使用和新功能设置

1、第一个当然说一下新特点了,就是自动输入代码提示功能用来这个功能,觉得还没CNPACK的方便,但毕竟别人集成到环境中了,也算不错了,但Delphi默认是关闭的,到Tools->Options下开启(不行,估计要重启IDE环境才能生效),选中Auto invoke1)提示效果还不错2)对一些关键字没提示,可能是本人设置问题2、控件栏不太好,明显示的图片都没有,还有重复出错的DataSnapClient页1)Indy的图片又难看,又不全(个人意见)2)DataSnapClient页3、Integer数据值一次一个数值,(不知道怎么处理的,好像在JA V A里面系统会默认为0的,但Delphi里好像一次一个样值(WINXP HOME,相差几秒钟运行)3、把控件栏设置成D7的样式(但未找到多行设置),右击工具栏部分,选择Component 效果前效果后4、界面效果失去了Borland的以前的蓝色调,不知是涅槃还是沉沦,给我的感觉是压抑,像个巫婆……..觉得编译出来的程序还是比D7下的大了不少,不知道是不是EMB又对编译器进行了优化所致5、安装和体验/source/1609674到这里下载安装说明和SLIP文件----------------------------------------------------------------------------------------------------------------------兵临成下QQ:383530895----------------------------------------------------------------------------------------------------------------------。
Delphi常用函数手册

Delphi常用函数手册函数由一句或多句代码组成,可以实现某个特定的功能。
使用函数可以使代码更加易读、易懂,加快编程速度及减少重复代码。
过程与函数类似,过程与函数最重要的区别在于,过程没有返回值,而函数能有返回值。
在Delphi7.0中,已为我们定义好了非常多的函数,大致分类有6种:数据类型转换函数、字符串、数组操作函数、文件、磁盘操作函数、内存、指针操作函数、数学运算函数、日期函数。
在Delphi中调用函数,一般情况下可以直接使用函数即可,但由于有一些函数未包含在Uses中列出的单元中(默认单元有Windows,Messages,SysUtils,Variants,Classes,Graphics, Controls,Forms,Dialogs;),所以需要我们手动添加单元。
比如,MidStr函数就未包含在这些单元中,MidStr所属单元在StrUtils中,因此我们将StrUtils 添加Uses中即可。
在本手册中,凡是未包含在默认列出的单元中的函数,都标明了其所属的单元,使用时应当注意。
一、数据类型转换函数在我们编写程序当中,根据不同情况,会使用到多种数据类型。
当要对不同的类型进行操作时,必须要将不同的类型转换成同样的类型。
因此熟练地掌握数据类型的转换是非常重要的。
1.FloatToStr功能说明:该函数用于将“浮点型”转换成“字符型”。
参考实例:Edit1.Text:= FloatToStr(1.981);2.IntToStr功能说明:该函数用于将“整数型”转换成“字符型”。
参考实例:S := IntToStr(10);(注:S为String类型变量。
)3.IntToHex功能说明:该函数用于将“十进制”转换成“十进制”。
该函数有二个参数。
第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据。
参考实例:Edit1.Text :=IntToHex('100', 2);执行结果,Edit1.Text等于64。
第1章Delphi基础知识

第1章Delphi基础知识第1节Borland公司与DelphiBorland公司于1983年由菲力浦·凯恩(Phillipe Kahn)创立。
Delphi于1995年由Borland公司推出,由Anders Hejlsberg主持设计。
Delphi语言的演变过程:Pascal→Object Pascal→Delphi。
2008年Borland公司将负责研发Delphi语言的CodeGear子公司出售给Embarcadero(易博龙)技术公司。
2010年发布Delphi 2011,新版本名称改为RAD Studio XE(包括Delphi XE、C++Builder XE、Delphi Prism XE和RadPHP XE)。
第2节Delphi的特点一、开发工具的选择程序员的核心能力是自身的编程修养、思想、理念等。
只要扎扎实实地打好基础,具备良好的编程思想,则无论选择何种开发工具均可成为软件开发高手。
二、Delphi的主要特点1. 可视化开发环境2. 丰富的VCL3. 面向对象特性4. 高效的编译器5. 强大的数据库开发功能6. 良好的分布式应用开发支持第3节Delphi集成开发环境主要组成:主窗口、窗体设计器、代码编辑器、对象查看器和对象树浏览器。
一、主窗口标题栏、菜单栏、工具栏、组件面板。
二、窗体设计器一个窗体对应一个单元。
三、对象树浏览器(Object TreeView)显示本模块对象的层次结构。
四、对象查看器(Object Inspector)包括对象列表、属性页、事件页。
事件页的左列为事件名,右列为事件处理程序。
双击右列的组合框可生成默认的事件处理程序。
五、代码编辑和浏览窗口左侧为单元管理器,右侧为代码编辑窗口。
六、代码洞察Delphi提供了与VB相似的代码洞察(Code Insight)技术,可以使代码的输入更加快捷,减少出错。
1. 代码完成(Code Completion)(1)自动完成关键字(补充)Delphi集成开发环境的代码编辑器与VB相似,具有自动完成关键字和标识符的功能,它的快捷键为Ctrl+空格键(与VB中文版中的Alt+→键相似)。
Delphi2010 DataSnap白页中文2010年3月31日

2.1.1. 创建多目标项目组-- VCL 窗体项目
如上面所说,这里创建多目标的Datasnap服务项目组.首先创建一个VCL窗体应用程序作为Datasnap 服务,选择所有的通讯协议.
Delphi 2010 DataSnap 白页
逆水寒翻译
QQ:893444516
2010
默认创建了一个叫做Project1.dproj的项目,并带有三个单元文 件,ServerContainerUnit1.pas,ServerMethodUnit1.pas和Unit1.pas.首先FileSave Project As保 存项目,并输入有实际意义的文件名称.将Unit1.pas保存为MainForm.pas,ServerMethodsUnit1.pas 保存为ServerMethodsUnitDemo.pas文件,保存Project1.dproj为DataSnapServer.dproj. 稍后我们将向项目组添加控制台应用程序和Window服务应用程序.首先我们来检查一下项目,并编 译工程.如果你编译DataSnapServer项目,将会出现一个错误信息(由于我们将 ServerMethodsUnit1.pas改名所致).错误原因是由于ServerContainerUnitDemo.pas单元中的 Implementation部分引用了ServerMethodsUnit1.pas单元.为了修复这个冲突,修改引用单元的文件 名称,从新编译.这是发现在第37行出现错误,使用了ServerMethodsUnit1中的TServerMethods1类型. 修改ServerMethodsUnit1为ServerMethodsUnitDemo.这是可以正确的编译项目了. ServerContainerUnitDemo的引用部分应该向下面代码所示: implementation uses Windows, ServerMethodsUnitDemo; {$R *.dfm} procedure TServerContainer1.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := ServerMethodsUnitDemo.TServerMethods1; end; end. 2.1.1.1. SERVERCONTAINERUNITDEMO 打开ServerContainerUnitDemo单元,将会看到不少于五个组件:一个TDSServer,一个 TDSServerClass,一个TDSTCPServerTransport(用于TCP/IP通讯),一个TDSHTTPService(用于HTTP 通讯),一个TDSHTTPServiceAuthenticationManager组件(用于HTTP验证).
Delphi 2009 2010 XE 泛型使用全集(队 栈 字典 列表 对象列表)

详测 Generics Collections TQueueuses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);varQueue: TQueue<string>;s,str: string;List: TList<string>;beginQueue := TQueue<string>.Create();{入列}Queue.Enqueue('AAA');Queue.Enqueue('BBB');Queue.Enqueue('CCC');Queue.Enqueue('DDD');{查看}str := '';for s in Queue do str := str + s + ' ';ShowMessage(str); {AAA BBB CCC DDD}{出列, 并查看出列元素}ShowMessage(Queue.Dequeue); {AAA}str := '';for s in Queue do str := str + s + ' ';ShowMessage(str); {BBB CCC DDD}{查看下一个将要出列的是...}ShowMessage(Queue.Peek); {BBB}Queue.Free;//从 TList<T> 建立 TQueue<T>List := TList<string>.Create();List.AddRange(['AA', 'BB', 'CC']);Queue := TQueue<string>.Create(List);str := '';for s in Queue do str := str + s + ' ';ShowMessage(str); {AA BB CC }ShowMessage(IntToStr(Queue.Count)); {3}Queue.Clear;ShowMessage(IntToStr(Queue.Count)); {0}//Queue.TrimExcess; { TrimExcess 方法在 Queue 好像没有存在的意义} List.Free;Queue.Free;end;详测 Generics Collections TQueue (3): OnNotify、Extract//uses Generics.Collections;{准备给 TQueue.OnNotify 调用的事件过程}procedure TForm1.MyQueueNotify(Sender: TObject; const Item: Integer; Action: TCollectionNotification);begincase Action ofcnAdded : ShowMessageFmt('Add: %d', [Item]);cnRemoved : ShowMessageFmt('Remove: %d', [Item]);cnExtracted : ShowMessageFmt('Extract: %d', [Item]);end;end;procedure TForm1.Button1Click(Sender: TObject);varQueue: TQueue<Integer>;beginQueue := TQueue<Integer>.Create();Queue.OnNotify := MyQueueNotify;Queue.Enqueue(11); {Add: 11}Queue.Enqueue(22); {Add: 22}Queue.Enqueue(33); {Add: 33}Queue.Dequeue; {Remove: 11}// Extract 和 Dequeue 功能一致, 区别只是在驱动 OnNotify 事件时传递的参数有区别, 没多大意义Queue.Extract; {Extract: 22}//Queue.OnNotify := nil;Queue.Free; {Remove: 33}end;详测 Generics Collections TStack(1): Push、Pop、Peek - 其他功能同 TQueueuses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);varStack: TStack<string>;s,str: string;beginStack := TStack<string>.Create();{压栈}Stack.Push('AAA');Stack.Push('BBB');Stack.Push('CCC');str := '';for s in Stack do str := str + s + ' ';ShowMessage(str); {AAA BBB CCC }{出栈: 后进的先出}Stack.Pop;str := '';for s in Stack do str := str + s + ' ';ShowMessage(str); {AAA BBB }{下一个将要出栈的...}ShowMessage(Stack.Peek); {BBB}Stack.Free;end;详测 Generics Collections TDictionary(1):uses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);varDictionary: TDictionary<string,Integer>;K: string;V: Integer;str: string;b: Boolean;T: Integer;ds: TDictionary<string,Integer>.TPairEnumerator;ks: TDictionary<string,Integer>.TKeyEnumerator;vs: TDictionary<string,Integer>.TValueEnumerator;beginDictionary := TDictionary<string,Integer>.Create();{添加}Dictionary.Add('n1', 111);Dictionary.Add('n2', 222);Dictionary.Add('n3', 333);{访问}ShowMessage(IntToStr(Dictionary['n2'])); {222}ShowMessage(IntToStr(Dictionary.Items['n2'])); {222}{遍历 Keys}str := '';for K in Dictionary.Keys do str := str + K + ' ';ShowMessage(str); {n2 n3 n1 }//顺序乱了?{遍历 Values}str := '';for V in Dictionary.Values do str := str + IntToStr(V) + ' ';ShowMessage(str); {222 333 111 }{通过 Keys 遍历 Values}str := '';for K in Dictionary.Keys do str := str + IntToStr(Dictionary[K]) + ' ';ShowMessage(str); {222 333 111 }{删除}Dictionary.Remove('n1');str := '';for K in Dictionary.Keys do str := str + IntToStr(Dictionary[K]) + ' ';ShowMessage(str); {222 333 }{取数量、清空}ShowMessage(IntToStr(Dictionary.Count)); {2}Dictionary.Clear;ShowMessage(IntToStr(Dictionary.Count)); {0}{判断指定的 Key 是否存在}b := Dictionary.ContainsKey('n1');ShowMessage(BoolToStr(b, True)); {True}b := Dictionary.ContainsKey('n4');ShowMessage(BoolToStr(b, True)); {False}{判断指定的 Value 是否存在}b := Dictionary.ContainsValue(111);ShowMessage(BoolToStr(b, True)); {True}b := Dictionary.ContainsValue(999);ShowMessage(BoolToStr(b, True)); {False}{使用 AddOrSetValue 时, 如果 Key 存在则替换值; 此时如果用 Add 将发生异常}Dictionary.AddOrSetValue('n1', 123);ShowMessage(IntToStr(Dictionary['n1'])); {123}{使用 AddOrSetValue 时, 如果 Key 不存在则同 Add}Dictionary.AddOrSetValue('n4', 444);ShowMessage(IntToStr(Dictionary['n4'])); {444}{尝试取值}if Dictionary.TryGetValue('n2', T) thenShowMessage(IntToStr(T)); {222}ds := Dictionary.GetEnumerator;while ds.MoveNext do ShowMessageFmt('%s:%d', [ds.Current.Key, ds.Current.Value]);{n2:222 n3:333 n1:111}ks := Dictionary.Keys.GetEnumerator;while ks.MoveNext do ShowMessageFmt('%s', [ks.Current]);{n2 n3 n1}vs := Dictionary.Values.GetEnumerator;while vs.MoveNext do ShowMessageFmt('%d', [vs.Current]);{222 333 111}{ ExtractPair 应是提取元素, 但它的返回值有些问题; 该函数源码有待修改 }Dictionary.ExtractPair('n1');ShowMessage(IntToStr(Dictionary.Count)); {2}Dictionary.Free;end;详测 Generics Collections TDictionary(4): OnKeyNotify、OnValueNotifyinterfaceusesGenerics.Collections;implementationprocedure TForm1.KeyNotify(Sender: TObject; const Item: string;Action: TCollectionNotification);begincase Action ofcnAdded : ShowMessageFmt('Key_Add: %s', [Item]);cnRemoved : ShowMessageFmt('Key_Remove: %s', [Item]);cnExtracted : ShowMessageFmt('Key_Extract: %s', [Item]);end;end;procedure TForm1.ValueNotify(Sender: TObject; const Item: Integer;Action: TCollectionNotification);begincase Action ofcnAdded : ShowMessageFmt('Value_Add: %d', [Item]);cnRemoved : ShowMessageFmt('Value_Remove: %d', [Item]);cnExtracted : ShowMessageFmt('Value_Extract: %d', [Item]);end;end;procedure TForm1.Button1Click(Sender: TObject);varDictionary: TDictionary<string,Integer>;beginDictionary := TDictionary<string,Integer>.Create();Dictionary.OnKeyNotify := KeyNotify;Dictionary.OnValueNotify := ValueNotify;Dictionary.Add('n1', 111); {Key_Add: n1; Value_Add: 111}Dictionary.Add('n2', 222); {Key_Add: n2; Value_Add: 222}Dictionary.AddOrSetValue('n1', 123); {Value_Remove: 111; Value_Add: 123}Dictionary.Remove('n1'); {Key_Remove: n1; Value_Remove: 111} Dictionary.ExtractPair('n2'); {Key_Extract: n2; Value_Extract: 222} Dictionary.OnKeyNotify := nil;Dictionary.OnValueNotify := nil;Dictionary.Free;end;详测 Generics Collections TDictionary(5): 多种 Create 手段uses Generics.Collections, Generics.Defaults;//Create 可以指定元素数, 这样可以提前分配空间以加快速度procedure TForm1.Button1Click(Sender: TObject);varDictionary: TDictionary<string,Integer>;beginDictionary := TDictionary<string,Integer>.Create(3);Dictionary.Add('n1', 111);Dictionary.Add('n2', 222);Dictionary.Add('n3', 333);Dictionary.Free;end;//Create 可以有一个 IEqualityComparer 参数, 用于判断 Key 怎样才是相同procedure TForm1.Button2Click(Sender: TObject);varDictionary: TDictionary<string,Integer>;EqualityComparer: IEqualityComparer<string>; {相等对比器}begin{通过 IEqualityComparer 让 TDictionary 的 Key 忽略大小写}EqualityComparer := TEqualityComparer<string>.Construct( function(const Left, Right: string): Boolean beginResult := LowerCase(Left) = LowerCase(Right);end,function(const Value: string): Integer beginResult := StrToIntDef(Value, 0); {我暂时不知道这个函数的作用, 随便写的}end);Dictionary := TDictionary<string,Integer>.Create(EqualityComparer); Dictionary.Add('n1', 111);Dictionary.Add('n2', 222);Dictionary.Add('n3', 333);{如果不是如上建立, 下面这句将会产生一个新元素, 而不是更新 n1 的值} Dictionary.AddOrSetValue('N1', 123);ShowMessage(IntToStr(Dictionary['n1'])); {123}Dictionary.Free;end;//Create 可以同时指定上面两个参数procedure TForm1.Button3Click(Sender: TObject);varDictionary: TDictionary<string,Integer>;EqualityComparer: IEqualityComparer<string>;beginEqualityComparer := TEqualityComparer<string>.Construct( function(const Left, Right: string): Boolean beginResult := LowerCase(Left) = LowerCase(Right);end,function(const Value: string): Integer beginResult := StrToIntDef(Value, 0);end);Dictionary := TDictionary<string,Integer>.Create(9, EqualityComparer);Dictionary.Add('n1', 111);Dictionary.AddOrSetValue('N1', 123);ShowMessage(IntToStr(Dictionary['n1'])); {123}{指定元素数后, 用不了的可以释放}Dictionary.TrimExcess;Dictionary.Free;end;//可通过另一个 TDictionary 建立一个新的 TDictionaryprocedure TForm1.Button4Click(Sender: TObject);varDictionary, DictionaryTmp: TDictionary<string,Integer>;pair: TPair<string,Integer>;beginDictionaryTmp := TDictionary<string,Integer>.Create();DictionaryTmp.Add('n1', 111);DictionaryTmp.Add('n2', 222);DictionaryTmp.Add('n3', 333);{通过另一个 TDictionary 建立}Dictionary := TDictionary<string,Integer>.Create(DictionaryTmp); {遍历看看}for pair in Dictionary doShowMessage(IntToStr(Dictionary[pair.Key]));{222 333 111}DictionaryTmp.Free;Dictionary.Free;end;//通过另一个 TDictionary 建立时, 可同时再指定 "相等对比器" procedure TForm1.Button5Click(Sender: TObject);varDictionary, DictionaryTmp: TDictionary<string,Integer>;pair: TPair<string,Integer>;EqualityComparer: IEqualityComparer<string>;beginDictionaryTmp := TDictionary<string,Integer>.Create();DictionaryTmp.Add('n1', 111);DictionaryTmp.Add('n2', 222);DictionaryTmp.Add('n3', 333);{再做个对比器}EqualityComparer := TEqualityComparer<string>.Construct( function(const Left, Right: string): Boolean beginResult := LowerCase(Left) = LowerCase(Right);end,function(const Value: string): Integer beginResult := StrToIntDef(Value, 0);end);{通过另一个 TDictionary 建立, 同时更换对比器}Dictionary := TDictionary<string,Integer>.Create(DictionaryTmp, EqualityComparer);{测试对比器}Dictionary.AddOrSetValue('N1', 999);{遍历看看}for pair in Dictionary doShowMessage(IntToStr(Dictionary[pair.Key]));{222 333 999}DictionaryTmp.Free;Dictionary.Free;end;详测 Generics Collections TListuses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);varList: TList<Cardinal>;i: Integer;str: string;beginList := TList<Cardinal>.Create();{Add}List.Add(22);List.Add(33);List.Add(11);{Count、Capacity }ShowMessageFmt('Count: %d; Capacity: %d', [List.Count,List.Capacity]);str := '';for i in List do str := str + UIntToStr(i) + sLineBreak;ShowMessage(str);{Clear}List.Clear;ShowMessageFmt('Count: %d; Capacity: %d', [List.Count,List.Capacity]);List.Free;end;// First、Last、IndexOf、LastIndexOfprocedure TForm1.Button2Click(Sender: TObject);varList: TList<string>;beginList := TList<string>.Create();List.Add('AA');List.Add('BB');List.Add('CC');List.Add('BB');List.Add('DD');ShowMessageFmt('First: %s', [List.First]); {First: AA}ShowMessageFmt('Last: %s', [st]); {Last: DD}ShowMessageFmt('IndexOf: %d', [List.IndexOf('BB')]); {IndexOf: 1}ShowMessageFmt('LastIndexOf: %d', [stIndexOf('BB')]); {LastIndexOf: 3}List.Free;end;// Insert、Delete、Remove、Extractprocedure TForm1.Button3Click(Sender: TObject);varList: TList<Integer>;i: Integer;str: string;beginList := TList<Integer>.Create();List.Add(111);List.Add(222);List.Add(333);List.Insert(0, 444);List.Insert(2, 555);str := '';for i in List do str := str + UIntToStr(i) + ' '; {444 111 555 222 333 } ShowMessage(str);List.Delete(0);List.Delete(List.Count-1);str := '';for i in List do str := str + UIntToStr(i) + ' '; {111 555 222 }ShowMessage(str);List.Remove(555); {删除指定元素}str := '';for i in List do str := str + UIntToStr(i) + ' '; {111 222 }ShowMessage(str);List.Extract(222); {提取指定元素}str := '';for i in List do str := str + UIntToStr(i) + ' '; {111 }ShowMessage(str);List.Free;end;// AddRange、InsertRange、DeleteRangeprocedure TForm1.Button4Click(Sender: TObject);varList,ListTmp: TList<Byte>;i: Byte;str: string;beginList := TList<Byte>.Create();List.AddRange([11,22,33]);str := '';for i in List do str := str + IntToStr(i) + ' '; {11 22 33 }ShowMessage(str);ListTmp := TList<Byte>.Create();ListTmp.AddRange([44,55]);List.AddRange(ListTmp);str := '';for i in List do str := str + IntToStr(i) + ' '; {11 22 33 44 55 } ShowMessage(str);List.InsertRange(1, ListTmp);str := '';for i in List do str := str + IntToStr(i) + ' '; {11 44 55 22 33 44 55 } ShowMessage(str);List.DeleteRange(1, 5);str := '';for i in List do str := str + IntToStr(i) + ' '; {11 55 }ShowMessage(str);ListTmp.Free;List.Free;end;// Move、Exchangeprocedure TForm1.Button5Click(Sender: TObject);varList: TList<Byte>;b: Byte;str: string;beginList := TList<Byte>.Create();List.AddRange([11,22,33,44]);List.Move(1, 2);str := '';for b in List do str := str + IntToStr(b) + ' '; {11 33 22 44 }ShowMessage(str);List.Exchange(0, 3);str := '';for b in List do str := str + IntToStr(b) + ' '; {44 33 22 11 }ShowMessage(str);List.Free;end;// Reverse、TrimExcessprocedure TForm1.Button6Click(Sender: TObject);varList: TList<Byte>;b: Byte;str: string;beginList := TList<Byte>.Create();List.Add(11);List.Add(22);List.Add(33);str := '';for b in List do str := str + IntToStr(b) + ' '; {11 22 33 } ShowMessage(str);List.Reverse;str := '';for b in List do str := str + IntToStr(b) + ' '; {33 22 11 } ShowMessage(str);ShowMessage(IntToStr(List.Capacity)); {4}List.TrimExcess;ShowMessage(IntToStr(List.Capacity)); {3}List.Free;end;// Items、Containsprocedure TForm1.Button7Click(Sender: TObject);varList: TList<string>;b: Boolean;beginList := TList<string>.Create();List.AddRange(['AA', 'BB', 'CC']);ShowMessageFmt('%s : %s', [List[1], List.Items[1]]); {BB : BB} b := List.Contains('BB');ShowMessage(BoolToStr(b, True)); {True}b := List.Contains('DD');ShowMessage(BoolToStr(b, True)); {False}List.Free;end;// Sortuses Generics.Collections, Generics.Defaults;procedure TForm1.Button1Click(Sender: TObject);varList: TList<Integer>;i: Integer;str: string;beginList := TList<Integer>.Create();List.AddRange([22,33,11]);str := '';for i in List do str := str + IntToStr(i) + ' ';ShowMessage(str); {22 33 11 }{排序}List.Sort;str := '';for i in List do str := str + IntToStr(i) + ' ';ShowMessage(str); {11 22 33 }{倒排序}List.Sort(TComparer<Integer>.Construct(function (const n1,n2: Integer): IntegerbeginResult := n2 - n1;end));str := '';for i in List do str := str + IntToStr(i) + ' ';ShowMessage(str); {33 22 11 }List.Free;end;// BinarySearchuses Generics.Collections, Generics.Defaults;procedure TForm1.Button1Click(Sender: TObject);varList: TList<string>;num: Integer;b: Boolean;Comparer: IComparer<string>;beginList := TList<string>.Create();List.AddRange(['123', 'ABB', 'ABC']);{默认的查找需要完全吻合才能找到}if List.BinarySearch('ABC', num) then ShowMessage(IntToStr(num)); {2} {这里自定义个对比器, 只要第一个字符吻合就算找到了}Comparer := TComparer<string>.Construct(function(const s1,s2: string): IntegerbeginResult := Ord(s1[1]) - Ord(s2[1]);end);if List.BinarySearch('ABC', num, Comparer) thenShowMessage(IntToStr(num)); {1}List.Free;end;// OnNotify 事件interfaceusesGenerics.Collections;implementation{准备给 List.OnNotify 调用的事件过程}procedure TForm1.MyListNotify(Sender: TObject; const Item: string; Action: TCollectionNotification);begincase Action ofcnAdded : ShowMessageFmt('Add: %s', [Item]);cnRemoved : ShowMessageFmt('Remove: %s', [Item]);cnExtracted : ShowMessageFmt('Extract: %s', [Item]);end;end;procedure TForm1.Button1Click(Sender: TObject);varList: TList<string>;beginList := TList<string>.Create();List.OnNotify := MyListNotify; {关联事件过程}List.AddRange(['A', 'B', 'C']); {Add: A | Add: B | Add: C }List.Delete(0); {Remove: A}List.Remove('B'); {Remove: B}List.Extract('C'); {Extract: C}List.OnNotify := nil;List.Free;end;// Createuses Generics.Collections, Generics.Defaults;vari: Integer;str: string;//无参数的建立procedure TForm1.Button1Click(Sender: TObject); varList: TList<Integer>;beginList := TList<Integer>.Create();List.AddRange([11,22,33]);str := '';for i in List do str := str + IntToStr(i) + ' '; ShowMessage(str); {11 22 33 }List.Free;end;//可以基于另一个列表建立procedure TForm1.Button2Click(Sender: TObject); varList,ListTmp: TList<Integer>;beginListTmp := TList<Integer>.Create();ListTmp.AddRange([1, 2, 3]);List := TList<Integer>.Create(ListTmp);str := '';for i in List do str := str + IntToStr(i) + ' '; ShowMessage(str); {1 2 3 }ListTmp.Free;List.Free;end;//可在建立时同时指定排序器procedure TForm1.Button3Click(Sender: TObject); varList: TList<Integer>;Comparer: IComparer<Integer>;begin{建立排序器}Comparer := TComparer<Integer>.Construct( function(const n1,n2: Integer): IntegerbeginResult := n2 - n1;end);List := TList<Integer>.Create(Comparer);List.AddRange([2, 3, 1]);List.Sort; {会根据建立时指定的排序器排序}str := '';for i in List do str := str + IntToStr(i) + ' '; ShowMessage(str); {3 2 1 }List.Free;end;泛型排序器 TComparerunit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;Memo2: TMemo;Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;Button5: TButton;Button6: TButton;Button7: TButton;Button8: TButton;Button9: TButton;Button10: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure Button4Click(Sender: TObject);procedure Button5Click(Sender: TObject);procedure Button6Click(Sender: TObject);procedure Button7Click(Sender: TObject);procedure Button8Click(Sender: TObject);procedure Button9Click(Sender: TObject);procedure Button10Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses Generics.Collections, Generics.Defaults; {必需的泛型单元}//构建由 10 个整数组成的动态数组, 然后排序procedure TForm1.Button1Click(Sender: TObject);vararr: array of Integer;i: Integer;begin{构建动态数组}Randomize;for i := 0to9do beginSetLength(arr, Length(arr)+1);arr[i] := Random(10);end;{显示排序前}Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(IntToStr(arr[i])); {排序}TArray.Sort<Integer>(arr); {它可以有 1个、2个、4个参数, 这里只用了一个参数, 其他是默认参数}{显示排序结果}Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(IntToStr(arr[i])); end;// TArray.Sort 的第二个参数是 IComparer<T> 类型, 其默认值是: TComparer<T>.Defaultprocedure TForm1.Button2Click(Sender: TObject);vararr: array of Integer;i: Integer;beginRandomize;for i := 0to9do beginSetLength(arr, Length(arr)+1);arr[i] := Random(10);end;Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(IntToStr(arr[i])); {使用了排序器的默认值排序, 这和忽略这个参数是一样的}TArray.Sort<Integer>(arr, TComparer<Integer>.Default);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(IntToStr(arr[i])); end;//同上两例, 变通了一下写法procedure TForm1.Button3Click(Sender: TObject);vararr: array of Integer;i: Integer;Comparer: IComparer<Integer>;beginRandomize;for i := 0to9do beginSetLength(arr, Length(arr)+1);arr[i] := Random(10);end;Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TComparer<Integer>.Default;TArray.Sort<Integer>(arr, Comparer);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(IntToStr(arr[i])); end;// TArray.Sort 的后面两个参数可以指定排序范围:procedure TForm1.Button4Click(Sender: TObject);vararr: array of Integer;i: Integer;Comparer: IComparer<Integer>;beginRandomize;for i := 0to9do beginSetLength(arr, Length(arr)+1);arr[i] := Random(10);end;Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TComparer<Integer>.Default;{这里指定从第 1 个元素开始, 只给 3 个元素排序}TArray.Sort<Integer>(arr, Comparer, 0, 3);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(IntToStr(arr[i])); end;//如果要倒排序, 可以建立自己的排序器, 下面就是先构建并实现了一个TMyComparer, 然后调用:typeTMyComparer = class(TComparer<Integer>)publicfunction Compare(const Left, Right: Integer): Integer; override; end;{ TMyComparer }function pare(const Left, Right: Integer): Integer;beginResult := Right - Left;end;procedure TForm1.Button5Click(Sender: TObject);vararr: array of Integer;i: Integer;Comparer: TMyComparer;beginRandomize;for i := 0to9do beginSetLength(arr, Length(arr)+1);arr[i] := Random(10);end;Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(IntToStr(arr[i])); Comparer := TMyComparer.Create;TArray.Sort<Integer>(arr, Comparer);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(IntToStr(arr[i])); Comparer.Free;end;// 也可以用 TComparer<T>.Construct 方法, 通过一个 TComparison 格式的函数构建排序器, 这样简单一些function MyFunc1(const Left, Right: Integer): Integer;beginResult := Right - Left;end;procedure TForm1.Button6Click(Sender: TObject);vararr: array of Integer;i: Integer;Comparer: IComparer<Integer>;beginRandomize;for i := 0to9do beginSetLength(arr, Length(arr)+1);arr[i] := Random(10);end;Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(IntToStr(arr[i]));Comparer := TComparer<Integer>.Construct(MyFunc1);TArray.Sort<Integer>(arr, Comparer);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(IntToStr(arr[i])); end;//如果是给自定义类型的元素排序, 只能是自建排序器typeTPerson = recordname: string;age: Word;end;function MyFunc2(const Left, Right: TPerson): Integer;beginResult := Left.age - Right.age;end;procedure TForm1.Button7Click(Sender: TObject);vararr: array of TPerson;i: Integer;Comparer: IComparer<TPerson>;beginSetLength(arr, 4);arr[0].name := 'AA'; arr[0].age := 22;arr[1].name := 'BB'; arr[1].age := 33;arr[2].name := 'CC'; arr[2].age := 44;arr[3].name := 'DD'; arr[3].age := 11;Memo1.Clear;for i := 0to Length(arr) - 1doMemo1.Lines.Add(Format('%s : %d', [arr[i].name, arr[i].age]));Comparer := TComparer<TPerson>.Construct(MyFunc2);TArray.Sort<TPerson>(arr, Comparer);Memo2.Clear;for i := 0to Length(arr) - 1doMemo2.Lines.Add(Format('%s : %d', [arr[i].name, arr[i].age])); end;// TStringComparer.Ordinal 是官方实现的用于 string 的排序器, 可直接使用.//但它好像有问题(Delphi 2010 - 14.0.3513.24210), 以后的版本应该能改过来.procedure TForm1.Button8Click(Sender: TObject);vararr: array of string;i: Integer;beginSetLength(arr, 4);arr[0] := '222';arr[1] := '111';arr[2] := 'bbb';arr[3] := 'aaa';Memo1.Clear;for i := 0to Length(arr) - 1do Memo1.Lines.Add(arr[i]); TArray.Sort<string>(arr, TStringComparer.Ordinal);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(arr[i]); end;//下面是实现字符串数组的到排序function MyComparerFunc(const s1,s2: string): Integer;beginResult := CompareText(s2, s1);//Result := -CompareText(s1, s2); {或者这样}end;procedure TForm1.Button9Click(Sender: TObject);vararr: array of string;i: Integer;Comparer: IComparer<string>;beginMemo1.Clear;maText := '11,33,22,AAA,CCC,BBB';SetLength(arr, Memo1.Lines.Count);for i := 0to Length(arr) - 1do arr[i] := Memo1.Lines[i]; Comparer := TComparer<string>.Construct(MyComparerFunc); TArray.Sort<string>(arr, Comparer);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(arr[i]); end;//可以把上一个程序简写为:procedure TForm1.Button10Click(Sender: TObject);vararr: array of string;i: Integer;Comparer: IComparer<string>;beginMemo1.Clear;maText := '11,33,22,AAA,CCC,BBB';SetLength(arr, Memo1.Lines.Count);for i := 0to Length(arr) - 1do arr[i] := Memo1.Lines[i]; Comparer := TComparer<string>.Construct(function (const s1,s2: string): IntegerbeginResult := CompareText(s2, s1);end);TArray.Sort<string>(arr, Comparer);Memo2.Clear;for i := 0to Length(arr) - 1do Memo2.Lines.Add(arr[i]); end;。
Delphi教程(完整版)

4.丰富的VCL
VCL是Delphi7最重要的组成部分,包含不
同种类的组件 。
A
18
1.2.4 帮助的使用
(1)当遇到问题时,可以尝试按下【F1】键, 一般情况下Delphi都会准确地定位。
(2)如果需要浏览系统的一些帮助内容,比 如说对象Pascal语言,可以通过菜单【Help】 |【Delphi Help】 命 令 打 开 【 帮 助 主 题 : Delphi Help】对话框,在目录标签中展开相 关条目,进行系统学习。
◆Delphi 4提供了Object Pascal语言的扩展 ,但 系统稳定性较差 。
◆1999年推出Delphi 5增强了数据库的功能
◆2001年6月推出Delphi 6 ,增加了大量的新 组件,使组件数目达350多个,以满足网络开 发的需要。
◆2002年8月推出 Delphi 7 ,在集成开发环境 IDE、Web、数据库、编译器、模型生成支持 及组件库等很多方面进行了改进
对象观察器类包括Properties选项卡和 Events选项卡
A
9
下图两个对象观察器,左边一个按种类排序, 右边一个按名字排序。
图1-5 按种类或名称查看Object Inspector
注意:帮助系统是和对象观察器紧密结合在一
起的,想了解某个属性或事件的帮助信息,
只要在该属性或事件上按下F1 键
A
20
(6)在Delphi集成开发环境中,通过【Help】 |【Customize】命令可以打开【Open Help】 窗口,在该窗口中可以对帮助文件进行管理, 其中包括帮助内容、帮助索引、链接位置和 帮助工程文件等的管理。
1.3 简单Delphi程序设计
Delphi 7编写应用程序包括新建应用程序、 设置窗体属性、添加组件、设置组件属性、 添加事件、编写事件响应代码、ows SDK】打开帮助文件Win32.hlp,在【索引】 选项卡中查找。
第一章 Delphi快速入门(四)

第一章Delphi快速入门(四)第一章Delphi快速入门(四)1.3.4.2 Shape部件图形部件Shape在前文中我们已有了解,它可以处理多种几何形状,通过设置Pen和Brush的嵌套属性,可以设置图形边框颜色、线型及图形的风格、填充方式、贴图方式等。
1.3.4.3 PaintBox部件在System页上还有一个PaintBox(绘图框)部件,它在窗体上为您提供一块可供绘图的区域。
这一部件需要编程实现它的功能,一个只有在运行时才有效的重要属性Canvas是完成绘图的关键。
PaintBox 部件不能单独存在于窗体中,必须把它放在固定的分组部件中。
1.3.5 关系图、文件列表部件1.3.5.1 OutLine部件OutLine(略图)部件在Win 3.1页上,它适用于显示分层的数据、文本。
在Delphi中,略图部件具有很宽的设置范围。
它的Lines属性可以设置每一词条的文本或数据。
一般一个空格相当于一个层次,如果在项目前加一个空格则表示它处于树的下一层。
所以在进行Lines属性编辑的时候不能用Tab键。
在编程时用Lines和Items属性来访问略图的名称、索引及完整的路径名。
OutLineStyle属性用来配置显示时关系图的风格,您可以选定用旁边有图标的缩进方式,也可以选择连线方式。
1.3.5.2 目录访问部件Delphi为您提供了强大的文件目录访问部件。
您可以针对具体的用途设计自定义的文件对话框。
在部件选项板上选中System页,您将发现这些部件,它们是文件列表框FileListBox、目录列表框DirectoryListBox、驱动器下拉式列表框DriveComboBox和过滤式下拉列表框FilterComboBox部件。
文件列表框部件FileListBox显示当前目录中的文件,缺省的设置是显示所有文件。
通过改变Mask属性来设置过滤器,可以适用DOS的标准通配方式,选择要显示的文件名。
当指定多个过滤器时,之间用“;”隔开。
Delphi程序设计教程 第1章 Delphi概述

打开一新的项目后,Delphi对主窗体中的单元,在代 码编辑器中添加一页标签。 1. 单元(Unit) 单元为一独立的可编译的代码模块,其中包含有 公共的部分(界面部分)和局部部分(实现部分)。
Delphi中的每一窗体都有与之相联系的单元。
单元的源代码保存在.PAS文件中,编译后的文件 为.DCU,连接.DCU文件后的执行文件为单个的.EXE 或.DLL文件。
进入Delphi后(图1-1),首先看到的有四个在前 景的窗口与一个隐藏在后的窗口,它们为: · 主窗口:位于屏幕的顶部,即标题为Delphi 6Project1的窗口,它包括菜单、工具栏、组件选项板
(Component Palette)等。
· 窗体(Form)窗口:位于屏幕的右边,即标题为 Form1的窗口。 · 对象编辑器:位于屏幕的左下部,即标题为 Object Inspector的窗口。
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) MainMenu1: TMainMenu; private { Private declarations } public { Public declarations } end;
1.4 程序的基本结构
在Delphi的集成开发环境中是通过项目(Project)的
方式来组织和管理应用程序开发过程中的各类文件。 1.4.1 项目与项目文件 从Delphi 5.0开始出现了项目组(Project Group)的 概念,项目组是由多个项目组成的,使用项目组可将
在设计阶段彼此独立但在后来的应用中经常发生各种
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
马可坎图Delphi2010HandbookA Guide to the New Features of Delphi 2010; upgrading from Delphi 2009 阿2010年指南德尔福的新特点,2009年升级从德尔福Piacenza (Italy), February 2010 皮亚琴察(意大利),2010年2月作者:马可坎图Publisher: Wintech Italia Srl, Italy 出版商:文晔科技意大利Srl公司,意大利编辑:彼得西澳木技术审稿:奥尔赫弗里克,丹尼尔特提,马可波罗布雷韦列里,Chirs本森,Stefan Van As 凡由于斯特凡封面设计:法布里奇奥斯基亚维版权所有2009-2010马可波罗坎图,皮亚琴察,意大利。
世界版权所有。
The author created example code in this publication expressly for the free use by its readers. 本出版物中的代码示例创建作者明确为读者免费使用。
The source 消息来源code for this book is copyrighted freeware, distributed via the web site 该书受版权保护的代码,这是免费软件,通过网络站点分布 . 。
The copyright prevents you from republishing the code in print 版权防止打印你从代码重新发布media without permission. 媒体未经允许。
Readers are granted limited permission to use this code in their applications, 读者只获得有限的允许使用他们的应用程序代码中,as long at the code itself is not distributed, sold, or commercially exploited as a stand-alone product. 只要在代码本身没有分发,出售,或商业产品开发为一个独立的。
Aside from this specific exception concerning source code, no part of this publication may be stored in a 除了这一特定的异常有关源代码,没有出版的一部分,这可能是存储在retrieval system, transmitted, or reproduced in any way, in the original or in a translated language, 检索系统,传送,或以任何方式复制,在最初的或在翻译的语言,including but not limited to photocopy, photograph, magnetic, or other record, without the prior agreement 包括但不限于影印,摄影,磁性或其他记录,未经事先同意and written permission of the publisher. 与出版商的书面许可。
Delphi is a trademark of Embarcadero Technologies. 德尔福是一个技术商标恩巴克德罗。
Windows Vista and Windows Seven are trademarks Windows Vista和Windows 7是商标of Microsoft. 微软。
Other trademarks are of the respective owners, as referenced in the text. 其他商标是其各自所有者,作为文本中引用。
The author 撰文and publisher have made their best efforts to prepare this book, and the content is based upon the final 和出版者都尽最大努力准备这本书,内容是根据最后的release of the software. 发布该软件。
The author and publisher make no representation or warranties of any kind with 作者和出版商作出任何陈述或保证的任何一种regard to the completeness or accuracy of the contents herein and accepts no liability of any kind including 关于完整性或内容的准确性,并接受了本不包括任何种类的法律责任but not limited to performance, merchantability, fitness for any particular purpose, or any losses or 但不限于性能,适销性或适合作任何特定用途,或任何损失damages of any kind caused or alleged to be caused directly or indirectly from this book. 任何一种造成的损失或据称造成直接或间接地来自这本书。
书号:1450597262(的EAN - 13:9781450597265)2010年德尔福手册,第一版,修订版。
电子版的授权许可恩巴克德罗技术公司和与销售的FastSpringPlimus,闻亭上Srl公司代表意大利。
下载或任何其他销售渠道可能是非法的。
这不是一个自由的电子书,不要散布它(即使你免费获得,如果从恩巴克德罗技术)。
在印刷复制品的出售就这本书。
更多信息和购买/dh2010连结。
马可坎图,2010年德尔福手册奉献- 3献给我的两个精彩的孩子,Benedetta和雅格布,和他们可爱的母亲,利亚马可坎图,2010年德尔福手册4 -奉献马可坎图,2010年德尔福手册导言- 5介绍随着单位建立独立的部分内的CodeGear业务Borland和业务部门出售后向恩巴克德罗技术,德尔福已出现了投资大幅增加,并再次成为增长和充满活力的新产品由于其技术特点和一开发者社区的感情愈来愈士气,经过数年的缓慢增长和能力方面的激情和不断萎缩。
恩巴克德罗投入了比在Delphi Borland公司几乎没有了整个生命的产品,并提高它的方式向社会伸出。
长期以来被认为是“它的现金牛”几乎没有未来,该产品战略显然是要在中心恩巴克德罗工具的开发,重点突出对本地的跨平台开发(这是将成为方向未来版本的Delphi,根据当前的产品路线图1)。
2010年德尔福在这个方向是另一个非常重要的一步,在令人印象深刻德尔福2009年和2007年德尔福一个比较好的释放。
从增加的RTTI 支持IDE的一个显着改善,从开放到新的数据库(如火鸟),以支持日益增长的对REST标准像(),2010年德尔福远远超过了增量的新版本。
及其扩展支持Win32平台,使最新的德尔福的最佳工具,但至今。
本机德弗尔-1最近德尔福路线图写作,在此其时,可以发现:/article/39934马可坎图,2010年德尔福手册6 -简介opment为Windows 7。
通过投入超过100页的一对夫妇该产品的新功能,这本书是一个重大的证词德尔福的延伸版本提供给开发者。
我的德尔福手册系列经过长期的一系列通过Sybex掌握德尔福图书第一(出版然后威利,当它收购Sybex),在过去的几年里,我已经把精力集中于该产品的特定版本的图书奉献个人的新功能。
德尔福手册系列不掩饰德尔福从地面,但只侧重于新的功能。
到时候你正在阅读这一点,应该可以购买“ 重印一些”的我的经典德尔福书,买我的掌握以及德尔福7年或2005年从网上和传统的分销商。
我的基本产品是必要的帕斯卡尔2。
德尔福2007手册,包括我自己第一次出版,册新功能德尔福德尔福7日至2007年更新,从IDE到语言扩展,重点在Windows Vista的支持和对数据的dbExpress访问库。
这是章节列表中:•在Delphi 2007 IDE中•重构和代码模板•项目管理和MSBuild•调试器•德尔福公司最近更新的语言•核心的RTL变化•在变化了的VCL•内存管理(和强大的应用程序)•视窗远景和VCL•数据库支持和的dbExpress四•InstallAware和其他工具•改造工程到2007年德尔福二是基本帕斯卡尔引入了Pascal语言的核心功能。
重点是对传统的语言结构,不包括面向对象编程。
更多信息在书页:/epascal 马可坎图,2010年德尔福手册导言- 7德尔福2009年手册上有一个长的路段和Unicode的钻研到泛型和匿名的重大变化的语言,其中包括方法。
也有部分的丝带和用户界面新的DataSnap多层建筑。
这是章节列表:•什么是Unicode?•Unicode字符串类型•移植到Unicode•新的IDE功能•泛型•匿名方法•更多的语言和RTL的变化•VCL的改进•COM支持在Delphi 2009•功能区•数据集和的dbExpress•的DataSnap 2009在过去的两年德尔福手册正在印制和销售形式都在露露的亚马逊,而电子版可在网上购买。
关于后续环节书页购买印刷或电子版本:/dh2007/dh2009德尔福2010年手册目前该书的新特点,继续就这一传统为重点德尔福2010年。
因此,如果您要升级从一个旧版本产品,你可能想读的一个或两个前3个前手册。
没有一个具体的重点在这本书,因为没有一个在Delphi 2010。
该的推出,使一些最近完成的功能改进,如支持对Win32的API(与Windows 7的具体重点)和新的DataSnap建筑最初引进德尔福2009年(现在的HTTP支持)。
3我可以创建一个全方位的手册收集,但仍然不是一个公司计划,也可能不会发生。
马可坎图,德尔福2010手册8 -简介产品的一个基础是它的新的和扩展的RTTI支持列入语言帕斯卡尔在对象属性时,以一个主题最长的篇章。
还有一个重大改版和调试器在IDE中,一些易于使用的功能,以及其他更为复杂的理解和配置IDE的扩展使用德尔福打开工具的API。
不用说这一切的书籍封面,和一些。
这里是清单表各章的内容,与更多的细节可用:•1。
一个更好的IDE•2。
调试器•3。
RTTI和扩展属性•4。
更多的编译器和RTL•5。
VCL的和Windows 7•6。