5

它适用于 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;

谁能帮我?非常感谢你

4

3 回答 3

3

你可以尝试这样的事情:

function MakeVerbInfoObject(const AVerbInfo: TVerbInfo): TObject;
begin
  Result := nil;
  Move(AVerbInfo, Result, SizeOf(AVerbInfo));
end;

strList.addObject('verb1', MakeVerbInfoObject(VerbInfo));
于 2013-12-19T11:46:32.037 回答
3

你的演员TObject(VerbInfo)将编译提供SizeOf(TObject) = SizeOf(TVerbInfo)。但是TObject是一个指针,因此它的大小随架构而变化。另一方面,SizeOf(TVerbInfo)不随架构而变化。因此,演员只能在一种架构上工作。

使用像这样的强制转换是你必须在前泛型 Delphi 中做事的方式。但是现在,您应该使用通用容器。

例如,如果您有一个列表并且字符串是唯一的,那么您可以使用字典:

TDictionary<string, TVerbInfo>

如果有可能存在重复的字符串,那么您将需要一个新的记录声明:

type
  TVerbInfo = record
    Name: string
    Verb: Integer;
    Flags: Word;
  end;

然后将这些列表存储在

TList<TVerbInfo>

最后一点是您应该避免使用打包记录。这些会导致数据结构不对齐,进而导致性能不佳。

于 2013-12-19T11:49:02.227 回答
1

我认为你必须在不同的平台上运行它并比较结果

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>type 而不是TStringList

于 2013-12-19T11:34:34.160 回答