Delphi笔记.docx
- 文档编号:2151335
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:25
- 大小:37.50KB
Delphi笔记.docx
《Delphi笔记.docx》由会员分享,可在线阅读,更多相关《Delphi笔记.docx(25页珍藏版)》请在冰豆网上搜索。
Delphi笔记
Delphi笔记-ObjectPascal的相关内容
Delphi学习笔记2007-12-0821:
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=packedrecord //该类型占16字节
VType:
Word; //指示该变体类型代表的实际类型
Reserved1,Reserved2,Reserved3:
Word;
caseIntegerof
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个元素的数组
{functionVarArrayOf(constValues:
arrayofVariant):
Variant;这个函数的参数
是一个开放数组,它的元素个数和类型都是未知的。
}
end;
动态数组是可以动态地改变元素个数的数组。
声明动态数组时不要指明数组的元素个数和维数即可。
var
sa,sb:
arrayofstring;
sc:
arrayofarrayofInteger;//二维动态数组
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=setofchar;
TEnum=(Monday,Tuesday,Wednesday,Theursday,Friday);
TEnumSet=setofTEnum;
TSubrangeSet=setof1..10;
TAlphaSet=setof'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=typeInteger;
上面两者的区别在于:
MyInteger在任何情况下与Integer是相同的,而MyOtherInteger在用于赋值
目的的情况下与Integer相同,在作为var和out参数时与Integer不兼容。
例如:
procedureGoon(varvalue:
Integer);
begin
//ToDo
end;
var
m:
MyOtherInteger;
begidn
m:
=10;
Goon(m);//Error
end;
转义字符:
#7:
响铃 #8:
退格 #9:
制表符 #10:
换行 #13:
回车#0:
字符串的结束符
以传递常量参数的方式调用例程,对于参数为字符串或记录来说能产生更优化的代码。
以传递开放数组的方式调用例程的例子如下:
functionfunc(a:
arrayofInteger):
Integer; //调用该函数时,实参是一个元素个数不确定的整数数组
var
i:
Integer;
begin
result:
=0;//Pascal的标准语法是:
函数名:
=返回值;
fori:
=Low(a)toHigh(a)do
inc(result,a[i]);
end;
procedureproc(a:
arrayofconst); //调用该函数时,实参是一个元素都为常量的数组,并且元素类型可以不相同
begin
//ToDo;
end;
procedurefunc(a:
arrayofVariant);//调用该函数时,实参是一个元素个数和类型都不确定的数组,但所有元素的类型要相同
begin
//ToDo;
end;
单元的两个可选部分:
initialization和finalization分别对该单元进行初始化和结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 笔记