当前位置: 首页 > 图文教程 > 开发语言 > Delphi > Delphi 4增订的Object Pascal

Delphi
在线播放器DIY
关于VisiBroker For Delphi的使用(3)
关于VisiBroker For Delphi的使用(2)
关于VisiBroker For Delphi的使用(1)
Delphi的两个实用技巧(2)巧用Windows的API函数
Delphi的两个实用技巧(1)播放Flash
delphi学习:两种方法使用xml文档
Delphi与Word之间的融合技术
Delphi中动态链接库(DLL)的建立和使用
Delphi基础:Window 消息大全使用详解下
Delphi基础:Window 消息大全使用详解上
教你在DELPHI中如何调用系统对话框
Delphi开发单机瘦小数据库程序要点
用Delphi + DirectX开发简单RPG游戏
Delphi7从入门到精通之认识Delphi编辑器
Delphi7从入门到精通之历数Delphi七个版本
Delphi学习:图像放大漫游攻略
用编程来实现24小时制到12小时制的转换
一个实际的OLE服务器的开发
Delphi一点通:如何将源代码学好

Delphi 4增订的Object Pascal


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 119 ::
收藏到网摘: n/a

 

本附錄在於說明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