1. 程式人生 > 其它 >Delphi 系統[18]關鍵字和保留字 record、packed -定義結構型別

Delphi 系統[18]關鍵字和保留字 record、packed -定義結構型別

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 希望內容對你所有幫助,謝謝!