如何将记录存储到临时变量中并通过函数传递?
如果我有两条记录:
TMyRec1 = packed record
SomeValue : Integer;
end;
TMyRec2 = packed record
ThisIsMessage : String;
end;
现在我希望能够做这样的事情:
function GetRec(recId: Integer) : Variant;
begin
case (recId) of
1 : Result := TMyRec1.Create();
2 : Result := TMyRec2.Create();
//... many
else
end;
end;
也可以将其返回到原始类型,如:
function GetRec1(rec: Variant) : TMyRec1;
begin
Result := TMyRec1(rec);
// here I do lots of default things with this record type
end;
function GetRec2(rec: Variant) : TMyRec2;
begin
Result := TMyRec2(rec);
// here I do lots of default things with this record type
end;
最后,一个完整的函数应该能够完成以下操作:
procedure MainFunction();
var myRec : Variant; //I want to avoid to specify each T here
begin
myRec := GetRec(1);
PrintRec1(GetRec1(myRec));
myRec := GetRec(2);
PrintRec2(GetRec2(myRec));
end;
procedure PrintRec1(rec: TMyRec1);
begin
Print(IntToStr(rec.SomeValue));
end;
procedure PrintRec2(rec: TMyRec2);
begin
Print(rec.ThisIsMessage);
end;
我试过使用变体、TObject、NativeUInt铸造,但似乎都不起作用。
谢谢你的帮助。
- 编辑**
TMyRec = record
end;
TMyRec1 = TMyRec
SomeValue : Integer;
end;
TMyRec2 = TMyRec
ThisIsMessage : String;
end;
会做出这样的事吗?
我不需要安全检查和上升的异常,我会照顾,以确保我通过正确的一个需要。
1条答案
按热度按时间hwamh0ep1#
默认情况下,
record
不像class
那样具有Create()
构造函数,因此TMyRec1.Create()
和TMyRec2.Create()
不会像下面所示那样工作。但是,在 Delphi 2006及更高版本中,您可以手动添加一个静态
Create()
方法,该方法返回一个新的record
示例(一些Delphi自己的原生RTL记录会这样做,如TFormatSettings
、TRttiContext
等),例如:否则,对于早期版本,您将不得不使用独立函数,例如:
但是,不管怎样,要知道默认情况下,你不能在
Variant
中存储任意的record
类型,它不知道如何存储和检索它们。你必须教它如何做。你可以从TCustomVariantType
派生一个类,并覆盖它的各种操作方法,如强制转换、比较等。然后用RTL注册该类,这样Variant
基础结构就知道它了。有关详细信息,请参阅 Delphi 文档中的Defining Custom Variants。只有这样,您的GetRec()
、GetRec1()
和GetRec2()
函数能够完全按照您编写的代码工作。否则,请考虑另一种方法,例如定义自定义标记记录,类似于
Variant
的内部工作方式,例如: