delphi学习.docx
《delphi学习.docx》由会员分享,可在线阅读,更多相关《delphi学习.docx(23页珍藏版)》请在冰豆网上搜索。
delphi学习
Delphi学习心得
一、IDE界面
Delphi是Inprise公司推出的基于对象Pascal语言的可视化集成开发工具。
利用Delphi编程,可以快速、高效地开发出基于Windows环境的各类程序,尤其在数据库和网络方面,Delphi更是一个十分理想的软件开发平台。
最新版本:
Delphi2006(10.0)
商友3.x使用版本Delphi2.0
商友4.5、5.2使用版本Delphi6.0
1、主窗口:
(1)标题栏
标题栏中显示了当前的工程名,标题栏位于最上部。
(2)主菜单
通过主菜单可以实现集成开发环境中的绝大部分命令,愿意的话可以逐个浏览、使用一下主菜单中所有的命令。
其中Delphi在主菜单栏中将“Component”(组件)和“Database”(数据库)作为独立的菜单项列出来,可以看出,利用Delphi进行程序开发,组件和数据库将是两个非常重要的方面。
(3)工具栏
工具栏上的每个按钮都实现了IDE的某项功能,诸如打开文件或创建项目等。
(4)组件栏
组件面板包含了IDE中安装的所有的VCL组件和ActiveX控件。
各选项页和组件在面板中的顺序和外观可以通过右击它或从主菜单中选择Component|configurePalette进行调整。
在利用Delphi开发应用程序的过程中,正确、合理、恰当地使用组件非常重要。
2、窗体设计器
窗体设计器刚开始的时候是一个空白的窗口。
可以把窗体设计器看作是艺术家的画布,在这块画布上可以描绘出各种各样的Windows应用程序。
应用程序的用户界面正是由窗体实现的。
只要从组件面板上选择一个组件并把它放到你的窗体上,就能够实现与窗体设计器的交互。
可以用鼠标调整组件在窗体设计器上的位置和大小,还可以用ObjectInspector和代码编辑器来控制组件的外观和行为。
3、对象编辑器(ObjectInspector)
对象编辑器的功能是实现对象(尤其是组件)的属性设置,创建事件处理过程并进行管理。
利用ObjectInspector,可以修改窗体或组件的属性,或者使它们能够响应不同的事件。
属性(property)是一些数据,如高度、颜色、字体等,它们决定了组件在屏幕上的外观。
事件(event)则是一种消息处理机制,它能够捕捉某种情况的发生并做出反应,像鼠标单击和窗口重画就是两种典型的事件。
至于ObjectInspector中显示哪个组件的属性和事件,取决于在窗体设计器中当前选择哪个组件。
对象编辑器分为下面的三个部分:
①对象列表
对象列表是一个组合框,包含了当前窗体上的所有组件。
有时一些组件因为太小或没有明显的标志,利用鼠标点击不容易选中,这时可以利用对象列表组合框来选择该组件。
②属性页(Property)
属性页中列举了当前被选中的对象(比如说组件)的属性。
可以在程序设计的过程中直接对这些属性进行修改,也可以在程序运行期间通过代码进行修改。
在有些属性的前面有一个带有方框的加号标志,表明该属性是由一些子属性组成的。
点击该加号标志就可以展开该属性,同时加号标志变成了一个带有方框的减号标志。
③事件页(Event)
通常情况下,事件处理过程为空。
可以双击事件右面的组合框来添加事件的处理过程。
如果要共用已存在的事件处理过程,可通过下拉式组合框进行选择。
4、代码编辑器(CodeEditor)和代码浏览器(CodeExplorer)
代码编辑器是输入代码来指定应用程序行为的地方,也是Delphi根据应用程序中的组件自动生成代码的地方。
代码编辑器类似于一个多页的笔记本,每一页对应着一个源代码模块或文件。
当向应用程序中加入一个窗体时,Delphi会自动创建一个新的单元,并添加到代码编辑器顶部的标签中。
代码编辑器为代码的输入和编辑提供了一个方便的环境。
代码识别技术
通过代码浏览器可以在代码编辑器中快速地定位,并可以在其中将定义的类完善。
5、信息窗口(MessageView)
信息窗口在代码浏览器窗口和代码编辑器窗口的下部,在编译和链接过程中出现的一些信息将显示在信息窗口中。
如果双击信息窗口中的信息条目,当前位置将定位到代码编辑器中导致问题的代码处。
6、集成调试器
当程序编译、链接通过以后就可以运行,只是在一些地方与当初的预想不同。
此时,可以利用集成调试器来解决问题,找出可能存在逻辑错误的地方。
通常,可以在可能存在问题的代码处设置一些“断点”,程序执行到断点处就自动暂停,并转到代码编辑器中设置了断点的代码处。
此时,可以通过“单步执行”将语句一条一条地执行下去。
在执行的过程中,同时可以查看一些变量的数值,也可以查看堆栈、CPU、汇编代码和当前运行的线程等情况,然后找出代码错误的地方并加以改正。
1设置/去除断点
断点的设置可以在程序调试前进行,也可以在程序调试期间进行。
设置/去除断点最简单的方法是在代码编辑器中,按F5键或利用鼠标点击代码行左边的灰色竖条处。
2单步执行
当程序运行到断点处暂停后,可以按F8键或通过菜单命令Run|StepOver单步执行下去。
如果遇到过程或函数调用,程序将一次执行完成。
按下F7键或选择菜单命令Run|TraceInto,可以在遇到过程或函数调用的时候,进入过程或函数的内部。
3查看信息
在调试过程中,如果想查看某个变量的数值,可以在程序暂停的情况下,在代码编辑器中将鼠标移动到这个变量上稍停一下,就会出现一个小窗口显示该变量的数值。
通过菜单命令Run|AddWatch也可以对变量的数值进行查看,同时还会出现一个WatchList对话框。
在程序单步执行的情况下,在代码编辑器中单击鼠标右键,选中弹出菜单的Debug|ViewCPU命令,将弹出CPU对话框显示当前CPU的有关情况。
此外,在程序单步执行时,通过菜单命令View|DebugWindows|Threads可以弹出ThreadStatus对话框,对当前运行的线程进行查看。
4中止运行
在程序调试期间,可能会由于代码的问题,程序在运行时停在了某个地方而不继续下去。
这时可以按Ctrl+F2键或通过菜单命令Run|ProgramReset来终止程序的运行。
二、基本语法
Delphi中使用的面向对象pascal编程语言并不是borland公司1995年发布可视化开发环境Delphi时才有的,它只是已有borlandpascal产品的简单扩展。
Borland没有发明pascal,但它推广并扩展了pascal。
1、注释
在Pascal中,注释括在大括号中或带星号的圆括号中。
Delphi也认可C++风格的注释,即把注释放在双斜线后。
例如
{thisisacomment}
(*thisisanothercomment*)
//thisisacommentuptotheendoftheline
此外,编译器不编译代码中的空格、空行和Tab键空格,这些元素通称为空白,它们只用来提高代码的可读性,不影响编译过程。
在注释行前留一行空白,或把长的代码句分成较小的部分,这样能提高代码的可读性。
使用大写字母
Pascal编译器(不象其他语言的编译器)不考虑字符的大小写,因此标识符Myname、MyName、myname、myName、和MYNAME是完全相同的。
总体上来说,这是Pascal的一大优点,因为在大小写敏感的语言中,许多语法错误是由不正确的大写引起的。
不过Pascal语言的大小写不敏感特性有一个例外:
控件包中的Register过程必须以大写字母R开始,因为需要与C++Builder兼容。
然而大小写不敏感也有不便之处:
第一,你必须注意大小写不一致的标识符实际上是相同的,以避免把他们当成不同的元素使用;第二,你必须尽量保持大写使用的一致性,以提高代码的可读性。
2、变量
Pascal变量在使用前必须声明,声明变量时必须指定一种数据类型。
下面是变量声明的例子:
var
Value:
Integer;
IsCorrect:
Boolean;
A,B:
Char;
关键字var可以在许多地方使用,例如放在函数或过程的开始部分,用来声明函数或过程的局部变量;也可以放在单元中,用于声明全程变量。
var关键字之后是一组变量名列表,每个变量名后跟一个冒号和数据类型名,一行中可以声明多个变量,如上例中最后一句。
一旦变量的类型被指定,你只能对变量执行该变量类型支持的操作。
例如,在判断操作中用布尔值,在数字表达式中用整型值,你不能将布尔值和整型值混用(在C语言中可以这样)。
使用简单的赋值语句,可写出下面的代码:
Value:
=10;
IsCorrect:
=True;
但下面的语句是不正确的,因为两个变量数据类型不同:
Value:
=IsCorrect;//error
在Delphi中编译这句代码,会出现错误信息:
Incompatibletypes:
'Integer'and'Boolean'.(类型不兼容:
‘整型’和‘布尔型’)。
象这样的错误通常是编程错误,因为把一个True或False的值赋给一个整型变量没有什么意义。
你不该责怪Delphi提示这样的错误信息,代码中有不对的地方Delphi当然要提出警告。
把变量的值从一种类型转换到另一种类型往往不难做到,有些情况下类型转换会自动实现,不过一般情况下需要调用特殊的系统函数,通过改变数据内部表示来实现类型转换。
在Delphi中,当你声明全程变量时,你可以赋给它一个初值。
例如,你可以这样写:
var
Value:
Integer=10;
Correct:
Boolean=True;
这种初始化方法只能用于全程变量,不能用于过程或方法的变量。
3、常量
对于在程序运行期间保持不变的值,Pascal允许通过常量来声明。
声明常量不必特定数据类型,但需要赋一个初值。
编译器会根据所赋初值自动选用合适的数据类型。
例如:
const
Thousand=1000;
Pi=3.14;
AuthorName='MarcoCantù';
Delphi根据常量的值来决定它的数据类型。
上例中的Thousand变量,Delphi会选用SmallInt数据类型(短整型--能容纳Thousand变量的最小整数类型)。
如果你想告诉Delphi采用特定的类型,你可在声明中加入类型名,方法如下:
const
Thousand:
Integer=1000;
对于声名的常量,编译器有两种编译选择:
第一种为常量分配内存,并把常量的值放入内存;第二种在常量每次使用时复制常量值。
第二种方法比较适合简单常量。
资源串常量
当定义字符串常量时,你可这样写:
const
AuthorName='MarcoCantù';
从Delphi3开始,你可以用另一种方式写:
resourcestring
AuthorName='MarcoCantù';
上面两个语句都定义了一个常量,也就是定义了一个在程序运行期间保持不变的值,但两者的实现过程却不同,用resourcestring指令定义的字符串变量将被保存到程序资源的字符串表中。
从例子ResStr你可了解资源串的实际作用,例子中设置了一个按钮,相应代码如下:
resourcestring
AuthorName='MarcoCantù';
BookName='EssentialPascal';
procedureTForm1.Button1Click(Sender:
TObject);
begin
ShowMessage(BookName+#13+AuthorName);
end;
以上代码中的两个字符串将分两行输出显示,因为字符串被分行符#13隔开。
有趣的是,当你用资源编辑器打开执行文件时,你会在程序资源中看到你所定义的字符串。
这意味着字符串并没有进入编译代码,而是保存在执行文件(EXE文件)的一个单独区域。
注意:
简而言之,采用资源的好处一方面可让Windows来完成有效的内存处理,另一方面不用更改源代码就可实现程序的本地化(把字符串翻译成不同的语言)。
4、数据类型
ascal中有多种预定义的数据类型,它们可分为三大类:
有序数据类型,实数类型和字符串类型。
有序类型
有序数据类型是建立在概念“顺序”或“序列”基础上的数据类型。
你不仅可比较两个有序值的大小,而且可以求取给定有序值的前驱及后继,或者计算它们的最大或最小值。
三种最重要的预定义有序类型是整数类型、布尔类型和字符类型(Integer,Boolean,Char)。
各种类型根据其内部表示和取值范围不同又可进一步细分。
实数类型
实数类型代表不同格式的浮点数。
Single类型占的字节数最小,为4个字节;其次是Double浮点类型,占8个字节;Extended浮点类型,占10个字节。
这些不同精度的浮点数据类型都与IEEE(电气和电子工程师协会)标准的浮点数表示法一致,并且CPU数字协处理器直接支持这些类型,处理速度也最快。
注意:
Delphi带有一个Math单元,其中定义了一些高级数学例程,这些例程包括三角函数(如ArcCosh函数)、金融函数(如InterestPayment函数)和统计函数(如MeanAndStdDev过程)。
有些例程,它的名字听起来很怪,如MomentSkewKurtosis例程,它是作什么用的呢?
还是留你自己查吧。
Delphi也用实型数表示日期和时间数据。
但为了更准确起见,Delphi特别定义了TDateTime数据类型,这是一个浮点类型,因为这个类型必须足够宽,使变量能容纳年、月、日、时、分和秒、甚至毫秒。
日期值按天计数,从1899-12-30开始,放在TDateTime类型的整数部分;时间值则位于十进制数的小数部分。
字符串类型
在Borland公司的TurboPascal和16位Delphi中,传统的字符串类型是一个字符序列,序列的头部是一个长度字节,指示当前字符串的长度。
由于只用一个字节来表示字符串的长度,所以字符串不能超过255个字符。
这一长度限制为字符串操作带来不便,因为每个字符串必须定长(确省最大值为255),当然你也可以声明更短的字符串以节约存储空间。
字符串类型与数组类型相似。
实际上一个字符串差不多就是一个字符类型的数组,因为用[]符号,你就能访问字符串中的字符,这一事实充分说明了上述观点。
为克服传统Pascal字符串的局限性,32位Delphi增加了对长字符串的支持。
这样共有三种字符串类型:
ShortString短字符串类型也就是前面所述的传统Pascal字符串类型。
这类字符串最多只能有255个字符,与16位Delphi中的字符串相同。
短字符串中的每个字符都属于ANSIChar类型(标准字符类型)。
ANSIString长字符串类型就是新增的可变长字符串类型。
这类字符串的内存动态分配,引用计数,并使用了更新前拷贝(copy-on-write)技术。
这类字符串长度没有限制(可以存储多达20亿个字符!
),其字符类型也是ANSIChar类型。
WideString长字符串类型与ANSIString类型相似,只是它基于WideChar字符类型,WideChar字符为双字节Unicode字符。
用户自定义数据类型
Pascal语言的一个重要特征是它能自定义数据类型。
通过各种类型构造器,你可以定义自己的数据类型,如子界类型、数组类型、记录类型、枚举类型、指针类型和集合类型。
最重要的用户定义数据类型是类(class),类是ObjectPascal的面向对象扩展部分,本书不讨论这部分。
命名及不命名的类型
为了后续使用或直接用于变量,需要给自定义类型命名。
如果自定义一个命名的类型,你必须将代码放在特定的type区,如下所示:
type
//subrangedefinition
Uppercase='A'..'Z';
//arraydefinition
Temperatures=array[1..24]ofInteger;
//recorddefinition
Date=record
Month:
Byte;
Day:
Byte;
Year:
Integer;
end;
//enumeratedtypedefinition
Colors=(Red,Yellow,Green,Cyan,Blue,Violet);
//setdefinition
Letters=setofChar;
你也可使用类型定义构造器直接定义一个变量,此时无需显式命名,如下面的代码:
var
DecemberTemperature:
array[1..31]ofByte;
ColorCode:
array[Red..Violet]ofWord;
Palette:
setofColors;
注意:
一般来说,你应该避免使用上述不命名类型,因为你不能把它们作为参数传给例程,也不能用于声名同一类型的其他变量。
实际上,Pascal的类型兼容规则是基于类型名的,而不是基于实际的类型定义。
两个类型相同的变量仍有可能是不兼容的,除非他们的类型有完全相同的名字。
对于不命名类型,需要编译器给它分配一个内部名字,因此对于数据结构复杂的变量,要习惯于定义命名数据类型,你一定不会为此白费工夫的。
5、语句
简单语句和复合语句
Pascal简单语句中不包含任何别的语句,赋值语句和过程调用即是简单语句的例子。
简单语句用分号隔开,如下所示:
X:
=Y+Z;//assignment
Randomize;//procedurecall
用begin和end将简单语句括起来即组成复合语句,复合语句用法与普通的Pascal语句相同,见下例:
begin
A:
=B;
C:
=A*2;
end;
end之前的最后一条语句末尾分号不是必需的。
赋值语句
在Pascal语言中赋值语句用冒号-等号操作符“:
=”,对使用其他语言的编程人员来说这是一个奇怪的符号。
在其他语言中用作赋值符号的“=”在Pascal中用作关系运算符,用于判断是否相等。
条件语句
条件语句通过条件检测,判断是否执行该条件语句中包含的语句。
条件语句可有两种基本形式:
if语句和case语句。
If语句
对if-then型语句,仅当条件满足时,语句才执行;对if-then-else型,if语句在两条语句中选择一条执行。
条件用布尔表达式建立。
Case语句
如果你的if语句变得非常复杂,有时可以用case语句代替它。
case语句包括用来选值的表达式、可能值序列或一个取值范围。
这些值应该是常量,并且它们必须唯一,而且应属于有序类型。
Case语句最后可以带一个else语句,当没有一个标签与选择器的值一致时,执行else语句。
caseNumberof
1:
Text:
='One';
2:
Text:
='Two';
3:
Text:
='Three';
end;
Pascal语言中的循环
其它编程语言中使用的循环语句,Pascal语言中都有,它们包括for、while和repeat语句。
如果你用过其他编程语言,你会发现Pascal中的循环语句没什么特别的。
For循环
Pascal中的for循环严格地建立在计数器基础上,循环每执行一次,计数器不是增加一个值就是减小一个值。
下面是一个for语句的简例,用来将前十个数加起来:
var
K,I:
Integer;
begin
K:
=0;
forI:
=1to10do
K:
=K+I;
同样的for语句可以用正好相反的计数器来写:
var
K,I:
Integer;
begin
K:
=0;
forI:
=10downto1do
K:
=K+I;
Pascal中的for循环语句其灵活性比其他语言小(它不能指定1之外的步长),不过简单也容易理解。
如果需判断的条件比较复杂,或想自定义计数器,你可以用while语句或repeat语句,而不是for循环语句。
注意:
for循环计数器不必非是数字,它可以是任何有序类型的值,例如一个字符或一个枚举类型值。
while语句和repeat语句
while-do循环语句和repeat-until语句的不同点在于repeat循环语句的代码至少要执行一次。
从下面的简例很容易理解这一点:
while(I<=100)and(J<=100)do
begin
//useIandJtocomputesomething...
I:
=I+1;
J:
=J+1;
end;
repeat
//useIandJtocomputesomething...
I:
=I+1;
J:
=J+1;
until(I>100)or(J>100);
从上可见即使I或J的初始值大于100,repeat-until循环中的代码也仍会执行一次。
注意:
两种循环另一个关键的不同点是,repeat-until循环的条件是反向的条件,只要不满足这个条件,循环就执行;当条件满足时,循环终止。
这正好与while-do循环相反,while-do循环当条件是真值时才执行。
为此,我不得不在上面代码中用反向条件来获得相同的结果。
With语句
我要讲的最后一种Pascal语句是With语句,With语句是Pascal编程语言独有的语句,不过最近JavaScript和VisualBasic也添加了这种语句,它在Delphi程序设计中很有用。
With语句是一种用于简化代码的语句。
如你要访问一个记录类型变量(或一个对象),用With语句就不必每次重复变量的名字。
例如对于以下的记录类型代码:
type
Date=record
Year:
Integer;
Month:
Byte;
Day:
Byte;
end;
var
BirthDay:
Date;
begin
BirthDay.Year:
=1997;
BirthDay.Month:
=2;
BirthDay.Day:
=14;
可以用with语句改进后半部分代码,如下:
begin
withBirthDaydo
begin
Year:
=1995;
Month:
=2;
Day:
=14;
end;
6、过程与函数
Pascal中的例程有两种形式:
过程和函数。
理论上说,过程是你要求计算机执行的操作,函数是能返回值的计算。
两者突出的不同点在于:
函数能返回计算结果,即有一个返回值,而过程没有。
两种类型的例程都可以带多个给定类型的参数。
不过实际上函数和过程差别不大,
缺省参数
Delphi4中添加了一个新功能,即允许你给函数的参数设定缺省值,这样调用函数时该参数可以加上,也可以省略。
下例把应用程序全程对象的MessageBox方法重新包装了一下,用PChar替代字符串,并设定两个缺省值:
procedureMessBox(Msg:
string;
Ca