Delphi关键字详解.docx

上传人:b****9 文档编号:25025592 上传时间:2023-06-04 格式:DOCX 页数:50 大小:32.88KB
下载 相关 举报
Delphi关键字详解.docx_第1页
第1页 / 共50页
Delphi关键字详解.docx_第2页
第2页 / 共50页
Delphi关键字详解.docx_第3页
第3页 / 共50页
Delphi关键字详解.docx_第4页
第4页 / 共50页
Delphi关键字详解.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

Delphi关键字详解.docx

《Delphi关键字详解.docx》由会员分享,可在线阅读,更多相关《Delphi关键字详解.docx(50页珍藏版)》请在冰豆网上搜索。

Delphi关键字详解.docx

Delphi关键字详解

Delphi关键字详解

absolute

//它使得你能够创建一个新变量,并且该变量的起始地址与另一个变量相同.

var

Str:

string[32];

StrLen:

ByteabsoluteStr;

//这个声明指定了变量StrLen起始地址与Str相同.

//由于字符串的第0个位置保存了字符串的长度,所以StrLen的值即字符串长度.

begin

Str:

='abc';

Edit1.Text:

=IntToStr(StrLen);

end;

abstract

//它允许你创建抽象的方法,包括有抽象方法的类称为抽象类.

//Abstract关键字必须与Virtual或Dynamic关键字同时使用,因为抽象方法必须被覆盖式实现.

//抽象类不能实例化,抽象方法不能包含方法体.

type

TDemo=class

private

protected

procedureX;virtual;abstract;

public

constructorCreate;

destructorDestroy;override;

published

end;

and

//一、表示逻辑与

if(a>0)and(b>0)then

//二、表示位运算

var

a,b,c:

Integer;

begin

c:

=(aandb);

end;

//使用And表示逻辑时,And左右的表达式必须用小括号括起,以避免以生条件的冲突.

//例如:

ifa>0andb>0then

//编译器可能会理解为:

ifa>(0andb)>0then

//或:

if(a>0)and(b>0)then

//但是实际编译时,编译器会产生一个冲突,报告错误.

//并且第一种可能包含了a>b>c的形式,这在Delphi中不被支持.

//所以使用And运算符时必须使用括号,以区分左右的条件.

//表示位运算时也必须加上括号,将And以及左右参数括起.

array

//Array用于表示数组,任何的对象都能被声明成数组.数组分为静态和动态的2种.

//静态数组

var

Arr1:

array[1..10]ofInteger;

//动态数组,由于声明时不知其元素个数,所以必须在后期用SetLength方法设置数组的大小

var

Arr2:

arrayofInteger;

//数组作为参数时,不能传入数组的大小,只能传入数组名,然后用Length方法获取数组的元素个数

functionX(A:

arrayofInteger):

Integer;

var

i:

Integer;

begin

Result:

=0;

fori:

=0toLength(A)-1do

Result:

=Result+A;

end;

as

//As用于将一个对象转换为另一个对象

procedureBtnClick(Sender:

TObject);

begin

(SenderasTButton).Caption:

='Clicked';

end;

//对于对象填充接口的转换,必须用As进行

(HTTPRIOasIExp).GetConnection;

//As不能用于数据类型的转换,下面的代码是错误的:

var

i:

Integer;

s:

string;

begin

s:

=(iasstring);

end;

//正确写法是:

s:

=string(i);

asm

//Asm关键字用于插入汇编代码,使用汇编代码时,必须使用asm...end;的结构,而非begin...end;

functionIntToHex(Value:

Integer;Digits:

Integer):

string;

asm

CMPEDX,32

JBE@A1

xorEDX,EDX

@A1:

PUSHESI

MOVESI,ESP

SUBESP,32

PUSHECX

MOVECX,16

CALLCvtInt

MOVEDX,ESI

POPEAX

CALLSystem.@LStrFromPCharLen

ADDESP,32

POPESI

end;

assembler

//Assembler关键字用于支持早期的汇编,如80386等.

//它和Asm的区别:

