第五章 常用的指令介绍
一、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元操作符,左边的变量表明要对移位的值,右边的变量表示要移动的位数有几个。
运算符优先级:
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)常用的内建函数:
Ø 数学计算方面:
Ø 时间日期方面:
Ø 类型转换方面:
Ø 字符串处理方面
Ø 随机数方面: