【问题标题】:How to finalize record passed through the untyped parameter of a function?如何完成通过函数的无类型参数传递的记录?
【发布时间】:2012-09-03 10:34:21
【问题描述】:

我可以将“任何”记录类型传递给我的程序吗?

我多次使用带有字符串的“记录”。

type 
  TR = record
    a: string;
    b: string;
  end;

要清除它们,我需要写:

Finalize(R);
FillChar(R, SizeOf(R), #0);

问题是我如何通过任何类型的记录来清除它?

为此,我得到了这个提示:“表达式不需要初始化/完成”。

procedure ClearRecord(var R);
begin
  Finalize(R);
  FillChar(R, SizeOf(R), #0);
end;

感谢您提供的所有信息!

【问题讨论】:

  • 我最初没有发现 untyped 参数。你不能用无类型参数做任何通用的事情。 @LURD 的回答对我来说看起来不错。
  • 你的过程ClearRecord 得到一个指向一些数据的原始指针,但绝对没有关于它包含什么的信息。应该可以将TypeInfo(R) 作为第二个参数传递并从中读取记录布局,但我完全同意 LU RD 的回答,即这太复杂了,不值得付出努力。
  • @hvd 你可以使用InitializeArray(@R, TypeInfo(TR), 1) 来实现这一点,但是是的,普通的旧任务是最好的。
  • 我想知道为什么它是必需的。如果我看到代码通常是由运行时自动完成的,我总是有点怀疑。所以我想知道用户有什么“聪明”的伎俩。如果他真的知道自己在做什么,他就不用问了。
  • @DavidHeffernan Delphi 7 没有,所以我猜 Delphi 6 也没有。 (但我不知道,所以谢谢,学习新东西总是很高兴。)

标签: delphi record delphi-6 finalize


【解决方案1】:

不要让它过于复杂。如果不想写两行来清除记录,可以考虑声明:

Const TR_Empty: TR = ();

并使用它:

R := TR_Empty;

正如其他人所评论的那样,这样做的通用程序是不值得的。

如果您有 Delphi-2009 或更新版本,此代码对清除记录有效:

R := Default(TR);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2019-11-11
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多