Asm允许使用Win32汇编,而Assembler只允许80x86汇编,它不允许Invoke语句的出现.

functionIntToHex(AValue:

Int64):

string;assembler;

automated

//Automated访问区分符用于描述一个自动类型的成员,它能够使程序的版本向下兼容.

//ComObj单元内的成员及其实例不能使用Automated访问区分符.

type

TDemo=class

automated

Str:

WideString;

end;

//在程序的下一个版本中,将Str做了修改,变成

type

TDemo=class

automated

Str:

AnsiString;

end

//则新版本的Str变量能够接受旧版本的WideString型数据,并自动转换成AnsiString.

//在实际开发中,如果没有特殊的需要,一般不用automated访问区分符.

begin

//begin关键字用于表示一段程序或一个结构的开始,必须用end关键字来结束.

procedureX;

begin

ShowMessage('ADemo');

end;

//一般的结构,如If,For,While等也需要用begin关键字来标出结构起始点

fori:

=1to100do

begin

sum:

=sum+i;

ifsum>1000thenBreak;

end;

case

//Case语句用于完成条件选择,Case语句的的被选择对象必须是有序类型,包括整型,枚举类型,字符型等.

//Case语句必须由end结束,如果没有相符合的选择项,可以加入else来作出通用选择.

functionGetDays(AYear,AMonth:

Integer):

Integer;

begin

caseAMonthof

1,3,5,7,8,10,12:

Result:

=31;

4,6,9,11:

Result:

=30;

2:

begin

ifIsLeapYear(AYear)then

Result:

=29

else

Result:

=28;

end;

else

Result:

=0;

end;

cdecl

//Cdecl是函数调用协定的一种,它规定了从C或C++编写的DLL中调用函数所必须遵守的规则.

//它可以将C或C++中的数据类型转换为Delphi的.

//例如C++中的代码:

intX(inti)

{

returni*2;

}

//这个函数被编译在Demo.dll中,用Delphi调用时必须使用:

functionX(i:

Integer):

Integer;Cdecl;external'Demo.dll';

class

//Class关键字用于声明或继承一个类,也可以使类和接口同时继承.

//另外,Class关键字也能用于声明类通用方法,使得父类可以从类内访问子类的方法.

type

ClassDemo=class(TObject)

private

public

constructorCreate;

end;

//如果用class声明方法,则该方法在类与相关类中都可以使用,譬如:

type

ClassA=class

private

public

procedureY;

end;

type

ClassB=class(ClassA)

private

public

classprocedureX;

end;

//则在使用时ClassA能够直接访问ClassB的X方法

procedureClassA.Y;

begin

Self.X;

end;

//此时父类将子类的class方法作为自身的方法进行调用.

const

//Const关键字用于声明常量,使用const声明的数据将不能在程序中被改变.

//也可以用来声明函数参数,用const指定的参数不允许在函数中改变.

constMyFileName='Delphi';

constMyInteger=100;

//用Const声明常量不需要指出其数据类型,系统会自动判断类型,并作自动调整.

//函数中可以用const声明不可更改的参数

functionX(consti:

Integer):

string;

//此时在函数操作过程中,i的值不可改变.

constructor

//constructor关键字用来声明一个类的构造函数,当类被实例化时,首先调用此函数

//构造函数一般用Create表示,Create方法能够连带类中存在的CreateWnd方法.

type

ClassDemo=class(TObject)

private

fValue:

Integer;

public

constructorCreate;

end;

constructorClassDemo.Create;

begin

fValue:

=0;

end;

contains

//Contains关键字指出了某个包(Package)是否包含某个文件.

//用Contains引入的文件必须被添加到包文件中,它可以避免关键文件的引用丢失.

packageDATAX;

requires

rtl,clx;

contains

Db,DBLocal,DBXpress;

end.

default

//Default关键字用于指出一个属性的默认值

//只有有序类型的属性才允许默认值的存在,否则必须在构造函数中初始化属性值.

type

ClassDemo=class

private

fValue:

Integer;

published

propertyValue:

IntegerreadfValuewritefValuedefault0;

end;

