




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Delphi 关键字详解【转】2010-08-07 14:14:29|分类:Delphi|字号订阅absolute/它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string32; StrLen: Byte absolute Str; /这个声明指定了变量StrLen起始地址与Str相同. /由于字符串的第0个位置保存了字符串的长度, 所以StrLen的值即字符串长度. begin Str := abc; Edit1.Text := IntToStr(StrLen); end;abstract/它允许你创建抽象的方法, 包括有抽象方法的类称为抽象类. /Abstract关键字必须与Virtual或Dynamic关键字同时使用, 因为抽象方法必须被覆盖式实现. /抽象类不能实例化, 抽象方法不能包含方法体. type TDemo = class private protected procedure X; virtual; abstract; public constructor Create; destructor Destroy; override; published end;and/一、表示逻辑与 if (a0) and (b0) then /二、表示位运算 var a,b,c: Integer; begin c := (a and b); end; /使用And表示逻辑时, And左右的表达式必须用小括号括起, 以避免以生条件的冲突. /例如: if a0 and b0 then /编译器可能会理解为: if a(0 and b)0 then /或: if (a0) and (b0) then /但是实际编译时, 编译器会产生一个冲突, 报告错误. /并且第一种可能包含了abc的形式, 这在Delphi中不被支持. /所以使用And运算符时必须使用括号, 以区分左右的条件. /表示位运算时也必须加上括号, 将And以及左右参数括起.array/Array用于表示数组, 任何的对象都能被声明成数组.数组分为静态和动态的种. /静态数组 var Arr1: array 1.10 of Integer; /动态数组, 由于声明时不知其元素个数, 所以必须在后期用SetLength方法设置数组的大小 var Arr2: array of Integer; /数组作为参数时, 不能传入数组的大小, 只能传入数组名, 然后用Length方法获取数组的元素个数 function X(A: array of Integer): Integer; var i: Integer; begin Result := 0; for i := 0 to Length(A)-1 do Result := Result + Ai; end;as/As用于将一个对象转换为另一个对象 procedure BtnClick(Sender:TObject); begin (Sender as TButton).Caption := Clicked; end; /对于对象填充接口的转换, 必须用As进行 (HTTPRIO as IExp).GetConnection; /As不能用于数据类型的转换, 下面的代码是错误的: var i: Integer; s: string; begin s := (i as string); end; /正确写法是: s := string(i);asm/Asm关键字用于插入汇编代码, 使用汇编代码时, 必须使用asm.end;的结构, 而非begin.end; function IntToHex(Value: Integer; Digits: Integer): string; asm CMP EDX, 32 JBE A1 xor EDX, EDX A1: PUSH ESI MOV ESI, ESP SUB ESP, 32 PUSH ECX MOV ECX, 16 CALL CvtInt MOV EDX, ESI POP EAX CALL System.LStrFromPCharLen ADD ESP, 32 POP ESI end;assembler/Assembler关键字用于支持早期的汇编, 如80386等. /它和Asm的区别:Asm允许使用Win32汇编, 而Assembler只允许80x86汇编, 它不允许Invoke语句的出现. function IntToHex(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关键字来结束. procedure X; begin ShowMessage(A Demo); end; /一般的结构, 如If, For, While等也需要用begin关键字来标出结构起始点 for i:=1 to 100 do begin sum := sum + i; if sum 1000 then Break; end;case/Case语句用于完成条件选择, Case语句的的被选择对象必须是有序类型, 包括整型, 枚举类型, 字符型等. /Case语句必须由end结束,如果没有相符合的选择项, 可以加入else来作出通用选择. function GetDays(AYear,AMonth: Integer): Integer; begin case AMonth of 1,3,5,7,8,10,12: Result := 31; 4,6,9,11: Result := 30; 2: begin if IsLeapYear(AYear) then Result:=29 else Result:=28; end; else Result:=0; end;cdecl/Cdecl是函数调用协定的一种, 它规定了从C或C+编写的DLL中调用函数所必须遵守的规则. /它可以将C或C+中的数据类型转换为Delphi的. /例如C+中的代码: int X(int i) return i*2; /这个函数被编译在Demo.dll中, 用Delphi调用时必须使用: function X(i: Integer): Integer; Cdecl; external Demo.dll;class/Class关键字用于声明或继承一个类, 也可以使类和接口同时继承. /另外, Class关键字也能用于声明类通用方法, 使得父类可以从类内访问子类的方法. type ClassDemo = class(TObject) private public constructor Create; end; /如果用class声明方法, 则该方法在类与相关类中都可以使用, 譬如: type ClassA = class private public procedure Y; end; type ClassB = class(ClassA) private public class procedure X; end; /则在使用时ClassA能够直接访问ClassB的X方法 procedure ClassA.Y; begin Self.X; end; /此时父类将子类的class方法作为自身的方法进行调用.const/Const关键字用于声明常量, 使用const声明的数据将不能在程序中被改变. /也可以用来声明函数参数, 用const指定的参数不允许在函数中改变. const MyFileName = Delphi; const MyInteger = 100; /用Const声明常量不需要指出其数据类型, 系统会自动判断类型, 并作自动调整. /函数中可以用const声明不可更改的参数 function X(const i: Integer): string; /此时在函数操作过程中, i的值不可改变.constructor/constructor关键字用来声明一个类的构造函数, 当类被实例化时, 首先调用此函数 /构造函数一般用Create表示, Create方法能够连带类中存在的CreateWnd方法. type ClassDemo = class(TObject) private fValue: Integer; public constructor Create; end; constructor ClassDemo.Create; begin fValue := 0; end;contains/Contains关键字指出了某个包(Package)是否包含某个文件. /用Contains引入的文件必须被添加到包文件中, 它可以避免关键文件的引用丢失. package DATAX; requires rtl, clx; contains Db, DBLocal, DBXpress; end.default/Default关键字用于指出一个属性的默认值 /只有有序类型的属性才允许默认值的存在, 否则必须在构造函数中初始化属性值. type ClassDemo = class private fValue: Integer; published property Value: Integer read fValue write fValue default 0; end; /它也可以指出一个类的默认属性 property stringsIndex: Integer: string read GetString write PutString; Default;destructor/Destructor用于标识析构函数, 析构函数在类被释放时自动调用. /析构函数只允许覆盖, 再不允许重载.析构函数通常用Destroy作为函数名. type ClassDemo = class(TComponent) public destructor Destroy;override; end; /由于TComponent类中也有Destroy方法, 所以要将其重写 /但是若要重载析构函数, 则不允许, 下面代码是错误的: destructor Destroy; overload;dispid/DispId关键字被用在DispInterface接口中, 用于指定特定的适配序号. /在DispInterface接口中, 适配序号必须是唯一的, /如果不指定DispId, 则系统会自动分配适配序号给接口内每一个方法. /可以通过适配序号访问DispInterface接口中的方法. type IStringsDisp = dispinterface EE05DFE2-5549-11D0-9EA9-0020AF3D82DA property ControlDefaultIndex: Integer: Olevariant dispid 0; default; function Count: Integer; dispid 1; property ItemIndex: Integer: Olevariant dispid 2; procedure Remove(Index: Integer); dispid 3; procedure Clear; dispid 4; function Add(Item: Olevariant): Integer; dispid 5; function _NewEnum: IUnknown; dispid -4; end;dispinterface/DispInterface用于声明一个特定的适配器接口, 这个适配器能够接受标准系统接口中传入传出的数据. /用DispInterface声明的接口不能被继承, 只能够被引用. /DispInterface中方法只能调用, 并且必须被动态绑定. /可以通过DispId为接口内方汉分配适配序号. /DispInterface仅能用于Windows平台, 如果在Linux下进行开发, 则此关键字会自动被系统屏蔽. /通常情况下, 不使用DispInterface. /实例请参见DispIddiv/Div用于求两数之整数商.用于Div运算的两个数值必须均为整型, 其运算结果也为整型. var a,b,c:Integer; begin a := 20; b := 3; c := a div b; 6 end;do/Do关键字用于For, While, On, With语句, 构成特定的结构 /For语句: for i := 1 to 100 do sum:=sum+i; /While语句: while i b then c := a else c:=b; /Case语句: case Tag Of 1:Result:=1; 2:Result:=2; 3:Result:=3; else Result:=0; end; /On语句(异常处理): try i := StrToInt(s); Excpet on EZeroDivide do Result := 1; on EOverflow do Result := 2; else Result := 0; end;end/End用于结束一个语句块或是一个单元. /它可以与begin, Case, Class, Interface, Asm, Unit, Package等相匹配. /对于语句块(局部结束), End后必须添加分号. /而对于单元或包(全局结束), end后必须添加句号. /在If语句中else关键字前的End后不允许添加符号. procedure X; begin with Button1 do begin if Button1.ShowHint then Button1.Caption := Hinted else Button1.Caption := Not Hinted; end; end; /在包内使用End来结束: package DATAX; requires rtl, clx; contains Db, DBLocal, DBXpress; end.except/except关键字用于异常处理, 必须用在try语句内, 如果发生异常, 则执行except后的语句 try i := StrToInt(s); except ShowMessage(Error!); end;export/Export标明了函数调用协定, 指出函数可以被输出, 输出的函数能被本地或远程调用. /其他程序可以用dll的形式调用程序内的函数.它是向下兼容的. function Add(a,b: Integer): Integer; export; /如果这个程序被编译为Demo.exe, 并且另一个程序需要调用这个函数, 可以使用以下语句 function Add(a,b: Integer): Integer; stdcall; external Demo.exe;exports/exports用于输出对象, 它必须被用在接口和实现之间, 可以同时输出多个项, 项与项之间用逗号分开. library Demo; function X(i: Integer): string; stdcall; begin Result:=IntToStr(i); end; exports X; begin end. /如果输出的对象被重载, 则必须给对象起个别名, 并注明参数. library Demo; function X(i: Integer): string; overload; stdcall; begin Result := IntToStr(i); end; function X(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内的方法. $L Demo.OBJ procedure X(i:Integer);external; /如果是从dll或外部程序中引用, 则可以使用以下代码: function A(FileName: string): string; external Demo.dll; /如果被引用的函数被重载, 则必须另外指出引用的名称. function A(Name: string): string; overload; stdcall; external Demo.dll name A1; function A(Code: Integer): string; overload; stdcall; external Demo.dll name A2; /使用External关键字时, 必须注意大小写, 否则将出现错误.far/Far标明了函数调用协定, 指出函数可以被远程调用. /其他程序可以用dll的形式调用程序内的函数.它是向下兼容的. function Add(a,b: Integer): Integer; Far; /如果这个程序被编译为Demo.exe, 并且另一个处于其他计算机的程序需要调用这个函数, 可以使用以下语句: function Add(a,b: Integer): Integer; stdcall; external Demo.exe;file/File关键字指出了文件操作类型, 文件必须被声明为File, /如果在File后追加Of和文件类型, 则文件可以被定义为读写指定类型数据. type TPerson = record PName: string32; PAge: Integer; end; var PFile: file of TPerson;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循环结构, 用于做指定次数的循环. for i := 1 to 100 do sum := sum + i; /如果循环变量是递减的, 则可以用DownTo关键字 for i := 100 downto 1 do Inc(sum);forward/Forward关键字用于方法的前置定义.只定义方法声明, 然后在程序的后面对方法进行实现. /这么做有利于代码的可读性, 可以将所有的声明放在一起, 然后将所有的实现也放在一起. function X(i: Integer): Integer; forward; procedure Y(s: string); forward; . function X; begin Result := i * 2; end; procedure Y; begin WriteLn(s); end; /用Forward前置声明的方法在实现时不需要再输入方法的参数和返回值, 直接使用方法名即可.function/Function用于声明函数 function X(i: Integer): Integer; /它也可以用于动态函数的声明 type TFun = function(i: Integer): Integer of object; /动态声明时, 不需要指出函数名, 只需要指出参数和返回类型就可以, 具体的函数名可以在后期绑定.goto/Goto语句用在跳转行号, 可以跳转到当前结构层内任意位置. /必须在声明处用label关键字声明行号. /由于Goto语句会破坏程序的结构, 不推荐使用. var a,b: Integer; label X,Y; begin if a b then goto X else goto Y; X: WriteLn(a b); Y: WriteLn(b a); end;if/If关键字引出If条件语句, 用于对条件进行判断. var a,b: Integer; begin a := 2; b := 3; if ab then WriteLn(a= + IntToStr(a) else WriteLn(b= + IntToStr(b); end; /If语句的通常结构是If.Then.else, else语句也可以不要. /在If语句内如果有多个子语句, 则必须用begin.End结构进行区分. if a b then begin WriteLn(ab); WriteLn(a= + IntToStr(a); WriteLn(b= + IntToStr(b); End else WriteLn(ba);implementation/Implementation标识了单元中的实现部分, 单元的基本结构为: /Unit.Interface.implementation.end. /函数体, 过程体等必须写在implementation关键字后. /如果在implementation后引用对象, 则对象是非公开的, 仅能供单元自身使用. implementation uses frmAbout; begin FormAbout.Show; end; /一个完整的单元必须拥有implementation部分.implements/Implements指出了一个属性从接口继承, 此时属性被转换成接口对象. /通过接口动态绑定属性, 并动态的设定属性值. type IMyInterface = interface procedure P1; procedure P2; end; TMyImplclass = class procedure P1; procedure P2; end; TMyclass = class(TInterfacedObject, IMyInterface) FMyImplClass: TMyImplClass; property MyImplClass: TMyImplclass read FMyImplclass implements IMyInterface; procedure IMyInterface.P1 = MyP1; procedure MyP1; end; /通过implements声明后, 可以在类声明时指出接口中方法的实体, 如上例中的: procedure IMyInterface.P1 = MyP1;in/In用于判断一个集合中是否包含某个元素.被判断的内容必须是单个集合元素和一个集合的实例. type TCol = (cA,cB,cC); TCols = set of TCol; var Cols: TCols; begin Cols := cA,cB; if cA in Cols then ShowMessage(cA in Cols) else ShowMessage(cA not in Cols); end; /In也用于工程文件中, 用于标识某个文件是否被工程所引用. Uses Unit1 in Unit1.pas; /In可以被用在For语句中, 用于循环取出一个集合中的元素. var s: string; sl: TStringList; begin . for s In sl do begin ShowMessage(s); end; end;index/Index用于在属性中标识序号, 以便用相同的属性方法(Get,Set)对不同的属性进行操作. type TForm1 = class(TForm) private function GetInfo(const Index: Integer): Longint; procedure SetInfo(const Index: Integer; const Value: Longint); public property iLeft:Longint index 0 read GetInfo write SetInfo; property iTop:Longint index 1 read GetInfo write SetInfo; property iWidth:Longint index 2 read GetInfo write SetInfo; property iHeight:Longint index 3 read GetInfo write SetInfo; end; function TForm1.GetInfo(const Index: Integer): Longint; begin case Index of 0: result := self.Left; 1: Result := self.Top; 2: result := self.Width; 3: result := self.Height; end; end; /Index关键字也用于在属性中指出多个元素, 例如: property SelectedIndex: Integer: Boolean read GetSelected write SetSelected;inherited/Inherited用于调用父类的方法. type TDemo = class(TComponent) public constructor Create(AOwner: TComponent); override; end; constructor TDemo.Create(AOwner: TComponent); begin inherited Create(AOwner); end; /如果调用的是与自身同名的方法, 则也可以省去方法名和参数.如上例中的 inherited Create(AOwner); /可以改成: Inherited;initialization/initialization关键字标识了单元被载入时所要调用的方法, /通常是初始化一些不能自动初始化的对象, 也可以不用. /initialization最常用的情况是对OLE对象做初始化. initialization ActiveX.OleInitialize(nil); finalization ActiveX.OleUninitialize;inline/InLine关键字用于Asm或assembler结构中, /用于指出该汇编语句是向下兼容的.它对于程序的编译没有任何影响. function IntToStr(Value: Integer): string; asm InLine; PUSH ESI MOV ESI, ESP SUB ESP, 16 xor ECX, ECX PUSH EDX xor EDX, EDX CALL CvtInt MOV EDX, ESI POP EAX CALL System.LStrFromPCharLen ADD ESP, 16 POP ESI end;interface/Interface标识了单元中的接口部分, 单元的基本结构为: /Unit.Interface.implementation.end. /函数, 过程等的声明必须写在Interface关键字后. /如果在Interface后引用对象, 则对象是没有实例的, 使用时必须被实例化. Interface uses frmAbout; var FAbout: TFormAbout; begin FAbout : TFormAbout.Create(Self); FAbout.Show; end; /一个完整的单元必须拥有Interface部分. /Interface也可以用作接口的声明. type IMalloc = interface(IInterface) 00000002-0000-0000-C000-000000000046 function Alloc(Size: Integer): Pointer; stdcall; function Realloc(P: Pointer; Size: Integer): Pointer; stdcall; procedure Free(P: Pointer); stdcall; function GetSize(P: Pointer): Integer; stdcall; function DidAlloc(P: Pointer): Integer; stdcall; procedure HeapMinimize; stdcall; end;is/Is关键字用于对象的判断, 有某些情况下, 也可以作As使用. var Comp: TComponent; begin . if Comp Is TEdit then (Comp as TEdit).Text := Edit; end;label/label关键字用于声明行号标签, 以便用Goto进行转向, 不推荐使用. var a,b: Integer; label X,Y; begin if a b then goto X else goto Y; X: WriteLn(ab); Y: WriteLn(ba); end;library/Library关键字用于指出一个工程为类库.类库编译后生成DLL文件, 可被其他程序调用. library Editors; uses EdInit, EdInOut, EdFormat, EdPrint; exports InitEditors, doneEditors name done, InsertText name Insert, DeleteSelection name Delete, FormatSelection, PrintSelection name Print, SetErrorHandler; begin InitLibrary; end.message/Message关键字用于声明消息方法, /带有Message的方法必须指出接收的消息类型, 并通过引用将消息传入方法中, 以便进行处理. procedure Refresh(var Msg: TMessageRecordtype); message ID_REFRESH; procedure Refresh(var Msg: TMessageRecordtype); begin if Chr(Msg.Code) = #13 then . else inherited; end; /用户可以自定义消息, 自定义消息也能够被Message接收, 并引发事件.mod/Mod用于求两数之整数模, 即余数.用于Mod运算的两个数值必须均为整型, 其运算结果也为整型. var a,b,c: Integer; begin a := 20; b := 3; c := a mod b; 2 end;name/Name关键字用于指出方法的别名, /对于一个要被外部引用的方法, 建议用Name申请方法别名, 以避免外部程序改动方法的实体内容. /从外部引用一个方法时, 如果该方法有别名, 则必须用Name进行标识. function MessageBox(HWnd: Integer; Text, Caption: PChar; Flags: Integer): Integer; stdcall; external user32.dll name MessageBoxA;near/Near标明了函数调用协定, 指出函数可以被本地调用. /其他程序可以用dll的形式调用程序内的函数.它是向下兼容的. function Add(a,b: Integer): Integer; near; /如果这个程序被编译为Demo.exe, 并且另一个处于本地的程序需要调用这个函数, 可以使用以下语句: function Add(a,b: Integer): Integer; stdcall; external Demo.exe;nil/Nil用于表示一个空指针, 或是没有实例的对象. while Node nil do begin ListBox1.Items.Add(Node.Text); Node := Node.GetNext; end;nodefault/NoDefault关键字指出了一个属性不允许有默认值, 这通常用在继承中. type TClassA = class private fValue: Integer; published property Value: Integer read fValue write fValue default 0; end; TClassB = class(TClassA) published property Value:Integer read fValue write fValue nodefault; end; /由上例可知, TClassA中的Value有默认值0, /TClassB继承了TClassA, 所以也继承了其默认值, 在此用NoDefault去掉默认值not/Not用于取反, 它否定了原先的结果.例如: if a b then /可以写成: if not(a 0) or (b0) then /二、表示位运算 var a,b,c: Integer; begin c := (a or b); end; /使用Or表示逻辑时, Or左右的表达式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医疗纠纷预防与处理条例试题及答案
- 第五单元《统一标准分类》教案西师大版一年级下册
- 青岛农行面试题目及答案
- 平安面试题目及答案
- 海洋生物多样性保护风险评估合同
- 2025-2030中国裁断机行业安全生产管理与风险防控报告
- 电力系统智能设计技术合同
- 2025-2030中国第三方医学影像诊断中心服务质量标准与患者信任度报告
- 古代宗教仪式演变考古学合同
- 核反应堆堆芯化学成分监测合同
- 汽车服务工程专业导论(第2版)课件:汽车概论
- CNAS体系培训课件
- 苏州威微电子材料有限公司建设苏州集成电路高端材料生产项目环境影响报告书
- 2025年离婚协议书版模板
- ISO13485质量体系培训讲义
- 2025年度化妆品品牌形象设计与传播合同
- 中国缓冲包装材料行业市场全景监测及投资前景展望报告
- 2025江苏南通市启东市不动产登记服务中心编外劳务人员招聘4人历年高频重点提升(共500题)附带答案详解
- DB3701T 15-2020 基层网格化服务管理规范
- 《商务馈赠》课件
- DB32T 4616-2023 卫生健康非现场执法工作规范
评论
0/150
提交评论