[英]Invalid typecast: convert record to tobject on 64-bit platform
它適用於32位平台。但這里不是64位的例子
TVerbInfo = packed record
Verb: Smallint;
Flags: Word;
end;
var
VerbInfo: TVerbInfo;
strList : TStringList;
verb : Smallint;
flags : Word;
begin
strList := TStringList.create();
.....
verbInfo.verb := verb;
verbInfo.flags := flags;
strList.addObject('verb1',TObject(VerbInfo)); //invalid typecast happened here
end;
誰能幫我? 非常感謝你
你可以嘗試這樣的事情:
function MakeVerbInfoObject(const AVerbInfo: TVerbInfo): TObject;
begin
Result := nil;
Move(AVerbInfo, Result, SizeOf(AVerbInfo));
end;
strList.addObject('verb1', MakeVerbInfoObject(VerbInfo));
如果SizeOf(TObject) = SizeOf(TVerbInfo)
你的演員TObject(VerbInfo)
將編譯。 但TObject
是一個指針,所以它的大小因架構而異。 另一方面, SizeOf(TVerbInfo)
不隨體系結構而變化。 因此,演員表只能在一個架構上工作。
使用像這樣的演員是如何在預仿制Delphi中做的事情。 但是現在,你應該使用通用容器。
例如,如果您有一個列表並且字符串是唯一的,那么您可以使用字典:
TDictionary<string, TVerbInfo>
如果有可能存在重復的字符串,那么您需要一個新的記錄聲明:
type
TVerbInfo = record
Name: string
Verb: Integer;
Flags: Word;
end;
然后存儲這些列表
TList<TVerbInfo>
最后一點是你應該避免使用打包記錄。 這會導致數據結構錯位,從而導致性能不佳。
我認為你必須在不同的平台上運行它並比較結果
ShowMessage( IntToStr( SizeOf( Integer ) ) );
ShowMessage( IntToStr( SizeOf( Pointer ) ) );
ShowMessage( IntToStr( SizeOf( TVerbInfo ) ) );
ShowMessage( IntToStr( SizeOf( TObject ) ) );
我懷疑你不能做硬打算,因為尺寸不同。
您可以嘗試使用類似的解決方法
type TBoth = record
case byte of
0: ( rec: TVerbInfo);
1: ( obj: TObject);
end;
您也可以嘗試使用TDictionary<String, TVerbInfo>
類型而不是TStringList
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.