//它也可以指出一个类的默认属性

propertystrings[Index:

Integer]:

stringreadGetStringwritePutString;Default;

destructor

//Destructor用于标识析构函数,析构函数在类被释放时自动调用.

//析构函数只允许覆盖,再不允许重载.析构函数通常用Destroy作为函数名.

type

ClassDemo=class(TComponent)

public

destructorDestroy;override;

end;

//由于TComponent类中也有Destroy方法,所以要将其重写

//但是若要重载析构函数,则不允许,下面代码是错误的:

destructorDestroy;overload;

dispid

//DispId关键字被用在DispInterface接口中,用于指定特定的适配序号.

//在DispInterface接口中,适配序号必须是唯一的,

//如果不指定DispId,则系统会自动分配适配序号给接口内每一个方法.

//可以通过适配序号访问DispInterface接口中的方法.

type

IStringsDisp=dispinterface

['{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}']

propertyControlDefault[Index:

Integer]:

Olevariantdispid0;default;

functionCount:

Integer;dispid1;

propertyItem[Index:

Integer]:

Olevariantdispid2;

procedureRemove(Index:

Integer);dispid3;

procedureClear;dispid4;

functionAdd(Item:

Olevariant):

Integer;dispid5;

function_NewEnum:

IUnknown;dispid-4;

end;

dispinterface

//DispInterface用于声明一个特定的适配器接口,这个适配器能够接受标准系统接口中传入传出的数据.

//用DispInterface声明的接口不能被继承,只能够被引用.

//DispInterface中方法只能调用,并且必须被动态绑定.

//可以通过DispId为接口内方汉分配适配序号.

//DispInterface仅能用于Windows平台,如果在Linux下进行开发,则此关键字会自动被系统屏蔽.

//通常情况下,不使用DispInterface.

//实例请参见DispId

div

//Div用于求两数之整数商.用于Div运算的两个数值必须均为整型,其运算结果也为整型.

var

a,b,c:

Integer;

begin

a:

=20;b:

=3;

c:

=adivb;{6}

end;

do

//Do关键字用于For,While,On,With语句,构成特定的结构

//For语句:

fori:

=1to100dosum:

=sum+i;

//While语句:

whilei<100do

begin

 sum:

=sum+i;

 Inc(i);

end;

//On语句(异常处理):

try

 i:

=StrToInt(s);

