您的位置:首页 > 编程语言 > Delphi

delphi完美经典--第五、六章

2013-07-04 10:59 316 查看
第五章 常用的指令介绍
一、TCanvas:此类提供了一个抽象的绘图空间给需要贴图的对象使用。除了可贴图外,还可输出文字。TForm有Canvas属性:Form1.Canvans.TextOut(100, 100, 'abc');

二、InputBox函数:弹出一个可输入文字的对话框。Edit1.Text := InputBox(‘InputBox Example’, ‘请输入密码:’, ‘007’);

三、functionMessageDlg(const Msg:string;         //要显示的信息

DlgType:TmsgDlgType;    //MsgDlg类型,如mtConfirmation、mtError等。(mt—msgtype)

Buttons:TmsgDlgButtons;       //要显示的按钮,如MbYes、MbNo等。(Mb—msgbutton)

HelpCtx:Longint):Word;  //在对话框上按下F1时的说明。一般为0.

返回值:如mrYes、mrOk、mrNo等。(mr—msgreturn)

第六章 Delphi与ObjectPascal程序的基本概念
三、数据类型与定义变量

Object Pascal是一个类型严谨的程序语言,即它为数据类型作了许多区别,因此有时候不允许用一种类型数据去替代另一种数据类型。

当然也有办法让你回避类型最严谨的地方,其方法有以下几种:类型转换、指针类型、记录类型里的变量和变量的绝对寻址。

1、声明集合类型:

type

  WorkDay = (Monday, Wednesday, Thursday,Friday);



Delphi中也存在跨平台的问题:将类型分为基本类型和通用类型。基本类型即ANSI还是Unicode,通用类型则指如C++中的Tchar。跨平台时,由于Tchar与平台相关,所以不能用。

2、非自定义类型介绍

1)字符类型:AnsiChar和WideChar。通用类型是char类型。

2)整数类型

基本整数类型:



通用整数类型:



3)布尔类型:

分四种:Boolean、ByteBool、WordBool、LongBool。区别:后三个是为了跨平台使用。所占空间分别是:1、1、2、4Byte。在delphi中布尔型和整数型不能自动转换。

4)实数类型:

基本实数类型:Rcal48、Single、Double、Extended、Comp和Currency六种,而每种类型的范围和保存格式都不大相同。



Real48:与旧的Delphi版本兼容,但其保存格式非Intel系列CPU直接支持,所以比其他类型慢。

Extended:精度高,但移植性差。

Comp:若可以的话,尽量用Int64替代此类型。

Currency:一种小数点固定的数据类型。当与其他实数类型值一起使用或被赋值为其他实数类型的值时,此类型的值会自动乘或除以10000。

通用实数类型:



5)字符串类型:



ShortString:字符串长度255,虽然最大可,256Byte空间,但其第一个字符时用来记录该字符的长度,因而此类型的字符串最小需占2Byte。

AnsiString:是一个只占4Byte内存空间的指针。其值的长度只受可用内存空间的限制。

WideString:一般仅当COM编程时用。

6)变体类型:

Variant类型可存放各种类型的值,除了下列类型:Record、Set、Static Array、File、Class、Class Reference、Pointer及Int64。虽可存放各种类型,但其所占空间固定:16Byte。

2、必须用type声明的数据类型

1)枚举类型

语法:type 枚举类型名称 = (值1, 值2, ……, 末值);

对枚举类型,一旦声明后,此枚举类型的任一元素,都不能再重复被声明为其他枚举类型的元素之一。

2)子范围

子范围的值,是某种类型的值的一部分。即它的值不能凭空自定义。语法:

type 子范围类型名称 = 起始值……终点值;

3)集合类型

集合类型是一组相同类型的变量的集合。语法:

type 集合类型名称 = set of 基数类型;集合类型的变量,可存放重复的值。

4)数组类型:参考6-6节数组与指针

5)记录类型

由不同类型的成员组成的集合,在声明记录类型时,必须定义每个成员的类型。语法:

type 记录类型名称 = record

        第一个成员名称 : 类型名称;

        ……

        最后一个成员名称 : 类型名称;

end;

4、定义变量

标识符的命名规则:

Ø  长度无限制,然而只有前面256个字符有用。

Ø  由英文字符、数字和下划线组成,但第一个字符必须是英文字符或下划线

Ø  不能包含空格

Ø  不能是保留字

A, B, C : Integer; 此种方式定义时无法在定义时初始化。

定义常量,如

const

  MyCount = 34;     //定义常量时,定义时必须初始化。有时可省略类型。

  MyName:string = ‘Color’;

变量的类型转换:

1)自动转换:一般只限于同类型的转换。何为同类型,如Integer同类型的类型有:ShortInt、Int64、Byte等。语法:变量A名称 := 变量B名称;

2)强制类型转换:变量A名称 := 变量A的类型(变量B名称);

3)函数类型转换:如IntToStr之类的。

5、ObjectPascal的运算符

算数运算符:+、-、*、div(除,取商。对整数)、/(除,取商)、mod(除,取余数)

关系运算符:=、<>、<、>、<=、>=

布尔运算符:not、and、or、xor(异或、互斥:当左右两边的操作数的值互斥时,返回值才为True)

集合运算符:专门用来处理集合类型的操作数,集合运算符有些和关系运算符采用相同的符号,但作用不同,使用时必须分清操作数的类型。

运算符

作用

可处理操作数类型

返回类型(结果)

+

并集

set

set

-

差集

set

set

*

交集

set

set

<=

包含于

set

Boolean

>=

包含

set

Boolean

=

等于

set

Boolean

<> 

不等于

set

Boolean

in

属于

左ordinal、右set

Boolean

