2010-02-05 3 views
0

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는 어떻게 정의됩니까? –

+0

TPartNum_Sku는 인터페이스 또는 enum (정수 + consts) 또는 클래스입니까? –

+0

이 클래스를 가정하십시오. 난 그냥 질문 : OleVariant와 호환 될 수있는 형식을 만드는 방법? 이 클래스가 인터페이스를 상속하거나 구현해야하는 사람이면? – Mielofon

답변

1

당신은 XML 속성의 값을 읽고, 당신은 유형 TPartNum_Sku의 무언가에 할당하려는없이 번역. 특성 값의 컴파일 타임 형식은 OleVariant이지만 XML 특성은 항상 문자열이므로 OleVariant에 저장된 값의 런타임 유형은 항상 WideString이됩니다. 이 클래스는 TPartNum_Sku 유형의 값을 보유하지 않으므로 해당 클래스를 OleVariant과 호환되도록 정의하려는 목표는 호환 될 필요가 없기 때문에 잘못되었습니다. 컴파일러가 때때로 "세미콜론이 예상 됨"이라고 말하면서 세미콜론을 추가해야한다는 의미는 거의 없습니다.

함수의 전체 지점은 문자열 속성 값을 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); 

GetEnumValueTypInfo 단위입니다. 클래스 단위의 IdentToInt을 시도해 볼 수도 있습니다.

Set_PartNum 함수에 대한 역 코드도 작성해야합니다.

+0

답장을 보내 주셔서 감사합니다. 내 나쁜 영어에 대한 다음 변명 :-) 당신이 제안한 것은 이해할 수 있습니다. 하지만 다소 다른 문제가 있습니다 : XSD 파일이 XML 데이터 바인딩 pas 파일을 사용하여 생성 된 클래스와 인터페이스로 구성표를 설명하고이 pas 파일을 가져 와서 정상을 유지하면서 최소값을 변경하려고합니다. 직업 수업. – Mielofon

+0

정수, 문자열 등의 간단한 유형이 있지만 모든 것이 작동합니다.그러나 일단 이상한 것을 원한다면 XML 데이터 바인딩을 허용하는 유형을 입력하고 생성 된 코드를 편집해야합니다. 스키마가 변경 될 때 결과가 매우 불쾌합니다. – Mielofon

관련 문제