except

 onexceptiondoShowMessage('Error!

');

end;

//With语句:

withMemo1.Linesdo

begin

 Clear;

 Append('abc');

 Append('123');

end;

downto

//DownTo关键字用于For语句,指明循环变量是递减的.

fori:

=100downto1do

ListBox1.Items.Add(IntToStr(i));

//在For语句中,循环变量递增用To关键字,递减用DownTo关键字.

dynamic

//Dynamic用于声明一个动态的方法,

//动态方法可以被覆盖,并且可以使代码大小尽可能的减少(区别于Virtual).

procedureX(i:

Integer);dynamic;

else

//else用于引导程序的运行方向,它可以与If,Case和On语句联用,当条件不满足时,转到else下运行

//If语句(在If语句中,else前不允许有分号):

ifa>bthen

c:

=a

else

c:

=b;

//Case语句:

caseTagOf

1:

Result:

=1;

2:

Result:

=2;

3:

Result:

=3;

else

Result:

=0;

end;

//On语句(异常处理):

try

i:

=StrToInt(s);

Excpet

onEZeroDividedoResult:

=1;

onEOverflowdoResult:

=2;

else

Result:

=0;

end;

end

//End用于结束一个语句块或是一个单元.

//它可以与begin,Case,Class,Interface,Asm,Unit,Package等相匹配.

//对于语句块(局部结束),End后必须添加分号.

//而对于单元或包(全局结束),end后必须添加句号.

//在If语句中else关键字前的End后不允许添加符号.

procedureX;

begin

 withButton1do

 begin

  ifButton1.ShowHintthen

   Button1.Caption:

='Hinted'

  else

   Button1.Caption:

='NotHinted';

 end;

end;

//在包内使用End来结束:

packageDATAX;

requires

rtl,

clx;

containsDb,DBLocal,DBXpress;

end.

except

//except关键字用于异常处理,必须用在try语句内,如果发生异常,则执行except后的语句

try

i:

=StrToInt(s);

except

ShowMessage('Error!

');

end;

export

//Export标明了函数调用协定,指出函数可以被输出,输出的函数能被本地或远程调用.

//其他程序可以用dll的形式调用程序内的函数.它是向下兼容的.

functionAdd(a,b:

Integer):

Integer;export;

//如果这个程序被编译为Demo.exe,并且另一个程序需要调用这个函数,可以使用以下语句

functionAdd(a,b:

Integer):

Integer;stdcall;external'Demo.exe';

exports

//exports用于输出对象,它必须被用在接口和实现之间,可以同时输出多个项,项与项之间用逗号分开.

libraryDemo;

functionX(i:

Integer):

string;stdcall;

begin

 Result:

=IntToStr(i);

end;

exports

 X;

begin

end.

//如果输出的对象被重载,则必须给对象起个别名,并注明参数.

libraryDemo;

functionX(i:

Integer):

string;overload;stdcall;

begin

 Result:

=IntToStr(i);

end;

functionX(s:

string):

Integer;overload;stdcall;

begin

 Result:

=StrToInt(s);

end;

exports

X(i:

Integer)name'x1',

X(s:

string)name'x2';

begin

end.

external

//External关键字用于引用一个外部的或是OBJ内的方法.

{$LDemo.OBJ}

procedureX(i:

Integer);external;

//如果是从dll或外部程序中引用,则可以使用以下代码:

functionA(FileName:

string):

string;external'Demo.dll';

//如果被引用的函数被重载,则必须另外指出引用的名称.

functionA(Name:

string):

string;overload;stdcall;external'Demo.dll'name'A1';

functionA(Code:

Integer):

string;overload;stdcall;external'Demo.dll'name'A2';

//使用External关键字时,必须注意大小写,否则将出现错误.

far

//Far标明了函数调用协定,指出函数可以被远程调用.

//其他程序可以用dll的形式调用程序内的函数.它是向下兼容的.

functionAdd(a,b:

Integer):

Integer;Far;

//如果这个程序被编译为Demo.exe,并且另一个处于其他计算机的程序需要调用这个函数,可以使用以下语句:

functionAdd(a,b:

Integer):

Integer;stdcall;external'Demo.exe';

file

//File关键字指出了文件操作类型,文件必须被声明为File,

//如果在File后追加Of和文件类型,则文件可以被定义为读写指定类型数据.

type

TPerson=record

PName:

string[32];

PAge:

Integer;

end;

var

PFile:

fileofTPerson;

finalization

//finalization关键字标识了单元被释放时所要调用的方法,

//通常是释放掉单元中不能自动释放的对象,也可以不用.

//finalization最常用的情况是对OLE对象做反初始化.

initialization

ActiveX.OleInitialize(nil);

finalization

ActiveX.OleUninitialize;

finally

//finally关键字指出了异常处理中最后必须要调用的方法,

//不论是否发生异常,finally后的语句总是在try语句结束时执行.

try

Node:

=Node.GetNext;

Edit1.Text:

=Node.Text;

finally

 Node:

=nil;

end;

for

//For关键字引出For循环结构,用于做指定次数的循环.

fori:

=1to100dosum:

=sum+i;

//如果循环变量是递减的,则可以用DownTo关键字

fori:

=100downto1doInc(sum);

forward

//Forward关键字用于方法的前置定义.只定义方法声明,然后在程序的后面对方法进行实现.

//这么做有利于代码的可读性,可以将所有的声明放在一起,然后将所有的实现也放在一起.

functionX(i:

Integer):

Integer;forward;

procedureY(s:

string);forward;

...

functionX;

begin

Result:

=i*2;

end;

procedureY;

begin

WriteLn(s);

end;

//用Forward前置声明的方法在实现时不需要再输入方法的参数和返回值,直接使用方法名即可.

function

//Function用于

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1