2010-02-05 2 views
0

Delphi 2006. Liaison de données XML. Générer cette classe:Comment créer une classe compatible OleVariant dans Delphi?


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; 

Comment créer OleVariant classe compatible TPartNum_Sku? Alors qu'est-ce que le code:

Result := AttributeNodes['partNum'].NodeValue; 

traduit sans erreur

[Pascal Error] ipo1.pas(394): E2010 Incompatible types: 'TPartNum_Sku' and 'OleVariant' 
+1

Comment TPartNum_Sku est-il défini? –

+0

Est-ce que TPartNum_Sku est une interface ou une énumération (integer + consts) ou une classe? –

+0

Supposons que cette classe. Je viens aussi de poser la question: comment créer un type compatible avec OleVariant? Si cette classe doit hériter ou implémenter des interfaces? – Mielofon

Répondre

1

Vous lisez la valeur d'un attribut XML, et vous essayez de l'attribuer à quelque chose du type TPartNum_Sku. Le type de la valeur d'attribut à la compilation est OleVariant, mais comme les attributs XML sont toujours des chaînes, le type d'exécution de la valeur stockée dans OleVariant sera toujours WideString. Il ne tiendra jamais une valeur de type TPartNum_Sku, donc votre objectif de définir cette classe pour être compatible avec OleVariant est erroné car ils n'ont pas besoin d'être compatibles. (Juste parce que c'est ce que le compilateur dit que le problème ne veut pas dire que vous avez besoin de le corriger.) Le compilateur dit parfois "semicolon attendu", mais cela signifie rarement que vous devriez ajouter un point-virgule.)

Tout le point d'avoir votre Get_PartNum fonction est de sorte que vous pouvez convertir la valeur d'attribut de chaîne dans un objet TPartNum_Sku. Si TPartNum_Sku est une classe, vous pouvez appeler son constructeur:

Result := TPartNum_Sku.Create(AttributeNodes['partNum'].NodeValue); 

Prenez garde, cependant, que lorsque vous faites cela, l'appelantde Get_PartNum est responsable de la libération de cet objet.

Si votre type est une énumération, votre conversion dépend de la valeur de l'attribut. Si c'est la valeur numérique de l'énumération, vous pouvez utiliser ceci:

Result := TPartNum_Sku(StrToInt(AttributeNodes['partNum'].NodeValue)); 

Si c'est le nom de la chaîne, vous pouvez alors essayer ceci:

Result := TPartNum_Sku(GetEnumValue(TypeInfo(TPartNum_Sku), 
            AttributeNodes['partNum'].NodeValue); 

GetEnumValue est dans le TypInfo unité. Vous pouvez également essayer IdentToInt, à partir de l'unité Classes.

Vous devrez également écrire le code inverse pour votre fonction Set_PartNum.

+0

Merci pour votre réponse. Excuse suivante pour mon mauvais anglais :-) Ce que vous avez proposé est compréhensible. Mais j'ai un problème un peu différent: il y a un fichier XSD qui est généré en utilisant le fichier pas de liaison de données XML avec les classes et interfaces décrivant le schéma et qui voudrait prendre ce pas-file, en changeant le minimum cours pour le travail. – Mielofon

+0

Alors que nous avons des types simples comme nombre entier, chaîne, etc. tout fonctionne.Mais une fois que vous voulez quelque chose d'étrange, vous devez entrer leurs types (cela permet la liaison de données XML) et éditer le code généré. Le résultat est très désagréable à travailler lorsque le régime change. – Mielofon

Questions connexes