如何将 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.
好的,我有一个名为 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.