我正在尝试将UnicodeString
(或Widestring
,尝试过两者)值分配给属性设置器中声明为Variant
的类字段变量。我收到了一个错误:
EVariantBadVarTypeError - 'Invalid variant type'
在interface
uses
条款中,我添加了System.Variants
。
这是我对Variant
字段变量的声明:
TContainerClass = class(TObject)
strict private
...
type
...
TInnerClass = class
strict private
...
FValue: Variant;
function GetAsString: UnicodeString;
...
procedure SetAsString(const Value: UnicodeString);
public
...
property AsString: UnicodeString read GetAsString write SetAsString;
...
end;
...
end;
在implementation
部分,这是我的属性设置器:
procedure TContainerClass.TInnerClass.SetAsString(const AValue: UnicodeString);
begin
FValue := AValue;
end;
以下是使用该属性的示例:
// Items is a TObjectList descendant
// each item in items is an instance of TInnerClass
TInnerClass(Items[Index]).AsString := StringList[Index];
// at runtime value is for ex. 'Dr.' - this assignment raises the above referenced exception
在单步执行代码时,所有对象都会被实例化。作业的双方似乎都是有效的。我走过的唯一一件事就是,当我评估TInnerClass(Items[Index])
时,我看到了这一点:
(Unknown type: 39852, (nil,$3A83700), Variant array of Unknown, $1, $F, '')
我可能缺少一些简单的东西。
答案 0 :(得分:1)
(未知类型:39852,(零,$ 3A83700),变体数组未知,$ 1,$ F,'')
看起来程序中的某些内容已损坏变体对象。一旦您能够识别并避免损坏,您的代码就应该开始工作了。
查找执行原始内存访问的代码,例如对Move
的调用是常见的损坏源。同样使用陈旧的指针或引用。