Delphi的数据类型主要有以下这几类:简单数据类型(Simple),字符串数据类型(String),结构数据类型(Struct),指针数据类型(pointer),函数和过程数据类型(procedural),变体数据类型(variant)等。下面我们来一一做一个介绍。
一、简单数据类型
简单数据类型分为有序数据类型(ordinal)和实数数据类型(real)两种。
1.1 有序数据类型
有序数据类型包括整数类型,字符类型,布尔类型,枚举类型和子界类型。对于学过其它语言的朋友来说,前四个并不会陌生,只是在类型的表达形式上会有不同。这里需要注意的是,对于字符类型来说一个字符在长度上并不表示一个字节,所以要返回字符串长度需要用函数(Sizeof);布尔类型除了我们熟知的Boolean外,还有ByteBool,WordBool、LongBool。它们之间的主要区别在于字节长度。
下面我主要来介绍一下子界类型。
子界类型是整型、布尔型、字符型或枚举型中某范围的值。例如
- type
- Thours=0..23;
- TValidLetter='A'..'F';
- TWorkDay=Monday..Friday;
1.2 实数数据类型
这里我只介绍开发中常用的实数类型:Double、Currency
二、字符串类型
在缺省情况下,定义字符串变量,默认创建的是AnsiString字符串类型,该类型是一个指向在堆栈中的字符串结构的指针,并是用动态分配的并有自动回收功能,且总是以null字符结束,没有长度限制,定长字符串会给一个字节来存储字符串的内存大小。ShortString是为兼容老版本而存在的,string为动态字符串数组,string[]为静态字符串数组例如:
- var
- Str: string;//AnsiString类型
如果长度未超过255个字符,则默认创建的是ShortString类型。例如:
- var
- S:string[63];//ShortString字符串类型
推荐使用+运算符来连接两个字符串,当然也可以使用Concat()方法。例如:
- var
- s1,s2:string;
- begin
- s1:='Hello';
- s2:='World';
- s1:=s1+s2;
- end.
这里补充一下字符串常识(转载自万一博客):
- 'BORLAND' { BORLAND }
- 'You''ll see' { You'll see }
- '''' { ' }
- '' { 空串 }
- ' ' { 空格 }
- #89#111#117 { You }
- #89'Y'#89 { YYY }
- #89 + 'Y' + #89 { YYY }
- #13#10 { 换行 }
这里需要说明的是字符串内部本身结构为一个字符数组。可以吧字符数组赋值给字符串,但不能把字符串赋值给字符数组。
利用window API读取、设置窗体的标题
- //利用windows API设置窗体的标题,字符串类型为PChar
- SetWindowText(Handle,'测试');
- //利用windows API读取窗体的标题
- GetWindowText(Handle,arr,7);
只有字符串指针才能进行运算。例如:
- {字符串指针运算}
- procedure TForm1.Button6Click(Sender: TObject);
- var
- p: PChar;
- begin
- p:= 'China';
- Inc(p); //p:=p+1;相当于对于指针地址的运算
- ShowMessage(p); //hina
- Dec(p); //p:=p-1;
- ShowMessage(p);
- end;
利用AnsiResemblesText()函数来实现针对两个字符串的相似度比较。
- s1:= Soundex('abc');
- s2:= Soundex('apc');
- ShowMessage(s1+','+s2);
- b:=AnsiResemblesText('abc','apc');
- ShowMessage(BoolToStr(b)); //-1表示相似
字符串函数(StrCopy、StrCat、StrPas)说明:
- {StrCopy:复制字符串(不进行长度检查);
- StrCat:在原字符串的末尾拼接字符串(不进行长度检查),类似于+;
- StrPas:将Pchar转换成string}
- procedure TForm1.Button14Click(Sender: TObject);
- const
- p1: PChar = 'CodeGear';
- p2: PChar = 'Delphi';
- var
- S: array[0..15] of Char;
- begin
- StrCopy(S,p1);
- //StrCat(S,' ');
- StrCat(S,p2);
- ShowMessage(S);
- ShowMessage(StrPas(S));
- end;
利用SysErrorMessage函数来返回一个对应于指定OS错误的字符串。具体OS错误详见OS错误
三、结构类型
简单数据类型包括集合类型、数组类型、记录类型、文件类型、类类型、类引用类型、接口类型。
3.1 集合类型(set)
集合类型是一群相同类型元素的组合,必须是有限类型如整型、布尔型、字符型、枚举型和子界型。在编写代码时,需要注意在Delphhi7 中无法使用for ... in ... 的语法。例如:
- type
- TInt=0..255; //BaseType为有序类型
- T1 = set of TInt; //定义集合类型
3.1.1 关系运算
用in来判断一个给定的元素是否在一个集合中
- //集合T1中是否有200:
- if 200 in T1 then
- //TDate中是否没有Mon:
- if not (Mon in TDate) then
3.1.2 增删元素
用Include()和Exclude()过程来对一个集合变量增删元素(推荐使用):
- Include(T1,256); //在集合中增加256
- Exclude(T1,'a'); //在集合中删除'a'
用*来计算两个集合的交集,即交集的结果为两个集合所共有的元素。
3.2 数组类型(array)
对于学过其它编程语言的人来说,数组是我们再熟悉不过的类型。在Delphi中的声明如下:
- var
- TDou: array [1..25] of Double;
- type
- Dou = array[1..25] of Double;
- var
- TDou : Dou;
数组赋值:
- for i:=1 to 25 do
- TDou[i] := 0;
3.3 记录类型(record)
记录是可以成组访问的一群数据的集合。记录可以包含保存数据的域,每个域有一个数据类型,记录类型中各数据的数据类型的长度满足“字节对齐”的条件,即记录类型中所有数据的数据类型都匹配记录类型中所有数据最长的数据类型的长度。而在压缩记录类型(packed record)中,则不存在这一条件。例如:
- type
- TEmployee = record;
- Name: string[20];
- YearHired:1999..2000;
- Salary: Double;
- Position: string[20];
- end;
- var
- NewEmployee,PromotedEmployee: TEmployee;
访问记录的单域:
- NewEmployee.Salary := 1000;
给整个记录赋值,使用with .. do..:
- with PromotedEmployee do
- begin
- Name := 'Wang Hong';
- YearHired := 1993;
- Salary :=2000;
- Position :='editor';
- end;
这里需要注意的是在delphi7中,对于记录类型的方法、属性和构造函数支持并不支持
四、指针类型(pointer)指针类型的变量指向内存空间的地址。 在使用指针前,必须先用GetMem来分配内存,使用完后利用FreeMem函数释放,定义如下:
- type
- PointerName = ^typt;
这里简要写个使用指针类型的例子:
- program Project1;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- type
- Pint = ^integer; //定义指针类型
- var
- a,b:integer;
- pt : Pint; //整型指针
- p : pointer; //无类型指针
- begin
- { TODO -oUser -cConsole Main : Insert code here }
- a:= 2;
- b:= 3;
- pt:=@b;
- writeln('b=',pt^);
- p:=@a; //整型指针指向整型数据
- b:=integer(p^); //无类型指针指向的内容给整型变量赋值(须经过类型转换)
- writeln('b=',b);
- pt:=p; //指针间赋值
- writeln('pt^',pt^);
- readln;
- end.
这里需要说明的是
1、@运算符放在变量前面,将获取变量的地址,并可以把地址赋给同样数据类型的指针;
2、^运算符放在一个数据类型前面,定义该类型的指针;
3、^运算符放在一个指针后面,获取该指针指向的地址空间的内容
4、不可以直接将所指地址中的内容直接赋值给其它类型变量,必须经过类型转换五、变体类型(Variant)
变体类型能在运行期间动态地改变类型,支持所有简单的数据类型,但不能表达Object Pascel对象。
六、数据类型转换(转载自万一博客)
- Chr //将一个有序数据转换为一个 ANSI 字符
- Ord //将一个有序类型值转换为它的序号
- Round //转换一个实型值为四舍五入后的整型值
- Trunc //转换一个实型值为小数截断后的整型值
- Int //返回浮点数的整数部分
- IntToStr //将数值转换为字符串
- IntToHex //将数值转换为十六进制数字符串
- StrToInt //将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常
- StrToIntDef //将字符串转换为一个整数,如字符串不合法返回一个缺省值
- Val //将字符串转换为一个数字(传统 Turbo Pascal 例程用于向后兼容)
- Str //将数字转换为格式化字符串(传统 Turbo Pascal 例程用于向后兼容)
- StrPas //将零终止字符串转换为 Pascal 类型字符串,在 32 位 Delphi 中这种类型转换是自动进行的
- StrPCopy //拷贝一个 Pascal 类型字符串到一个零终止字符串, 在 32 位 Delphi 中这种类型转换是自动进行的
- StrPLCopy //拷贝 Pascal 类型字符串的一部分到一个零终止字符串
- FloatToDecimal //将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型
- FloatToStr //将浮点值转换为缺省格式的字符串
- FloatToStrF //将浮点值转换为特定格式的字符串
- FloatToText //使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
- FloatToTextFmt //同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
- StrToFloat //将一个 Pascal 字符串转换为浮点数
- TextToFloat //将一个零终止字符串转换为浮点数
七、注释
注释代码。用“{ffff}”、“{*fff*}”、“//”来注释。
- {$ WARNINGS OFF}
- 告诉编译器不要产生警告消息