首页 > 其他分享 >mORMot 1.18 第13章 动态数组

mORMot 1.18 第13章 动态数组

时间:2024-05-02 23:45:05浏览次数:17  
标签:VA 13 FileVersion 1.18 mORMot Currency write Ints Main

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类型存储在数据库中。除了内存限制外,您可以存储的大小没有实际限制。

标签:VA,13,FileVersion,1.18,mORMot,Currency,write,Ints,Main
From: https://www.cnblogs.com/hieroly/p/18163545

相关文章

  • mORMot 1.18 第12章 Blobs(大二进制对象)
    mORMot1.18第12章Blobs(大二进制对象)有些情况下,mORMot会以BLOBs(大二进制对象)的形式保存和检索数据。TSQLRawBlob属性用于存储像图片和文件这样的二进制数据。以TDynArray.SaveTo二进制格式存储的动态数组。明确注册为BLOBs的记录。当从数据库中存储/检索时,BLOBs以Base64......
  • UVA1362 Exploring Pyramids 题解
    题目传送门前置知识欧拉序|区间DP|乘法原理解法DFS序可近似理解为欧拉序,故考虑区间DP。设\(f_{l,r}\)表示\([l,r]\)对应的二叉树的个数,状态转移方程为\(f_{l,r}=\begin{cases}1&l=r\\[s_{l}=s_{r}]\times\sum\limits_{i=l+2}^{r}[s_{l}=s_{i}]\timesf_{......
  • 1385E. Directing Edges(拓扑序的应用)
    背景:本题为构造DAG题,给出了有向与无向边,CF2000分题目思路:先处理有向图,判断是否有环,有就NO,否则一定有解.我们思考一下有环的条件(或者说环在什么情况下产生):即后面的数指向前面的数才可能构成环,即拓扑序大的指回去了!故得构造思路:即让无向边的拓扑序小的指......
  • [题解]CF13C Sequence
    CF13CSequence给定\(N\)个数,每次操作可以选其中一个数\(+1\)或\(-1\)。请问要让这个数列不降,最少需要多少次操作?我们用DP解决。对\(a\)从小到大排序,存在\(c\)中。我们用\(f[i][j]\)表示让前\(i\)个元素满足条件,而且这些元素最大值不超过\(c[j]\)的最小操作次数。状态转移方......
  • P1969 [NOIP2013 提高组] 积木大赛
    P1969[NOIP2013提高组]积木大赛题目春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为\(n\)的大厦,大厦可以看成由\(n\)块宽度为\(1\)的积木组成,第\(i\)块积木的最终高度需要是\(h_i\)。在搭建开始之前,没有任何积木(可以看成\(n\)块高度为......
  • mORMot 1.18 第10章 连接表
    mORMot1.18第10章连接表如果数据库包含连接表,那么数据库将变得更加有用。假设读者已经知道何时以及为何需要单独的表,以及为何要将它们连接起来——许多关于数据库设计的书籍都详细介绍了这一点。我们不会在这里重复这些信息,甚至不会重复其中的任何子集。我们要介绍的是如何做......
  • 代码13
    """简单输入对话框"""fromtkinter.simpledialogimportaskintegerfromtkinterimportTk,Label,Button#创建主窗口root=Tk()root.geometry("400x100")#设置窗口大小deffunc():#弹出输入对话框,要求输入年龄#初始值为18,最小值为1,最大值为150......
  • 启发式评估(Heuristic Evaluation)--转载 [2011.12.13 sina blog]
    启发式评估(HeuristicEvaluation) -[一架好书--读书学习的收获]2008年08月07日分类: 一架好书--读书学习的收获  版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://buyantang.blogbus.com/logs/27286224.htmlUsabilityInspectionMethods,Edit......
  • mORMot 1.18 第08章 Delphi中的服务器端JavaScript
    mORMot1.18第8章Delphi中的服务器端JavaScript在mORMot框架中,对JavaScript脚本的支持被称为MonkeyOnRails(版权归PavelMashlyakovsky所有,邮箱:[email protected]),它借助了Mozilla基金会的SpiderMonkey类。mORMot允许程序员编写功能强大的应用程序,但如果客户希望自定义应用......
  • AP2813双路降压恒流LED芯片_外围简单内置功率管驱动IC
    产品叙述AP2813是深圳市世微半导体有限公司推出的一款双路降压恒流驱动器,高效率、外 围简单、内置功率管,适用于5-80V输入的高精度降压LED恒流驱动芯片。内置功率管输出大功率可达12W,最大电流1.2A。AP2813一路直亮,另外一路通过MODE1切换全亮,爆闪。AP2813工作频率固定在......