德尔福的“降序”记录?

前端之家收集整理的这篇文章主要介绍了德尔福的“降序”记录?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道你实际上不能从记录中删除任何内容,但我不确定如何用一句话来概括我的问题.如果你这样做,请编辑标题.

我想要做的是创建一个泛型类型的数组,它可以是X个类型之一,数组将填充那些自定义类型(它们具有不同的字段,这是重要的).简单的方法是只创建一个变量记录数组,每个变体都有自己的类型,但显然不能重新声明标识符,如下所示:

GenericRec = Record
  case SubTypeName: TSubTypeName of
    type1name: (SubRec: Type1);
    type2name: (SubRec: Type2);
    ...
    typeNname: (SubRec: TypeN);
  end;

将SubRec更改为SubRec1,SubRec2 … SubRecN使引用变得痛苦,但并非不可能.
因为我开始寻找上述问题的替代解决方案,所以我想到了课程.

显示我想要实现的东西的明显示例是TObject,这些数组可以分配给许多不同的东西.这就是我想要的,但有记录(这是不可能做到的),因为我希望能够将记录保存到文件中并将其读回(因为它是我已经熟悉的东西).制作我自己的简单类不是问题,使得后代类代表我的子类型 – 我可以做到这一点.但是如何写入文件并将其读回来呢?这归结为序列化,我不知道该怎么做.从我收集的内容来看,它并不容易,而且必须从TComponent继承这个类.

TMyClass = Class

如果我像上面那样上课,会有什么不同吗?它没什么特别的,最多有10个字段,包括一些自定义类型.

将序列化放在一边(仅仅因为我有很多关于该主题的阅读),在这里使用类也可能是不可能的.

在这一点上,我的选择是什么?我应该放弃记录并尝试使用课程吗?或者只是坚持记录并处理变体“限制”会不那么复杂?我只是在学习,如果课程方法的爆炸可能让我更聪明,我会做的.我也只是考虑过TList(从未使用它),但似乎它与记录混合得不是很好,也许它可以完成,但这可能不在我的联盟中.我愿意接受任何建议.我该怎么办?

解决方法

处理此类数据的“自然”方式是使用类,而不是记录.在定义时和处理实现时,它将更容易使用:特别是,虚拟方法非常强大,可以为特定类的类定制流程.然后在较新版本的Delphi中使用TList / TObjectList或TCollection或基于泛型的数组来存储列表.

关于序列化,有几种方法可以做到这一点.见Delphi: Store data in somekind of structure

在您的特定情况下,困难来自您正在使用的“变体”类型的记录.恕我直言,主要缺点是编译器将拒绝在“变体”部分内设置任何引用计数类型的变量(例如字符串).因此,您将只能在此“变体”部分中编写“普通”变量(如整数).恕我直言,这是一个很大的限制,这降低了这个解决方

另一种可能性是在其定义的开头存储记录类型,例如,使用RecType:整数甚至更好的RecType:TEnumerationType,它比数字更明确.但是你必须手工编写很多代码,并使用指针,如果你不是非常流利的指针编码,这有点容易出错.

因此,您还可以存储记录的类型信息,可通过TypeInfo(aRecordVariable)访问.然后你可以使用FillChar将记录内容初始化为零,在分配之后,然后使用以下函数来完成记录内容,就在释放之后(这就是Dispose()在内部执行的操作,你应该调用它,否则你’ ll泄漏记忆):

procedure RecordClear(var Dest; TypeInfo: pointer);
asm
  jmp System.@FinalizeRecord
end;

但是这样的实施模式只会重新发明轮子!实际上是如何实现类的:任何TObject实例的第一个元素是指向其ClassType的指针:

function TObject.ClassType: TClass;
begin
  Pointer(Result) := PPointer(Self)^;
end;

Delphi中还有另一种结构,称为对象.它是某种记录,但它支持继承 – 见this article.这是Turbo Pascal 5.5天的旧式OOP编程,已被弃用,但仍然可用.请注意,我发现了一个weird compilation issue on newer versions of Delphi:有时,堆栈上分配的对象并不总是被初始化.

看看我们的TDynArray包装器及其相关函数,它们能够将任何记录内容序列化为二进制或JSON.见Delphi (win32) serialization libraries问题.它将与变体记录一起使用,即使它们在不变量部分中包含字符串,而普通的“Write / BlockWrite”也不适用于引用计数字段.

猜你在找的Delphi相关文章