Delphi笔记

发布时间 : 星期三 文章Delphi笔记更新完毕开始阅读

Delphi笔记-ObjectPascal的相关内容

Delphi学习笔记 2007-12-08 21:15:51 阅读121 评论0 字号:大中小 订阅 Pascal有3种字符串类型: 1.ShortString

该类型的字符串的最大长度为255个字符。所占的内存中的第一个字节地址中存放字符 串的长度信息。每个字符占一个字节的空间。它所占的内存是静态分配的。 2.AnsiString

是一种动态分配内存的字符串类型,最大长度为2的31次幂个字符,占2GB的内存空间。 它的变量是一个占4B内存的指针,指向动态内存。每个字符占一个字节。 3.WideString

也是一种动态分配内存的字符串类型,最大长度比AnsiString小一个字符。它的效率 比AnsiString差。每个字符占两个字节。

内存分配和释放函数: AllocMem() FreeMem() GlobalAlloc() GlobalFree() GetMem() FreeMem() New() Dispose() StrAlloc() StrDsipose() StrNew() StrDispose() VirtualAlloc() VirtualFree() SetLength()

函数和过程的重载要用关键字overload,类的函数和过程的覆盖要用override。它们的区 别是:重载的多个函数具有相同的函数名,不同的参数列表;覆盖用在父类与子类之间, 子类的同名函数覆盖父类的同名虚函数或动态函数。

数据类型表:

8位有符号整数:ShortInt 8位无符号整数:Byte 16位有符号整数:SmallInt 16位无符号整数:Word

32位有符号整数:Integer,LongInt 32位无符号整数:LongWord,Cardinal 64位有符号整数:Int64 4字节浮点数:Single 6字节浮点数:Real48 8字节浮点数:Double 10字节浮点数:Extended 64位货币值:currency 8字节日期/时间值:TDateTime

16字节variant:Variant,OleVariant,TVarData 1字节字符:Char 2字节字符:WideChar

固定长度(最大为255个字符)的字符串:ShortString 动态字符串:AnsiString, WideString

