1. 程式人生 > >Delphi 的Record結構體

Delphi 的Record結構體

   一直以來對帶case的Record只會用而不求甚解。知道他類似於c語言的union。今天詳細看了help。瞭解一下。汗~啊。先對自己內心進行下自我批評~~~~

下面是偶的新體會。

1. 首先了解到record是可以限制field的範圍的,而且定義列舉型別的。

type TDateRec = record 

Year: Integer; 

Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); 

Day: 1..31; 

end;

2. 可以在不定義結構體的情況下,直接在變數宣告時使用。

var S: record 

Name: string; 

Age: Integer; 

end;

3. 下面是變體部分,這是Delphi中變體在結構中的標準定義

type recordTypeName = record 

fieldList1: type1; 

... 

fieldListn: typen; 

case tag: ordinalType of 

constantList1: (variant1); 

... 

constantListn: (variantn); 

end;

Ø Tag可以省略

Ø constantList的型別和ordinalType的型別一致

Ø fieldList的型別不能是long strings, dynamic arrays, variants,也不能是包含這些的結 構體,但可以是指向這些型別的指標

Ø TagconstantLists 在編譯器處理這些欄位時沒有用,只是為程式設計師理解時提供方便 (原文:The optional tag and the constantLists play no role in the way the compiler manages the fields; they are there only for the convenience of the programmer.) 

Ø 使用變體結構體的兩個原因:一個是需要不同的資料,但是又不會同時需要所有的欄位。

type TEmployee = record 

FirstName, LastName: string[40]; 

BirthDate: TDate; 

case Salaried: Boolean of 

True: (AnnualSalary: Currency); 

False: (HourlyWage: Currency); 

end;

Ø 另一個原因是可以把同樣的資料就像是不同的型別的資料。比如,你有一個64位的實數做為第一個欄位,你就可以把它的高32位作為整數返回。這是Delphi幫助裡說的。不太好看出來,而且Real到Interger的轉換我也很少用。弄個Word到Byte的結構到時很常用。

Type 

RConversion = record

Case Boolean of

True  : (aWord: Word;);

False  : (abyte bbyte : Byte;);

end;

這裡附加一句觀點,我和周圍的同事認為這樣的結構體會造成程式碼的易讀性降低,一般在自己的程式碼中不建議使用,當然為相容Windows的一些結構除外,他本來就是union當然用這樣的直接套用就可以了。

結構體的基本應用就是這樣的。還有一些特殊的應用,比如“class-like”的結構體,和file of record。

Class-like的結構體我不知道什麼時候使用,既然需要Create,用類不就得了。下面有篇文章對原理有一些闡述http://blog.csdn.net/maozefa/archive/2007/08/27/1760612.aspx。

File of record,個人比較喜歡,特別是在記錄某種資料的時候,經常是把一個結構體整個寫入到檔案裡,既實現了一定程度的加密,又簡單方便,讀出來也可以直接放進結構體裡。這裡就不詳細描述了。