如何将 TObject 类型转换为 LongInt?

How to typecast TObject to LongInt?

好的,我有一个名为 CaLlist 的 TStringList 变量,并在我的代码中按如下方式使用它。

CalList.strings[i] := "Something";
CalList.Objects[i] := TObject(22.3);

rawval := PtrInt(CalList.Objects[i]); <<------- Error raised here.

我使用的是 FPC 2.6.2 Lazarus 1.0.16。这段代码可以正常编译和运行,但是当我逐步执行代码时,rawval 被设置为某个天文负数,而不是我预期的 22.3。

所以,我做错了什么?这个问题有解决方案吗?

您必须将 .Object[i] 转换为双倍(双倍大小 = 8 字节 = x86_64 上的寄存器大小)或单倍(单倍大小 = 4 字节 = x86 上的寄存器大小)。

示例:

program Project1;

uses classes;

{$IFDEF CPU32}
type PtrFloat = Single;
{$ELSE}
type PtrFloat = Double;
{$ENDIF}

var
  CalList: TStringList;
  rawval: PtrFloat;

begin

  CalList := TStringList.Create;
  CalList.Add('');
  rawval := 22.3;
  CalList.strings[0] := 'Something';
  CalList.Objects[0] := TObject(rawval);
  rawval := PtrFloat(CalList.Objects[0]);

  writeln(rawval);
  readln;
end.