如何在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' 
+1

TPartNum_Sku是如何定义的? – 2010-02-05 15:20:53

+0

TPartNum_Sku是一个接口还是一个枚举(integer + consts)或一个类? – 2010-02-05 15:37:46

+0

假设这个类。 我只是还有一个问题:如何创建一个与OleVariant兼容的类型? 如果这个类是他必须从谁那里继承或实现任何接口? – Mielofon 2010-02-08 11:41:22

你读取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函数编写反编码。

+0

谢谢你的回复。下一个借口我的坏英语:-) 你提出的是可以理解的。 但我有一个有点不同的问题:它有一个XSD文件是使用XML数据绑定pas文件与类和接口描述该计划生成,并希望采取此pas文件,更改最小值,同时具有正常工作类。 – Mielofon 2010-02-08 11:35:43

+0

虽然我们有简单的类型,如整数,字符串等,一切正常。但是一旦你想要一些奇怪的东西,你必须输入他们的类型(允许自己的XML数据绑定)并编辑生成的代码。 当计划改变时,结果非常不愉快。 – Mielofon 2010-02-08 11:36:25