并交差集要删除重复的元素。in判断一个数是否在一个集合中。>=用来判断左边操作数的值是否包含了右边操作数全部的值。<=用来判断左边操作数的值是否被右边操作数的值所包含。对<=和>=必须全部包含才为True,有一个没被包含就为False。=用来判断左右操作数的值是否完全相等,<>完全相反。

关系运算符:关系运算符中的=、<>、>=、<=、>、<都可用来处理字符串,比较的是从第一个字符开始的ASCII码。字符串运算符有+但无—。

位逻辑运算符:not(对位取反)、and、or、xor、shl(对位的左移)、shr(对位的右移)。shl和shr都是2元操作符,左边的变量表明要对移位的值,右边的变量表示要移动的位数有几个。

运算符优先级:



6、流程控制
1)case……of……(多向分支)

case  选项表达式  of

选项表达式1(值) : 语句1;

……

选项表达式N(值) : 语句N; 

(else

语句; )

end;

case表达式既可以是整型也可是任何其他类型。因delphi有可以表示范围的方法。所以,可以:

case m1 of

  5..7:

begin end;

  2, 3, 4:

begin end;

  4..8, 1:

    begin end;

2)循环语句

①for循环:需明确指明要重复的次数,计数变量的间距固定,是1,若要更改,只能自己在循环体语句里控制。

for 计数变量 := 起始值 to 终点至 do//for计数变量 := 起始值 downto 终点至 do

for  X := 1 to 10 do

begin

  Sum := Sum + X;

end;

②while循环语句:非明确决定重复执行的次数,而是用条件来控制是否要继续执行。

while 布尔表达式 do

③repeat循环语句:同while循环一样,是用条件来控制是否继续循环。区别是先执行循环体,后判断条件,条件为真时,停止循环。

repeat

  循环体语句

until 布尔表达式;

3)标签与跳转语句:label和goto实现,勿用。

4)汇编语句:objectpascal支持使用汇编,以asm始以end;终。

7、数组与指针

1)  数组类型:一组位置连续且类型相同的数据的集合。数组名代表某块内存空间的地址。

①  数组类型既可直接在var区定义一个数组;也可先在type区声明一个数组类型,然后再在var区定义数组变量或常量。注意type区时:类型名称 = array[索引的类型] of 基数类型;是‘=’ var区时是‘:’。不只数组有这个特性,其他类型也都有这个特性。

②    静态数组:静态数组即声明时已确定了数组的大小。

一维静态数组的声明:类型名称 = array[索引的类型] of 基数类型;TheAnwser = array[Boolean] of Char;此数组只有两个元素:TheAnswer[true]、TheAnswer[false]。索引类型用来确定数组元素个数。多维数组的定义有两种形式:类型名称 = array[索引的类型1…索引的类型N] of 基数类型;类型名称 = array[索引类型] of array[索引类型] of 基数类型;

③    动态数组:在设置元素值给数组时,才决定此数组的大小。动态数组的索引类型一律为整型,且从0开始。而动态数组元素的数量,必须通过SetLength来设置。给元素赋值前必须先设置其数组元素数量。

一维动态数组的声明:类型名称 = array of 基数类型;多维动态数组的声明:类型名称 = array of array of 基数类型;设置大小:SetLength(数组名, 一维大小, …N维大小);

④    相关函数:Low和High。分别返回数组的上下限,即数组索引的最小值和最大值。

2)  指针类型

①    声明和定义:type区的指针类型名称 = ^类型名称;或者var区的指针类型名称 : ^类型名称;若类型名称本身是指针类型,则不能加‘^’;若非指针类型,则须加‘^’。

②    寻址操作(即取得指针所指地址的值):指针变量名称后加‘^’,不同于C++。

③    字符指针:可用来操作null-terminated string(以NULL即‘#0’为结束标志)。

基本的字符指针类型:PAnsiChar和PWideChar。通用的字符指针类型:PChar。这三种特殊的指针类型可使用‘+’、‘-’运算符。字符指针的加减是移位操作。

A:Pchar; A := A+2;

④    Addr和Ptr函数:Addr作用同‘@’。Ptr是将地址转换为指针,仅当已知地址值时才函数才有用。

8、程序与函数

1)参数的传递方式:传值、传址、out。区别:①声明或定义时,传址方式在变量前加一个保留字“var”。②调用函数时,传址方式的参数必须是变量名而不能是某个值。③out参数,相当于C++中的引用。使用方式:在参数名前加“out”。

    常量参数:值传递,只是在程序内部不可更改常量参数的值。语法:参数名前加“const”。

数组参数:函数声明或定义的语句内,不能有数组索引。所以对于静态数组,必须先在type区声明类型,再用此类型定义函数的参数。而对动态数组,则不必如此麻烦,可直接声明。这些说的都是形参,而对实参则无任何要求,动态数组和静态数组都可。

2)声明修饰符:函数在声明和定义时,允许我们在标头的最末处加上一些声明修饰符。以下将修饰符分成4类,而一个函数可使用多种类型的修饰符,各类修饰符之间以“;”分隔。

①    标注“函数调用约定”修饰符:

stdcall:使用堆栈的方式传递参数,且传递顺序为由右向左,功能是调用Windows API函数。

cdecl:使用堆栈的方式传递参数,且传递顺序为由右向左,当从C/C++写的DLL文件中调用某个函数时需此修饰符。

②    函数的前置定义(Forward):在单元中声明私有函数时,因未在interface区声明,所以函数的调用受到代码顺序的限制。在implementation区给函数做前置声明,可解决此问题。方法是:函数声明后加Forward;

③    External:调用非该项目的函数。④Overload:。

3)常用的内建函数:

Ø  数学计算方面:



Ø  时间日期方面:



Ø  类型转换方面:



Ø  字符串处理方面



Ø  随机数方面:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: