Delphi 4增订的Object Pascal

爱你2012周莉

爱你2012周莉

2016-01-29 14:09

Delphi 4增订的Object Pascal,Delphi 4增订的Object Pascal
 

本附錄在於說明Delphi 4新增訂的Object Pascal程式語言。總結來說,Delphi 4的Object Pascal增訂了以下幾大部分:

新增加數種內定資料型態。

Dynamic Arrays
Method and Routine Overloading
Default Parameters.
Implementating interfaces by delegation,

可用以下的寫法:
property MyInterface: IMyInterface read FMyInterface
implements IMyInterface;

新增的內定資料型態
整數方面:

新增加Int64這種長度六十四位元,範圍從-2^63 to 2^63 - 1。
32-bit unsigned integer新增加Longword型態,範圍從0..4294967295。
Cardinal的範圍調整成與上述Longword型態相同。

浮點數方面:
Real型態基於效率考量,由過去佔用48-bit調整成64-bits,
新增加Real48型態,精確度與過去的Real相同,仍是48-bit。

Dynamic Array
Delphi 4問世之前,Delphi程式設計師若需要動態長度的陣列,在不得已的情況下,往往採用以下這種「表面上陣列的語法,但實際自己配置管理記憶體」的方式來處理動態陣列:
#0001 procedure TForm1.Button1Click(Sender: TObject);
#0002 type
#0003 TIntegerArray = array[0..0] of integer;
#0004 PIntegerArray = ^TIntegerArray;
#0005 var
#0006 pArrayOfInteger: PIntegerArray;
#0007 j: integer;
#0008 begin
#0009 GetMem(pArrayOfInteger, 10 * SizeOf(Integer));
#0010 for j := 0 to 9 do
#0011 pArrayOfInteger^[j] := j;
#0012 FreeMem(pArrayOfInteger, 10 * SizeOf(Integer));
#0013 end;

如果應用Delphi 4新增加的Dynamic Array,則可改用以下的方式:

var MyFlexibleArray: array of Real;

定義之後,以 SetLength 函數改變陣列實際配置的記憶體大小,例如:

SetLength(MyFlexibleArray, 20); // 0..19

    方便很多,是嗎?若想知道Dynamic Array實際長度,請分別以HighLow函數判斷,傳回「-1」時,表示是一個該陣列的長度為零,例如:

#0001 procedure TForm1.Button2Click(Sender: TObject);
#0002 var
#0003 A: array of Integer;
#0004 begin
#0005 ShowMessage(IntToStr(High(A))); // -1
#0006 SetLength(A, 3);
#0007 ShowMessage(IntToStr(High(A))); // 3
#0008 A := nil;
#0009 ShowMessage(IntToStr(High(A))); // -1
#0010 end;

    上述的0008這列,指定nil值將會釋放陣列所配置到的記憶。
    值得注意的是,Compiler對於Dynamic Array並不會自動進行所謂的「Copy-on-Write」。請看以下的程式例:

#0001 procedure TForm1.Button1Click(Sender: TObject);
#0002 var
#0003 A, B: array of Integer;
#0004 begin
#0005 SetLength(A, 1);
#0006 A[0] := 1;
#0007 B := A;
#0008 B[0] := 2;
#0009 ShowMessage(IntToStr(A[0])); // == 2
#0010 end;

    0008這列改的雖是B[0],但Compiler顯然還沒有聰明到在可能修改陣列內容時,將陣列內容複製一份出來(Copy on (possible) Write),於是,0009這列程式顯示的結果仍是2。
於是,若要進行兩陣列各索引項目一對一的內容複製,只好自行寫迴圈一一複製,或者,採用較為簡便的寫法 ── 呼叫Copy函數:

#0001 procedure TForm1.Button4Click(Sender: TObject);
#0002 var
#0003 A, B: array of Integer;
#0004 begin
#0005 SetLength(A, 1);
#0006 A[0] := 1;
#0007 B := Copy(A, 0, 1);
#0008 B[0] := 2;
#0009 ShowMessage(IntToStr(A[0])); // == 1
#0010 ShowMessage(IntToStr(B[0])); // == 2
#0011 end;

    最後,請不要將Dynamic Array與第二章提到的Open Array(開放陣列)搞混了。函式參數的開放陣列,語法雖與Dynamic Array差不多,但開放陣列指的是:不限定傳入函式的陣列長度,Dynamic Array則是指:可變長度的陣列,兩者畢竟有所不同。以下是一則我準備的程式範例,不難看出兩者之間的差異:

#0001 type
#0002 TDynamicInteger = array of integer;

#0003
#0004 procedure Clear_OpenArray(var A: array of Integer);
#0005 var
#0006 I: Integer;
#0007 begin
#0008 for I := 0 to High(A) do A[I] := 0;
#0009 // SetLength(A, 20); // 不可以這麼寫
#0010 end;
#0011
#0012 // 注意, 以下兩種寫法又有不同喔
#0013 // I: procedure Clear_DynamicArray(A:TDynamicInteger);
#0014 // II: procedure Clear_DynamicArray(var A:TDynamicInteger);
#0015 procedure Clear_DynamicArray

展开更多 50%)
分享

猜你喜欢

Delphi 4增订的Object Pascal

Delphi
Delphi 4增订的Object Pascal

Pascal精要笔记

编程语言 网络编程
Pascal精要笔记

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Pascal Blanché人物角色作品

工业设计 设计素描
Pascal Blanché人物角色作品

Using the TextRange Object

Web开发
Using the TextRange Object

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi控件 我们也可以(4)

Delphi
Delphi控件 我们也可以(4)

Pascal Fedorec 平面设计

平面设计 海报设计 广告设计 画报设计 签名设计 服装设计 名片设计 画册设计 版式设计 商标设计
Pascal Fedorec 平面设计

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Delphi中RichEdit的奥妙

Delphi中RichEdit的奥妙

播放自定义的声音

播放自定义的声音
下拉加载更多内容 ↓