Delphi面向对象的编程方法Word文档下载推荐.docx
《Delphi面向对象的编程方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Delphi面向对象的编程方法Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
end;
当按动按钮后赋值语句被执行,编辑框变成红色。
在语句中,部件的名称在属性前,中间用“.”表示属性的所属关系。
这样就准确地指定了要将clRed值赋给哪一部件的哪一属性。
赋值号为“:
=”,不论给属性还是给变量赋值,都是将右边的值赋给左边的属性或变量。
当将一个属性值、变量、常量或文本数据赋给属性或变量时,所赋值的类型和接受此值的属性或变量的类型应相同或兼容。
一个属性或变量的类型定义了此属性或变量的可能值集合,也定义了程序代码可以执行的运算。
在前边的例程中,编辑框部件的Color属性和clRed的类型都是TColor。
可以在在线帮助中找到一个属性的类型;
另外一种方法是在ObjectInspector中选定该属性值段,并按下F1键,则类型将在属性说明的结尾处列出,例如Color属性列出下边的语句:
PropertyColor:
TColor;
有些属性是只读(ReadOnly)的,它们只能被读取,不能被改变。
请查阅在线帮助,在Delphi中这些只读属性都有注解。
2.1.2标识符的说明与使用
标识符是Delphi应用程序中一些量的名称,这些量包括变量(var)、常量(const)、类型(type)、过程(procedure)、方法(Method)及其他,ObjectPascal在应用标识符时,必须首先说明它们。
ObjectPascal是强类型语言,它的编译器可以检查确保赋给变量或属性的值是正确的类型,以便于您改正错误。
因为ObjectPascal是编译语言,所以Delphi的执行速度要比使用解释语言快得多。
在使用标识符前说明它们,可以减少程序错误并增加代码的效率。
2.1.2.1变量
变量是程序代码中代表一个内存地址的标识符,而此地址的内存内容在程序代码执行时可以被改变。
在使用变量前必须对它进行说明,即对它进行命名,并说明它的类型。
在所有变量说明以前加上保留字var。
变量说明左边是变量的名称,右边则是该变量的类型,中间用(:
)隔开。
var
Value,Sum:
Integer;
Line:
String;
在窗体中加入一个名称为Edit1的编辑框,再加入一个名称(属性Name)为Add的按钮部件,并建立如下的事件处理过程:
procedureTForm1.addClick(Sender:
X,Y:
X:
=100;
Y:
=20;
Edit1.Text:
=IntToStr(X+Y);
在本例中,当按动ADD按钮时,编辑框中显示值120。
在ObjectPascal中,必须确保变量或属性被赋予类型相同或兼容的值。
您可以尝试将赋给X的值改为100.0,或去掉IntToStr函数,在编译时会出现类型不匹配的错误,这也说明了ObjectPascal强类型语言的特点。
2.1.2.2预定义类型
ObjectPascal有多个预定义的数据类型,您可以说明任何这些类型的变量:
整形:
Integer的范围是-32768到32767,占2字节的内存;
Shortint从-128到127,占1字节内存;
Longint从-2147443648到2147483647占4字节内存;
Byte从0到255,占1字节;
Word从0到65535,占2字节内存。
它们都是没有小数部分的数字。
实型:
Single可以包含7到8位有效小数部分,占用4字节的内存;
Double类可以包含15到16位有效小数部分,占用8字节的内存;
Extended类型包含19到20位有效小数部分,占用10字节内存;
Comp可以包含19到20位有效小数部分,占用8字节内存。
以上实数类型只有在8087/80287选项[N+]打开才可以使用。
Real可以包含11到12位有效小数部分,占用6字节内存。
它只有在和以前BorlandPascal兼容的情况下才使用,否则应使用Double或Extended。
布尔型:
Boolean,只包含true或False两个值,占用1字节内存。
字符型:
Char,一个ASCII字符;
字符串类型String一串最长可达255个ASCII字符。
指针型:
Pointer,可以指向任何特定类型。
字符串型:
PChar,是一个指向以零结尾的字符串的指针。
除了预定义类型外,Delphi还有自行定义的类型。
上述例程的TColor就是这种类型。
此外,用户还可以定义自己的数据类型,这部分内容将在下文中详细讲述。
整型类别和实型类别都各有五种类型,同一类别中,所有的类型与其他同类别的都相容,您可以将一种类型的值赋给相同类别中不同类型的变量或属性,而只需要这个值的范围在被赋值的变量或属性的可能值范围内。
例如,对于一个Shortint型的变量,可以接受在-128到127范围内的任意整数,例如Shortint类型的7;
您不能将300赋给它,因为300已经超出了Shortint的范围了。
将范围检查功能打开(选用Options|Project,并在CompilerOptionsPage中选择RangeChecking),将会检查出一个范围错误;
如果RangeChecking没有被打开,那么程序代码将可以执行,但被赋值的值将不是您期望的值。
在一些情况下,您可以进行不同类型的变量或属性的赋值。
一般来说,可以将一个较小范围的值赋给一个较大范围的值。
例如,您可以将整型值10赋给一个接受实型值的Double属性而使得值成为10.0,但如果将一个Double类型的值赋给整形变量,则会出现类型错误。
如果您不清楚类型的兼容性,可以参阅Delphi的在线帮助中“TypeCompatibilityandAssignmentCompatibility”主题。
2.1.2.3常量
常量在说明时就被赋予了一个值,在程序执行过程中是不可改变的。
下面的例子说明了三个常量:
const
Pi=3.14159;
Answer=342;
ProductName="
Delphi"
;
象变量一样,常量也有类型。
不同的是,常量假设其类型就是常量说明中其所代表的值的类型。
上文的三个常量的类型分别是real型、整形、字符串型。
常量用“="
表示两边的值是相等的。
2.1.3过程与函数
过程与函数是程序中执行特定工作的模块化部分。
Delphi的运行库包含许多过程与函数以供您的应用程序调用。
您不必了解过程与函数的逻辑,但要知道过程与函数的用途。
在对象中说明的过程和函数称为方法(Method)。
所有的事件处理过程都是过程,以保留字procedure开头。
每一个事件处理过程只包含了当这一事件发生时需要执行的程序代码。
在事件处理过程中使用Delphi已经存在的过程与函数,只需在程序代码中调用它们即可。
2.1.3.1一个调用Delphi方法的简单例程
下文将通过对一个Memo部件的文本进行剪切、拷贝、粘贴、清除等编辑的应用程序编制,介绍使用Delphi过程和函数的调用方法。
Memo(备注)部件有一个CutToClipboard方法,实现将用户在memo中选择的文本移到剪贴板上去。
由于这个功能已经被建立在此方法中了,所以您只需知道这个方法做什么以及如何使用它即可。
下面的语句表明如何调用一个名为Memo1的memo部件的CutToClipboard方法:
Memo1.CutToClipboard;
通过指定Memo1的名称,说明调用哪一个部件的CutToClipboard方法。
如果不指明对象名称,Delphi会显示Unknownidentifier错误。
当该事件处理过程被触发,程序会执行CutToclipboard中的语句,将Memo1中的文本剪贴到剪贴板上去。
下文的例程展示了如何调用Delphi的方法,实现将备注部件的文本信息剪切、拷贝到剪贴板上;
将剪贴板上的标记文本粘贴到备注中,清除备注部件中的全部文本等四个功能。
打开一个新的空窗体,加入一个memo部件和四个按钮,并排列整齐。
改变按钮部件的Name属性,分别命名为Cut,Copy,Paste,Clear。
您会发现,当Name属性发生改变时,Caption属性将发生相应的变化。
在Caption属性前加标“&
”号设立加速键
将memo部件的ScrollBars属性设为ScVertical,以便加上滚行条。
将WordWrap属性设置为True,这样当用户输入文本到达Memo部件的右边缘时会自动回行。
将Line属性第一行的Memo1文本删除,使得memo部件在初始显示时为空的。
为每一个按钮建立如下的事件处理过程:
procedureTForm1.CutClick(Sender:
TObject);
Memo1.CutToClipboard;
procedureTForm1.CopyClick(Sender:
Memo1.CopyToClipboard;
procedureTForm1.PasteClick(Sender:
Memo1.PasteFromClipboard;
procedureTForm1.ClearClick(Sender:
Memo1.clear;
执行此程序。
您可以在备注部件中输入文本,在进行了文本的标记后,可以任意地进行剪切、拷贝、粘贴和清除。
当按钮被按动时,就调用相应的过程进行处理。
用户可以通过查阅在线帮助进行Memo部件的TopicSearch,在MemoComponent项中查阅Method,会得到以上过程的详细说明。
2.1.3.2调用Delphi的含参过程
有些过程要求用户指明参数。
被调用的过程会在执行时使用传入的参数值,这些值在过程中被认为是已经被说明的变量。
例如,LoadFromFile方法在TString对象中被说明为:
ProcedureLoadFromFile(constFileName:
String);
在调用这一过程时,应指明FileName参数是要装入的文件名称。
下面的程序将先打开Open对话框,当您选择了一个文件后,Delphi将把该文件读入一个Memo部件:
OpenDialog.Execute;
Memo1.lines.LoadFromFile(OpenDialog.FileName);
2.1.3.3使用Delphi函数
与过程一样,函数的程序代码也执行特定的工作。
它和过程的差别为:
函数执行时会返回一个值,而过程则没有返回值。
函数可以用来赋给一个属性或变量;
也可以使用返回值来决定程序的流程。
前文中我们实际上已经接触过了函数。
在讲述变量时,曾用到过下面的程序段:
Edit1.Text:
=IntToStr(X+Y);
其中,IntToStr(Value)把一个LongInt类型的数值转化为字符串的值,Value是IntToStr唯一的参数,它可以是一个整形的值、变量、属性或产生整形值的表达式。
调用函数,必须把返回值赋给和此返回值类型兼容的变量或属性。
有些函数返回一个True或False的布尔量,用户的程序可以根据返回值来决定跳转。
下文的例程讲述了函数返回值为Boolean的判断用法:
在窗体中加入一个ColorDialog对象和一个Name属性为ChangeColor的按钮。
为按钮的OnClick事件建立事件处理过程如下:
procedureTForm1.ChangeColorClick(Sender:
ifColorDialog1.Executethen
Form1.Color:
=ColorDialog1.Color
else
此事件处理过程使用一个返回Boolean值的Execute方法。
按动按钮,并在颜色对话框中选择一个颜色。
如果按动OK按钮,ColorDialog.Execute方法将返回True,则Form1.Color将被赋值为ColorDialog1.Color,窗体显现您选用的颜色;
如果按动颜色对话框的Cancel按钮,方法将返回False值,窗体将变为红色。
2.1.4跳转语句
ObjectPascal的跳转语句有if和case两个。
2.1.4.1if语句
if语句会计算一个表达式,并根据计算结果决定程序流程。
在上文的例程中,根据ColorDialog.Execute的返回值,决定窗体的背景颜色。
if保留字后跟随一个生成Boolean值True或False的表达式。
一般用“=”作为关系运算符,比较产生一个布尔型值。
当表达式为True时,执行then后的语句。
否则执行else后的代码,if语句也可以不含else部分,表达式为False时自动跳到下一行程序。
if语句可以嵌套,当使用复合语句表达时,复合语句前后需加上begin…end。
else保留字前不能加“;
”,而且,编译器会将else语句视为属于最靠近的if语句。
必要时,须使用begin…end保留字来强迫else部分属于某一级的if语句。
2.1.4.2case语句
case语句适用于被判断的变量或属性是整形、字符型、枚举型或子界型时(LongInt除外)。
用case语句进行逻辑跳转比编写复杂的if语句容易阅读,而且程序代码整形较快。
下面的例程显示一个使用case语句的窗体:
建立如下的事件处理过程:
Number:
=StrToInt(Edit1.Text);
caseNumberof
1,3,5,7,9:
Label2.Caption:
='
奇数'
0,2,4,6,8:
偶数'
10..100:
begin
Label2.Caption:
在10到100之间'
=clBlue;
大于100或为负数'
执行程序,当Edit1部件接受到一个值,并按动“OK”按钮触发程序后,Number便被赋值为用户输入的数值。
case语句根据Number的值判断该执行哪一条语句。
象if语句一样。
case语句也有可选择的else部分。
case语句以end结尾。
2.1.5循环语句
ObjectPascal的循环语句有三种:
repeat、while和for语句。
2.1.5.1repeat语句
repeat语句会重复执行一行或一段语句直到某一状态为真。
语句以repeat开始,以until结束,其后跟随被判断的布尔表达式。
参阅以下的例程:
i:
=0;
repeat
=i+1;
Writen(i);
untili=10;
当此语句被执行时,窗体的下方会出现1到10的数字。
布尔表达式i=10(注意,与其他语言不同的是,“=”是关系运算符,而不能进行赋值操作)直到repeat..until程序段的结尾才会被计算,这意味着repeat语句至少会被执行一次。
2.1.5.2while语句
while语句和repeat语句的不同之处是,它的布尔表达式在循环的开头进行判断。
while保留字后面必须跟一个布尔表达式。
如果该表达式的结果为真,循环被执行,否则会退出循环,执行while语句后面的程序。
下面的例程达到和上面的repeat例程达到同样的效果:
whilei<
10do
writeln(i);
2.1.5.3for语句
for语句的程序代码会执行一定的次数。
它需要一个循环变量来控制循环次数。
您需要说明一个变量,它的类型可以是整形、布尔型、字符型、枚举型或子界型。
下面的程序段会显示1到5的数字,i为控制变量:
var
integer;
fori:
=1to5do
以上介绍了三种循环语句。
如果您知道循环要执行多少次的话,可以使用for语句。
for循环执行速度快,效率比较高。
如果您不知道循环要执行多少次,但至少会执行一次的话,选用repeat..until语句比较合适;
当您认为程序可能一次都不执行的话,最好选用while..do语句。
2.1.6程序模块
程序模块在ObjectPascal中是很重要的概念。
它们提供了应用程序的结构,决定了变量、属性值的范围及程序执行的过程。
它由两个部分组成:
可选择的说明部分和语句部分。
如果有说明部分,则必在语句部分之前。
说明部分包括变量说明、常量说明、类型说明、标号说明、程序,函数,方法的说明等。
语句部分叙述了可执行的逻辑行动。
在Delphi中,最常见的程序模块便是事件处理过程中的程序模块。
下面的事件处理过程是含有变量说明部分的程序模块:
procedureTForm.Button1Click(SenderTobject);
var{程序模块的说明部分}
Name:
string;
begin{程序模块的语句部分}
=Edit1.Text;
Edit2.Text:
WelcometoDelphi'
+Name;
{程序模块结束}
库单元也是程序模块。
库单元的interface部分含有库函数、类型、私有,公有域的说明,也可以含有常量、变量的说明。
这一部分可以作为程序模块的说明部分。
在库单元的implementation部分中通常含有各种事件处理过程,它们可以视为模块的语句部分,是事件处理模块。
库单元模块结束于库单元结束的end.处。
程序模块中可以包含其他的程序模块。
上文库单元模块中含有事件处理模块。
而库单元模块实际是在工程程序模块中。
所有的Delphi应用程序都有相同的基本结构。
当程序逐渐复杂时,在程序中加入模块即可。
例如在库单元模块中加入事件处理模块,向工程中加入库单元模块等。
模块化编程使得程序结构良好,并且对数据具有保护作用。
2.1.7关于作用范围
2.1.7.1标识符的作用范围
一个变量、常量、方法、类型或其他标识符的范围定义了这个标识符的活动区域。
对于说明这个标识符的最小程序模块而言,此标识符是局部的。
当您的应用程序在说明一个标识符的程序模块外执行时,该标识符就不在此范围内。
这意味着此时执行的程序无法访问这个标识符,只有当程序再度进入说明这个标识符的程序模块时,才可以访问它。
下面的示意图表示一个含有两个库单元的工程,每个库单元中又各有三个过程或事件处理过程。
2.1.7.2访问其他程序模块中的说明
您可以在当前的程序模块中访问其他程序模块中的说明。
例如您在库单元中编写一个事件处理过程来计算利率,则其他的库单元可以访问这个事件处理过程。
要访问不在当前库单元中的说明,应在这个说明之前加上其他应用程序的名称和一个点号(.)。
例如,在库单元Unit1中有事件处理过程CalculateInterest过程,现在您想在库单元Unit2中调用这一过程,则可以在Unit2的uses子句中加入Unit1,并使用下面的说明:
Unit1.CalculateInterest(PrincipalInterestRate:
Double);
应用程序的代码不能在一个模块外访问它说明的变量。
事实上,当程序执行跳出一个模块后,这些变量就不存在于内存中了。
这一点对于任何标识符都是一样的,不管事件处理过程、过程、函数还是方法,都具有这一性质。
这样的标识符