mORMot 1.18 第13章 動態陣列

海利鸟發表於2024-05-02

mORMot 1.18 第13章 動態陣列

眾所周知,陣列是非常有用的。但在現實生活中,情況是不可預測的,陣列的元素數量或大小可能會隨著時間的推移而增長。有些語言,如PHP,就使得動態陣列的使用變得很簡單。在使用mORMot的Delphi中,我們使用類和方法來提供這一功能。

首先,讓我們宣告一個典型的 TSQLRecord

TSQLRecordPeople = class(TSQLRecord)
private
  fFirstname: RawUTF8;
published
  property Firstname: RawUTF8 read fFirstname write fFirstname;
end;

現在,我們將使用Integer(整數)、Currency(貨幣)和一個Record(記錄)型別的動態陣列對其進行擴充套件:

TFV = packed record
  Major, Minor, Release, Build: integer;
  Main, Detailed: string;
end;

TFVs = array of TFV;

TSQLRecordPeopleArray = class(TSQLRecordPeople)
private
  fInts: TIntegerDynArray;
  fCurrency: TCurrencyDynArray;
  fFileVersion: TFVs;
published
  property UTF8: RawUTF8 read fUTF8 write fUTF8;
  property Ints: TIntegerDynArray index 1 read fInts write fInts;
  property Currency: TCurrencyDynArray index 2 read fCurrency write fCurrency;
  property FileVersion: TFVs index 3 read fFileVersion write fFileVersion;
end;

以下是一個用於輸出 TSQLRecordPeopleArray內容的函式:

procedure dumpva(VA: TSQLRecordPeopleArray);
var
  i: integer;
begin
  writeln('-----------------------------');
  writeln('Firstname : ', VA.Firstname);
  write('Ints : ');
  for i := Low(VA.Ints) to High(VA.Ints) do
    write(' ', VA.Ints[i]);
  writeln;
  write('Currency : ');
  for i := Low(VA.Currency) to High(VA.Currency) do
    write(' ', VA.Currency[i]);
  writeln;
  writeln('FileVersion.Main : ');
  for i := Low(VA.FileVersion) to High(VA.FileVersion) do
    writeln(' [', i, ']: ', VA.FileVersion[i].Main);
end;

現在,讓我們來看看動態陣列的實際應用:

var
  V1: TSQLRecordPeople;
  VA: TSQLRecordPeopleArray;
  FV: TFV;
  j: integer;
  f: currency;
  s: RawUTF8;
begin
  V1 := TSQLRecordPeople.Create;
  V1.Firstname := StringToUTF8('Erick');
  VA := TSQLRecordPeopleArray.Create;
  VA.FillFrom(V1);
  dumpva(VA);
  // 輸出結果
  // -----------------------------
  // Firstname : Erick
  // Ints :
  // Currency :
  // FileVersion.Main :
  // 也就是說,還沒有設定擴充套件資料集

  j := 1;
  VA.DynArray('Ints').Add(j);
  j := 5;
  VA.DynArray('Ints').Add(j);
  f := 3.14;
  VA.DynArray('Currency').Add(f);
  FV.Main := 'Yours';
  VA.DynArray('FileVersion').Add(FV);
  FV.Main := 'Vos';
  VA.DynArray('FileVersion').Add(FV);
  dumpva(VA);
  // 輸出結果
  // -----------------------------
  // Firstname : Erick
  // Ints : 1 5
  // Currency : 3.14000000000000E+0000
  // FileVersion.Main :
  // [0]: Yours
  // [1]: Vos
end;

我們可以建立任何標量或記錄型別的動態陣列,包括RawUTF。

請注意,您必須首先將值分配給變數,因為mORMot使用變數的執行時型別資訊(RTT)來了解資料的大小。因此,您不能使用以下方式:

VA.DynArray('Currency').Add(3.142);

mORMot將這些值以BLOB型別儲存在資料庫中。除了記憶體限制外,您可以儲存的大小沒有實際限制。

注意:本文由hieroly翻譯於2024年04月26日

相關文章