将类型(OleStr)的变量转换为Type Integer Delphi时溢出

时间:2013-04-16 07:19:55

标签: delphi delphi-7 pascal variant

我试图读取一个Xml文件,但我在Integer或WideString类型上将类型(OleStr)的变体转换为Type Integer时出现“溢出”,我尝试更改VarToStr,IntToStr,VarToWideStr和OleStrToString中的类型。

xml文件的示例

<product product-id="01126400000" product-group-id="10010877">
<name><![CDATA[Love-Positions]]></name>
<selling-price>6.95</selling-price>
<dicount-prohibited>0</dicount-prohibited>
<list-price>4.00</list-price>
<ean-code>4024144112647</ean-code>
<availability>1</availability>
<valid-from-date>19970623</valid-from-date>

procedure TForm1.Button1Click(Sender: TObject);
Var
MyXmlMax,MyXmlMin : integer;
Item: String;

begin

MyXmlMax := xmlDatafeed.Productlist.Count;
//item :=  (xmlDatafeedsub.Attributes['product-id']+','+ xmlDatafeedsub.Attributes['product-group-id'] );


for MyxmlMin := 1 to MyXmlMax-1 do begin
xmlDatafeedsub:=xmlDatafeed.Productlist[MyxmlMin];
memo1.lines.add('------');
memo1.lines.add(VarToStr(xmlDatafeedsub.Productid));  //Integer
memo1.lines.add(VarToStr(xmlDatafeedsub.Productgroupid)); //Integer
Memo1.Lines.Add(xmlDatafeedsub.Name);//WideString
memo1.lines.add((xmlDatafeedsub.Sellingprice)); //Integer
memo1.lines.add(VarToStr(XmlDataFeedSub.Dicountprohibited));//Integer
memo1.lines.add((xmlDatafeedsub.Listprice)); //Widestring
memo1.lines.Add(IntToStr(xmlDatafeedsub.Eancode));//Integer
memo1.lines.add(VarToStr(xmlDatafeedsub.Availability));//Integer
memo1.lines.add(VarToStr(xmlDatafeedsub.Validfromdate));//Integer
Inc(MyXmlMax,1);
memo1.lines.add('------');
end;   //end if
end;


//productdata_v2_01_01.xdb
`
function TXMLProductType.Get_Productid: Integer;
begin
  Result := AttributeNodes['product-id'].NodeValue;
end;

procedure TXMLProductType.Set_Productid(Value: Integer);
begin
  SetAttribute('product-id', Value);
end;

function TXMLProductType.Get_Productgroupid: Integer;
begin
  Result := AttributeNodes['product-group-id'].NodeValue;
end;

procedure TXMLProductType.Set_Productgroupid(Value: Integer);
begin
  SetAttribute('product-group-id', Value);
end;

function TXMLProductType.Get_Name: WideString;
begin
  Result := ChildNodes['name'].Text;
end;

procedure TXMLProductType.Set_Name(Value: WideString);
begin
  ChildNodes['name'].NodeValue := Value;
end;

function TXMLProductType.Get_Sellingprice: WideString;
begin
  Result := ChildNodes['selling-price'].Text;
end;

procedure TXMLProductType.Set_Sellingprice(Value: WideString);
begin
  ChildNodes['selling-price'].NodeValue := Value;
end;

function TXMLProductType.Get_Dicountprohibited: Integer;
begin
  Result := ChildNodes['dicount-prohibited'].NodeValue;
end;

procedure TXMLProductType.Set_Dicountprohibited(Value: Integer);
begin
  ChildNodes['dicount-prohibited'].NodeValue := Value;
end;

function TXMLProductType.Get_Listprice: WideString;
begin
  Result := ChildNodes['list-price'].Text;
end;

procedure TXMLProductType.Set_Listprice(Value: WideString);
begin
  ChildNodes['list-price'].NodeValue := Value;
end;

function TXMLProductType.Get_Eancode: Integer;
begin
  Result := ChildNodes['ean-code'].NodeValue;
end;

procedure TXMLProductType.Set_Eancode(Value: Integer);
begin
  ChildNodes['ean-code'].NodeValue := Value;
end;

function TXMLProductType.Get_Availability: Integer;
begin
  Result := ChildNodes['availability'].NodeValue;
end;

procedure TXMLProductType.Set_Availability(Value: Integer);
begin
  ChildNodes['availability'].NodeValue := Value;
end;

function TXMLProductType.Get_Validfromdate: Integer;
begin
  Result := ChildNodes['valid-from-date'].NodeValue;
end;

procedure TXMLProductType.Set_Validfromdate(Value: Integer);
begin
  ChildNodes['valid-from-date'].NodeValue := Value;
end;

1 个答案:

答案 0 :(得分:2)

您的product-id attribte和EAN Codes不是整数,但您正试图将它们视为此类。它们是字符串值。 (它们太大而不适合整数。)它们不是你要进行数学运算或算术运算的数字,所以不要试图对它们进行处理。将定义更改为WideString,您应该没问题。

// You'll need to change these in the `interface` as well. Here are the EANCode
// conversions for you.
function TXMLProductType.Get_Eancode: WideString;
begin
  Result := ChildNodes['ean-code'].NodeValue;
end;

procedure TXMLProductType.Set_Eancode(Value: WideString);
begin
  ChildNodes['ean-code'].NodeValue := Value;
end;