如何在Delphi中创建OleVariant兼容类?
问题描述:
Delphi 2006. XML数据绑定。 生成这个类:如何在Delphi中创建OleVariant兼容类?
type
IXMLItem = interface(IXMLNode)
['{10B9A877-A975-4FC7-B9EF-448197FA1B90}']
{ Property Accessors }
function Get_PartNum: TPartNum_Sku;
procedure Set_PartNum(Value: TPartNum_Sku);
{ Methods & Properties }
property PartNum: TPartNum_Sku read Get_PartNum write Set_PartNum;
end;
{ TXMLItem }
TXMLItem = class(TXMLNode, IXMLItem)
protected
{ IXMLItem }
function Get_PartNum: TPartNum_Sku;
procedure Set_PartNum(Value: TPartNum_Sku);
end;
...
function TXMLItem.Get_PartNum: TPartNum_Sku;
begin
Result := AttributeNodes['partNum'].NodeValue;
end;
procedure TXMLItem.Set_PartNum(Value: TPartNum_Sku);
begin
SetAttribute('partNum', Value);
end;
如何创建兼容OleVariant类TPartNum_Sku? 那么将代码:
Result := AttributeNodes['partNum'].NodeValue;
翻译没有错误
[Pascal Error] ipo1.pas(394): E2010 Incompatible types: 'TPartNum_Sku' and 'OleVariant'
答
你读取XML属性的值,并且你试图把它分配给TPartNum_Sku
类型的东西。属性值的编译时类型为OleVariant
,但由于XML属性始终是字符串,因此存储在该OleVariant
中的值的运行时类型将始终为WideString
。它永远不会保留TPartNum_Sku
类型的值,因此您将该类定义为与OleVariant
兼容的目标是错误的,因为它们不需要兼容。 (只是因为这是编译器说的问题并不意味着你需要修复它,编译器有时会说“预期的分号”,但它很少意味着你应该在那里添加分号。)
您的Get_PartNum
函数的全部点是这样,您可以将字符串属性值转换为TPartNum_Sku
对象。如果TPartNum_Sku
是一个类,你可以调用它的构造函数:
Result := TPartNum_Sku.Create(AttributeNodes['partNum'].NodeValue);
要小心,虽然,当你这样做时,呼叫者的Get_PartNum
负责释放该对象。
如果您的类型是一个枚举,那么您的转换取决于属性值是什么。如果这是枚举的数值,那么你可以使用这样的:如果它是字符串名称
Result := TPartNum_Sku(StrToInt(AttributeNodes['partNum'].NodeValue));
,那么你可以试试这个:
Result := TPartNum_Sku(GetEnumValue(TypeInfo(TPartNum_Sku),
AttributeNodes['partNum'].NodeValue);
GetEnumValue
是在TypInfo单元。您也可以尝试IdentToInt
,从类单位。
您必须为Set_PartNum
函数编写反编码。
TPartNum_Sku是如何定义的? – 2010-02-05 15:20:53
TPartNum_Sku是一个接口还是一个枚举(integer + consts)或一个类? – 2010-02-05 15:37:46
假设这个类。 我只是还有一个问题:如何创建一个与OleVariant兼容的类型? 如果这个类是他必须从谁那里继承或实现任何接口? – Mielofon 2010-02-08 11:41:22