Delphi 系統[18]關鍵字和保留字 record、packed -定義結構型別
阿新 • • 發佈:2021-08-12
Delphi 系統[18]關鍵字和保留字 record、packed -定義結構型別
1、定義:
- record:定義結構型別。一個結構體可以視為一個不需要例項化的類(某些地方和物件用法不同)。
- packed:用於對結構型別物件或陣列型別物件進行打包,打包後的物件體積能顯著減小。打包後元素對齊位置也會發生變化,不再對齊到與CPU處理能力相匹配的位置,因此打包後的物件,處理速度會降低。詳細資訊請查閱相關資料。
2、示例:
{ 定義 record 型別 } type TMyRec = record Name: string; Age: Cardinal; Sex: Boolean; end; { 定義 record 型別,用法類似於 class } type TMyRec = record private FName: string; public procedure ShowResult; property Name: string read FName write FName; end; { 實現 record 方法 } procedure TMyRec.ShowResult; begin ShowMessage('呼叫成功!'); end; { 呼叫 record 方法 } procedure TForm1.Button1Click(Sender: TObject); var MyRec: TMyRec; begin MyRec.Name := 'Record 測試'; ShowMessage(MyRec.Name); MyRec.ShowResult; end; --------------------------------------------------------------------------------------- {packed 打包 } {結構化型別的例項包含多個值。結構化型別包括集合、陣列、記錄和檔案以及類、類引用和介面型別。除了只包含序數值的集合外,結構化型別可以包含其他結構化型別;型別可以有無限的結構層次。 預設情況下,結構化型別中的值在單詞或雙單詞邊界上對齊,以便更快地訪問。當您宣告結構化型別時,可以將保留字打包以實現壓縮資料儲存。} type { 未打包 } TMyRecA = record Name: string; Age: Byte; Sex: Boolean; end; { 打包 } TMyRecB = packed record Name: string; Age: Byte; Sex: Boolean; end; { 未打包 } TMyArrayA = array [0 .. 32] of Byte; { 打包 } TMyArrayB = packed array [0 .. 32] of Byte; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(SizeOf(TMyRecA))); ShowMessage(IntToStr(SizeOf(TMyRecB))); ShowMessage(IntToStr(SizeOf(TMyArrayA))); ShowMessage(IntToStr(SizeOf(TMyArrayB))); end; //使用壓縮會減慢資料訪問速度,對於字元陣列,會影響型別相容性(有關更多資訊,請參閱記憶體管理)
3、有關 record 的一些說明:
record(類似於某些語言中的結構)表示一組異構元素。每個元素稱為一個欄位;記錄型別的宣告為每個欄位指定名稱和型別。
記錄型別宣告的語法為:
type
recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
end
其中recordTypeName是有效識別符號,每個型別表示一個型別,每個fieldList是有效識別符號或逗號分隔的識別符號列表。最後的分號是可選的。
例如,下面的宣告建立了一個名為TDateRec的記錄型別:
type
TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun,
Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;
- 每個TDateRec包含三個欄位:一個名為Year的整數值、一個名為Month的列舉型別的值和另一個名為Day的介於1和31之間的整數。
- 識別符號Year、Month和Day是TDateRec的欄位識別符號,它們的行為類似於變數。
但是,TDateRec型別宣告不為年、月和日欄位分配任何記憶體;例項化記錄時會分配記憶體,如下所示:
var Record1, Record2: TDateRec;
此變數宣告建立TDateRec的兩個例項,稱為Record1和Record2。
通過使用記錄的名稱限定欄位指示符,可以訪問記錄的欄位:
Record1.Year := 1904;
Record1.Month := Jun;
Record1.Day := 16;
或使用with語句:
with Record1 do
begin
Year := 1904;
Month := Jun;
Day := 16;
end;
現在,您可以將Record1欄位的值複製到Record2:
Record2 := Record1;
因為欄位指示符的作用域僅限於它出現的記錄,所以您不必擔心欄位指示符和其他變數之間的命名衝突。
您可以使用記錄而不是定義記錄型別。。。直接在變數宣告中構造:
var
S: record
Name: string;
Age: Integer;
end;
然而,這樣的宣告在很大程度上違背了記錄的目的,即避免重複編碼相似的變數組。此外,此類單獨宣告的記錄將不具有分配相容性,即使它們的結構相同。
建立時間:2021.08.12 更新時間:
部落格園 滔Roy https://www.cnblogs.com/guorongtao 希望內容對你所有幫助,謝謝!