以NULL(即以#0)结束的字符串:PChar , PWideChar 1字节布尔值:Boolean,ByteBool

2字节布尔值:WordBool 4字节布尔值:BOOL,LongBool

当第一次声明了一个AnsiString变量时,它是没有长度的,也没有分配内存空间, 可以通过给它赋值或调用SetLength()函数来给它分配内存空间。注意:当它没有 分配空间时是不能像访问数组一样访问它的。如果将AnsiString字符串强制转换成 PChar类型后,要将其转换回来则可以调用函数RealizeLength()

变体类型Variant主要是为了支持OLE自动化操作。它能动态改变类型,例如: var v:Variant; begin v:='Delphi'; v:=1; v:=124.22 v:=true;

v:=CreateOleObject('word'); end;

变体类型能支持所有的简单数据类型,如:整数、浮点数、字符串、布尔值、日期和时间、 货币值和OLE自动化对象,但不支持ObjectPascal对象。 Variant类型的数据结构在System单元中的定义如下: type

PVarData=^TVarData;

TVarData=packed record //该类型占16字节 VType:Word; //指示该变体类型代表的实际类型 Reserved1,Reserved2,Reserved3:Word; case Integer of

varSmallInt:(VSmallInt:SmallInt); varInteger:(VInteger:Integer); varSingle:(VSingle:Single); varDouble:(VDouble:Double); varCurrency:(VCurrency:Currency); varDate:(VDate:Double); varOleStr:(VOleStr:PWideChar); varDispatch:(VDispatch:Pointer); varError:(VError:LongWord); varBoolean:(VBoolean:WordBool); varUnKnown:(VUnknown:Pointer); varByte:(VByte:Byte); varString:(VString:Pointer); varAny:(VAny:Pointer); varArray:(VArray:PVarArray); varByRef:(VPointer:Pointer); end;

Variant变量的VType域有两个特别的值:varEmpty和varNull,varEmpty表示变量还没有 赋值,一般不能对它操作;varNull表示它表示了一个值nil,可以对它操作。 Variant数组: var v:Variant;

begin

v:=VarArrayCreate([1,4],varInteger);//创建了一个4个元素的整数数组 v[1]:=1; v[2]:=2; v[3]:=3; v[4]:=4;

v:=VarArrayCreate([1,4,1,5],varInteger);//创建了一个4*5的二维数组。 v:=VarArrayOf([1,'Delphi',2.2]);//创建了一个有3个元素的数组

{function VarArrayOf(const Values:array of Variant):Variant; 这个函数的参数 是一个开放数组,它的元素个数和类型都是未知的。} end;

动态数组是可以动态地改变元素个数的数组。声明动态数组时不要指明数组的元素个数和维数即可。 var

sa,sb:array of string;

sc:array of array of Integer; //二维动态数组 begin

SetLength(sa,20);

sa[0]:='Delphi'; //动态数的下标通常是从0开始的。 sa:=nil;//释放动态数组的内存空间 SetLength(sa,30); sa[0]:='Hello\

sb:=sa; //sb和sa都指向同一块内存

sb:=Copy(sa); //sb指向一个由sa指向的内存拷贝来的内存。 SetLength(sc,5,5); end;

集合的元素的类型必须是有序类型、字符、枚举类型或子界类型。元素个数不能超过255个, 当元素个数小于32时,它就存储在CPU的寄存器中,这样效率就高,所以应尽可能使集合元 素个数小于32。集合的声明如下: type

TCharSet=set of char;

TEnum=(Monday,Tuesday,Wednesday,Theursday,Friday); TEnumSet=set of TEnum; TSubrangeSet=set of 1..10; TAlphaSet=set of 'a'..'z'; var

CharSet:TCharSet; EnumSet:TEnumSet; AlphaSet:TAlphaSet; begin

CharSet:=['a'..'j','A','c']; EnumSet:=[Monday,Friday]; AlphaSet:=[]; end;

集合的操作符号有:in,+,-,*,其中+和-尽可能使用Include()和Exclude()过程来代替,因为使 用这两个过程只需要一条机器指令,而使用+和-需要13+6n(n为集合的按位长度)条机器指令。

指针相关问题:

用New()能为一个指针分配确定长度的内存,该过程比GetMem()和AllocMem()更安全。但不能用 New()为Pointer或PChar变量分配内存,因为编译器不知道这两种类型的指针需要多大内存。 这时要用GetMem()或AllocMem()来分配内存了。AllocMem()比GetMem()更安全,因为AllocMem()总 是把分配的内存初始化为零。

相同类型的指针是不兼容的,例如: var a:^Integer; b:^Integer; begin a^:=10; b:=a; //Error end;

为了将a的值赋给b,可以采用以下方法: type

PInteger=^Integer; var

a,b:PInteger;//或者:a,b:^Integer; begin a^:=10; b:=a; end;

类型别名: type

MyInteger=Integer;

MyOtherInteger=type Integer;

上面两者的区别在于:MyInteger在任何情况下与Integer是相同的,而MyOtherInteger在用于赋值 目的的情况下与Integer相同,在作为var和out参数时与Integer不兼容。例如: procedure Goon(var value:Integer); begin //ToDo end;

var

m:MyOtherInteger; begidn m:=10; Goon(m);//Error end;

转义字符:

#7:响铃 #8:退格 #9:制表符 #10:换行 #13:回车 #0:字符串的结束符

以传递常量参数的方式调用例程,对于参数为字符串或记录来说能产生更优化的代码。 以传递开放数组的方式调用例程的例子如下:

function func(a:array of Integer):Integer; //调用该函数时,实参是一个元素个数不确定的整数数组 var i:Integer; begin

result:=0; //Pascal的标准语法是:函数名:=返回值;

联系合同范文客服:xxxxx#qq.com(#替换为@)