程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Delphi經常使用症結字用法詳解

Delphi經常使用症結字用法詳解

編輯:更多關於編程

Delphi經常使用症結字用法詳解。本站提示廣大學習愛好者:(Delphi經常使用症結字用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Delphi經常使用症結字用法詳解正文


本文具體引見了Delphi中經常使用的各個症結字稱號及用法,供年夜家在編程進程中自創參考之用。概況以下:

absolute:

//它使得你可以或許創立一個新變量, 而且該變量的肇端地址與另外一個變量雷同.
var
 Str: string[32];
 StrLen: Byte absoluteStr;
//這個聲明指定了變量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:

//1、表現邏輯與
if (a>0) and (b>0) then
//2、表現位運算
var
a,b,c: Integer;
begin
c := (a and b);
end;
//應用And表現邏輯時, And閣下的表達式必需用小括號括起, 以免以生前提的抵觸.
//例如:
if a>0 and b>0 then
//編譯器能夠會懂得為:
if a>(0 and b)>0 then
//或:
if (a>0) and (b>0) then
//然則現實編譯時, 編譯器會發生一個抵觸, 申報毛病.
//而且第一種能夠包括了a>b>c的情勢, 這在Delphi中不被支撐.
//所以應用And運算符時必需應用括號, 以辨別閣下的前提.
//表現位運算時也必需加上括號, 將And和閣下參數括起.

array:

//Array用於表現數組, 任何的對象都能被聲明成數組.數組分為靜態和靜態的2種.
//靜態數組
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 + A[i];
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 strings[Index: 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 ControlDefault[Index: Integer]: Olevariant dispid 0; default;
  function Count: Integer; dispid 1;
  property Item[Index: 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.
//實例請拜見DispId

div:

//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 < 100 do
begin
 sum := sum + i;
 Inc(i);
end;

//On語句(異常處置):
try
 i := StrToInt(s);
except
 on exception do ShowMessage('Error!');
end;

//With語句:
with Memo1.Lines do
begin
 Clear;
 Append('abc');
 Append('123');
end;

downto:

//DownTo症結字用於For語句, 指明輪回變量是遞加的.
for i := 100 downto 1 do
ListBox1.Items.Add(IntToStr(i));
//在For語句中, 輪回變量遞增用To症結字, 遞加用DownTo症結字.

dynamic:

//Dynamic用於聲明一個靜態的辦法, 
//靜態辦法可以被籠罩, 而且可使代碼年夜小盡量的削減(差別於Virtual).
procedure X(i: Integer); dynamic;

else:

//else用於引誘法式的運轉偏向, 它可以與If, Case和On語句聯用, 當前提不知足時, 轉到else下運轉
//If語句(在If語句中, else前不許可有分號):
if a > 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用於輸入對象, 它必需被用在接口和完成之間, 可以同時輸入多個項, 項與項之間用逗號離開.
libraryDemo;
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的情勢挪用法式內的函數.它是向下兼容的.
functionAdd(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: string[32];
  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 dosum := 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用於聲明函數
functionX(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 a>b 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('a>b');
 WriteLn('a=' + IntToStr(a));
 WriteLn('b=' + IntToStr(b));
End
else
 WriteLn('b>a');

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 Selected[Index: 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('a>b');
Y:
 WriteLn('b>a');
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); messageID_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 < b) then
//Not症結字平日用於切換Boolean型的屬性
procedure Button1Click(Sender: TObject);
begin
 StatusBar1.Visible := not StatusBar1.Visible;
end;

object:

//Object用於聲明一個對象, 這個對象可所以隨意率性的, 而且向下兼容.Object只能被Object所繼續.
//聲明對象的辦法與聲明類的辦法是雷同的.
type
 ODemoA = object
 end;
 ODemoB = object(ODemoA)
 end;

//Object症結字還用於聲明靜態函數或進程, 例如:
type
 TMyFun = function(i: Integer): Integer of Object;
 TMyProc = procedure(s: string) of object;

//經由object聲明的函數或進程可以主動態的綁定到指定的函數體, 或是綁定到控件是事宜中.

of:

//Of症結用於和其他症結字組成指定的構造.Of可以與Case, Class, Array, File, Set, Object連用.
//Case語句:
case Tag Of
 0: Result := 'a';
 1: Result := 'b';
end;

//Class語句:
type
 TDemo = class of TComponent;

//Array構造:
var
 MyInt: array of Integer;

//File構造:
var
 MyFile: file of Byte;

//Set語句:
type
 TCol = (cA,cB,cC);
 TCols = set of TCol;

//Object構造:
type
 MyFun = function(I: Integer): Integer of Object;

on:

//On症結字用於異常處置, 指動身生的異常, 並獲得異常信息.
try
 i := StrToInt(s);
except
 on E: exception do
  ShowMessage(E.Message);
end;

or:

//1、表現邏輯或
if (a>0) or (b>0) then
//2、表現位運算
var
a,b,c: Integer;
begin
c := (a or b);
end;

//應用Or表現邏輯時, Or閣下的表達式必需用小括號括起, 以免以生前提的抵觸
//假如在前提語句中應用 Or, 則編纂器不曉得用戶應用Or做甚麼
例如:
if a>0 or b>0 then
//編譯器能夠會懂得為:
if a>(0 or b)>0 then
//或許
if (a>0) or (b>0) then
//然則現實編譯時, 編譯器會發生一個抵觸, 申報毛病
//而且第一種能夠包括了a>b>c的情勢, 這在Delphi中不被支撐
//所以應用Or運算符時必需應用括號, 以辨別閣下的前提.
//表現位運算時也必需加上括號, 將Or和閣下參數括起.

out:

//Out症結字解釋了辦法參數的輸入方法, 普通的函數只能有一個前往值, 
//應用Out可以在一個函數中前往多個成果.
//Out和var分歧, Out是以前往值的情勢停止參數前往, 而var是直接輸出一個參數的地址.
procedure X(out i: Integer; out s: string);
begin
 i := i * 2;
 s := s + 'abc';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 s: string;
begin
 i := 20;
 s := 'xxx';
 X(i,s);
end;

overload:

//Overload症結字指出了用於重載的辦法, 重載即辦法名雷同, 
//然則參數數目, 類型或次序分歧, 知足此前提的組成重載.
function X(i: Integer): string; overload;
function X(s: string): string; overload;
//從父類繼續時, 假如子類具有和父類雷同的辦法, 則也必需用overload組成重載, 
//然則此類重載也必需知足重載的請求.
type
 TDemo = class(TComponent)
 public
  procedure CreateWnd(AOwner: TWinControl); overload;
 end;

//如上例, 子類具有的辦法為:
procedure CreateWnd; {繼續自父類}
procedure CreateWnd(AOwner: TWinControl); {子類聲明}
//共兩個CreateWnd辦法.

//假如不應用重載, 則在子類中可以籠罩父類的辦法.

override:

//Override用於籠罩一個Virtual或是Dynamic情勢的辦法.
//籠罩時必需沿用被籠罩辦法的聲明, 而且不許可修正原辦法的參數和前往類型.
procedure Create(AOwner: TComponent); override;
//Override多用於繼續, 用子類籠罩失落父類的辦法.
type
 TClassA = class
  procedure X; virtual;
 end;

 TClassB = class(TClassA)
  procedure X; override;
 end;

//如上例, 子類具有的辦法為:
procedure X; {從父類籠罩}
//父類具有的辦法為:
procedure X; {父類本身辦法, 未被籠罩}

//假如父類的辦法未用Virtual或Dynamic聲明, 
//或是有修正參數的須要, 則必需用Reintroduce症結字停止籠罩.

package:

//Package症結字用於指出一個工程為控件庫.
//控件庫編譯後生成BPL文件, 可被裝置到Delphi的控件庫中, 從而在今後的開辟中應用控件.
package DATAX;
 requires
  rtl,
  clx;
 contains
  MyUnit in 'C:\MyProject\MyUnit.pas';
end.

packed:

//Packed症結字用於對構造體記載或數組停止打包, 打包後被打包對象的體積能明顯減小.
type
 TPerson = packed Record
  PName: string[32];
  PAge: Integer;
 end;
 MyArray: packed array of PChar;

pascal:

//Pascal標清楚明了函數挪用協議, 
//指出函數在挪用時遵守Pascal緣由, 即先對一切的變量停止初始化, 
//防止因異步線程挪用而發生的毛病.它是向下兼容的.
function X(i: Integer): Integer; Pascal;
begin
 Result := i * 2;
end;

private:

//Private標清楚明了類內元素的拜訪辨別權限, 被Private辨別的元素只能被本類外部拜訪.

procedure:

//Procedure用於聲明進程
procedureX(i: Integer);
//它也能夠用於靜態函數的聲明
type
 TProc = procedure(i: Integer) of object;

//靜態聲明時, 不須要指出進程名, 只須要指出參數便可以, 詳細的進程名可以在前期綁定.

program:

//Program症結字用於指出一個工程為運用法式.控件庫編譯後生成exe文件, 可以直接履行
program Project1;
uses
 Forms,
 Unit1 in 'Unit1.pas' ;
{$R *.res}
begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

property:

//Property症結字用於聲明屬性, 屬性分為顯式屬性和隱式屬性兩種, 
//只要聲明在published拜訪辨別符下的屬性才是顯式屬性, 可以直接在對象檢查器中檢查.
type
 TDemo = class
 Private
  fValue: Integr;
 Published
  property Value: Integer read fValue write fValue;
 end;
//事宜也是屬性的一種, 可以在published辨別符下用Property停止聲明
type
 TOnTextChange=procedure (Sender: TObject) of object;
 TDemo = class
 private
  fEvent: TOnTexChange;
 published
  property OntextChange: TOnTextChange read fEvent write fEvent;
 end;

protected:

//Protected標清楚明了類內元素的拜訪辨別權限, 被Protected辨別的元素只能被本類外部和其子類拜訪.

public:

//Public標清楚明了類內元素的拜訪辨別權限, 被Public辨別的元素可以或許被類內和類外任何對象拜訪.

published:

//Published標清楚明了類內元素的拜訪辨別權限.
//被Published辨別的元素可以或許被類內和類外任何RTTI對象拜訪
//只在聲明在Published辨別符下的屬性能力夠成為顯式屬性並在對象檢查器中顯示.

raise:

//Raise語句用於拋出異常, 
//假如願望經由過程內部法式處置異常, 或是在異常產生時從新將異常拋出, 可使用Raise語句.
function GetString(i: Integer): string;
begin
 if i < 0 then
  raise exception.Create('Integer Cannot smaller than 0');
 Result := IntToStr(i);
end;
//在異常處置中, 可以從新拋出異常
try
 i := StrToInt(s);
except
 on E: exception do
  raise exception.Create(E.Message);
end;

read:

//Read用於標識屬性中讀取所應用的成員或辦法.
private
 fValue: Integer;
published
 property Value: Integer readfValue;
//上例中即注解Value屬性的值從fValue成員上讀取.

readonly:

//ReadOnly症結字用於標識一個對象能否只讀.
propertyReadOnly;
//當ReadOnly設為True時, 不許可用戶手動修正屬性, 只能經由過程其他對象來操作.

record:

//Record症結字用於聲明一個構造體記載, 
//一個構造體可以視為一個不須要實例化的對象, 具有本身的成員.
type
 TPerson = record
  PName: string[32];
  PAge: Integer;
 end;

register:

//Register標清楚明了函數挪用協議, 指出函數在被挪用時可以在注冊表內留下記載.它是向下兼容的.
functionAdd(a,b: Integer): Integer; Register; Register
//症結字還用於向控件庫或是IDE注冊控件或是專家對象.
procedure Register;
begin
 RegisterComponents('Sample', [TDemo]);
end;

reintroduce:

//Reintroduce用於從新宣布辦法, 平日用於繼續時, 
//假如要籠罩的辦法是靜態辦法, 或是須要修正辦法的參數等, 必需用Reintroduce停止重宣布.
//關於Virtual或Dynamic辦法, 可以直接用Override停止籠罩.
type
 TClassA = class
  procedure X;
 end;
 TClassB = class(TClassA)
  procedure X; reintroduce;
 end;
 TClassC = class(TClassB)
  procedure X(i: Integer); reintroduce;
 end;

repeat:

//repeat症結字用於引出repeat輪回構造, 
//該輪回必需先履行一次輪回體, 然後再對輪回前提停止斷定.repeat必需與Until症結字結合應用.
i := 0;
repeat
 sum := sum + i;
 Inc(i);
until(i >= 100);

requires:

//Requires症結字指出了編譯Package時的必備前提.若Requires的前提未知足, 則不許可編譯包.
package DATAX;
 requires
  rtl,
  clx;
end.

resourcestring:

//ResourceString用於聲明資本字符串, 資本字符串可以在被聲明的構造內應用.
ResourceString
 CreateError = 'Cannot create file %s';
 OpenError = 'Cannot open file %s';
 LineTooLong = 'Line too long';
 ProductName = 'Borland Rocks';
 SomeResourceString = SomeTrueConstant;

safecall:

//Safecall是函數挪用協議的一種, 它劃定了被COM挪用的函數所必需遵照和規矩.
//在編譯時, Safecall聲明的函數被編譯成COM接口兼容的.
procedure X(s: WideString); safecall;
//在編譯後成為:
procedure X(s: PAnsiString);

set:

//Set症結字用於聲明聚集類, 聚集類許可用聚集運算符, 如in等停止操作.
type
 TCol = (cA,cB,cC);
 TCols = set ofTCol;
//操作時許可應用加減符號來添加或刪除某個聚集元素
var
 Cols: Tcols;
begin
 Cols := Cols + [cA,cB];
end;

shl:

//SHL表現向左移位, 左移的位數即乘以2的冪數
var
 x: Integer;
begin
 X := 2 shl 3; {16}
end;

shr:

//SHR表現向右移位, 右移的位數即除以2的冪數
var
 x: Integer;
begin
 X := 16 shr 2; {4}
end;

stdcall:

//Stdcall是函數挪用協議的一種, 它劃定了能讓法式挪用的函數所應遵照的規矩.
//Stdcall症結字必需在主調方和被調方之間構成配對.
//例如, 被調方函數:
Library Demo;
function X(i: Integer): Integer; stdcall;
begin
 Result := i * 2;
end;
exports
 X;
begin
end.

//主調方函數:
function X(i: Integer): Integer; stdcall; external 'Demo.dll';

//同時須要留意, 應用Stdcall症結字時, 被調函數是年夜小寫敏感的, 此處極輕易失足.

stored:

//Stored用於指出一個屬性的值能否能被保存, 若指定了True, 則許可對屬性值停止賦值撤消的操作.
property Value: string read fValue write fValue stored True;

string:

//String是一個數據類型, 它代表了字符串.
var
 Str: string;

then:

//Then症結字用於If語句中, 當If前提成立時, 履行Then後的語句.
var
 a,b: Integer;
begin
 if a > b then
  WriteLn('a')
 else
  WriteLn('b');
end;

threadvar:

//Threadvar標識了一個隨線程啟動而創立的變量, 
//假如用Threadvar聲明變量, 則在法式停止前必需手動釋放其占用的空間.
threadvar S: AnsiString;
S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
S := '';
//S := ''; 即釋放變量S所占用的內存.

to:

//To症結字用於For語句, 指明輪回變量是遞增的.
for i := 10 to 100 do
 ListBox1.Items.Add(IntToStr(i));
//在For語句中, 輪回變量遞增用To症結字, 遞加用DownTo症結字.

try:

//try語句用於異常處置, 關於有能夠產生異常的語句, 可以放在try構造下, 以便對其停止異常掩護.
try
 i := StrToInt(s);
except
 ShowMessage('Error');
end;

type:

//Type症結字用於聲明各類對象, 用Type症結字聲明的對象, 在傳遞時按援用傳遞.
type
 TDemo = class
 end;
//type也用來聲明列舉類型或是按援用傳遞的變量.
type
 TCol = (cA,cB,cC);
 TInt = Integer;

unit:

//Unit標識了單位的開首, 單位的根本構造為 Unit...Interface...implementation...end.
Unit Unit1;
Interface
 uses Classes;
implementation
end.
//一個完全的單位必需具有Unit作為開首.

until:

//Until症結字用於斷定repeat輪回構造的輪回前提, 
//假如輪回前提為真, 則加入輪回.Until必需與repeat症結字結合應用.
i := 0;
repeat
 sum := sum + i;
 Inc(i);
until(i >= 100);

uses:

//Uses用於援用一個內部的單位, 而且可以或許應用該單位中的公共部門.
//Uses語句平日放在一個單位的接口或是完成部門.
Interface
 uses Classes;
Implemention
 uses frmAbout;

var:

//var症結字用於聲明一個變量或是對象, 用var聲明的變量接值傳遞.
var
 i: Integer;
 s: string;
//var也能夠用於標識按援用傳遞的辦法參數
function X(var i: Integer): Integer;

//上述函數中的參數i即按援用傳遞, 它的值可以在函數履行時被轉變, 並前往主調函數.

varargs:

//varArgs標識了援用參數, 它必需和Cdecl症結字聯用, 注解許可挪用的函數應用援用傳遞.
function printf(Format: PChar): Integer; cdecl; varargs;
//上述代碼從C++的類庫中援用了Printf函數, 並許可按援用的方法傳入參數.

virtual:

//Virtual用於聲明一個虛辦法, 
//虛辦法可以被籠罩, 而且可使法式運轉速度盡量的快(差別於Dynamic).
procedure X(i: Integer); virtual;

while:

//While症結字用於引出While輪回語句, 輪回前先輩行輪回前提的斷定, 假如前提為真則履行輪回.
i := 0;
while i < 100 do
begin
 sum := sum + i;
 Inc(i);
end;

with:

//With症結字用於將雷同的對象聚集起來處置, 它可以省去輸出年夜量反復的代碼, 使代碼看上去比擬精簡.
with Form1.Memo1.Lines do
begin
 Clear;
 Append('abc');
 Append('def');
 SaveToFile('C:\demo.txt');
end;
//下面這段代碼假如不應用With語句, 則顯得異常冗余復制內容到剪貼板代碼:
Form1.Memo1.Lines.Clear;
Form1.Memo1.Lines.Append('abc');
Form1.Memo1.Lines.Append('def');
Form1.Memo1.Lines.SaveToFile('C:\demo.txt');

write:

//Write用於標識屬性中寫入所應用的成員或辦法.
private
 fValue: Integer;
published
 property Value: Integer writefValue;
//上例中即注解Value屬性的值寫入到fValue成員上.

writeonly:

//writeonly症結字用於標識一個對象能否只寫.
property writeonly;
//當writeonly設為True時, 不許可用戶讀取屬性, 只能經由過程其他對象來操作.

xor:

//Xor用於取異或, 當兩個操作數相等時, 前往False, 不等時前往True.
var
 a,b: Integer;
begin
 a := 2; b := 3;
 if a xor b then
  WriteLn('a xor b')
 else
  WriteLn('a not xor b');
end;
//Xor也用於盤算異或值
WriteLn(IntToStr(3 xor 5)); {6}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved