166人参与 • 2024-05-12 • Delphi
众所周知,数组是非常有用的。但在现实生活中,情况是不可预测的,数组的元素数量或大小可能会随着时间的推移而增长。有些语言,如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日
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论