以下代码是一种接收数据处理方式,我都试用了好几种处理方法,都会出现这种问题,郁闷啊!
我跟踪调试了好几次,好象是在赋值的时候出错的!
Var  redate: Array of variant;
     i:integer;
     s1:String;
Begin
  redate:=FCom.Input;
  if redate=nil then Exit;
  s1:='';
  for i:=0 to VarArrayHighBound(redate,1) do
    s1:=s1+inttohex(redate[i],2);    
  ......

解决方案 »

  1.   

    这种错误一般是赋值给了没有的项,
    比方dbgrid(或者一个数组)只有3列,但是你却给它的第四列赋值,
    dbgrid.fields[3]:='xxx';
    这样就容易出现这种错误。用数组来举例:
    假设一个数组只定义了3个元素,你却给第四个元素赋值,也会出现这类错误
      

  2.   

    是不是VarArrayHighBound(redate,1)需要减1?
      

  3.   

    我知道错误提示的意思啊
    但就是不知道那里错误的
    我是用VarArrayHighBound(redate,1) 做为最大长度,应该是自动得到最大列的
    下面是我的另外1种写法,循环采集用7,8次后出现同样错误:
    var aa: array of byte;
        ii, jj: Word;
        vTmp1: variant;
        ovTmp1: olevariant;
        s1: String;
    begin
         Sleep(200);
         jj := FCom.InBufferCount;
         SetLength(aa,jj+1);     ovTmp1 := FCom.Input;
         vtmp1  := VarArrayCreate([0,jj],varByte);
         vtmp1  := ovTmp1;     for ii  := 0 to jj - 1 do
           aa[ii] := vtmp1[ii];
         S1 := '';
         for ii := 0 to jj - 1 do
           S1 := S1 + IntToHex(aa[ii],2) ; //+ ' ';     //Gget_Data 保存数据信息
         GRecStr:=GRecStr+S1; //保存接收字符
         GRecStr:=DelSpaceStr(GRecStr);//截取字符串中的空格
      

  4.   

    能说明一下FCom的定义吗,再有就是你的循环测试的完整代码,问题是可以解决的
      

  5.   

    >>variant or safe array index of out bounds
    越界了??从你第一个代码,感觉似乎不是越界,而是 inttohex 可能会出错
      

  6.   

    //创建设置TMSCOMM
      FCom := TMSComm.Create(nil);
      FCom.CommPort := iCom;   //com1,com2,com3
      FCom.RThreshold := 0;  //接收缓冲区收到每一个字符不产生 OnComm 事件
      FCom.InputMode := comInputModeBinary;
      FCom.InBufferSize :=2048;
      FCom.Settings := '2400,m,8,1';   
    我屏蔽 inttohex 下边语句再测试下,谢谢你们!
      

  7.   

    >>  if redate=nil then Exit;
    这句,似乎应该也检查,
    最好在调试的时候,
    在这句后,检查
    VarArrayHighBound(redate,1)
    的值
      

  8.   

    其实,在最后我也增加了
    if VarArrayHighBound(redate,1)<10 then Exit;
      

  9.   

    修改为:
     try
        redate:=FCom.Input;//??
      except
        showmsg('出错了!',myerror);
      end;
    系统会弹出设定的错误信息,各位朋友是否上面??处赋值有问题
      

  10.   

    我现在 把程序改成:
    Var  redate: Array of variant;
         cqii:integer;
         cqs1:String;
    Begin
      cqs1:='';
      sleep(100);
      //redate:=nil;
      //if FCom.InBufferCount<10 then Exit;
      try
        redate:=FCom.Input;
      except
        showmsg('出错了!',myerror);
      end;
    运行了7,8次还是报了同样的错误!!
    各位朋友帮我看看怎么回事情的
    是不是硬件程序通信出错,引起这样的问题
      

  11.   

    你可以试一下spcomm控件,很好用的...不用这么麻烦..
      

  12.   

    =>FCom.InputMode := comInputModeBinary;可能是传输方式的问题,改为字符方式试试
      

  13.   

    Var
      redate: Array of variant;
    改为:
    Var
      redate: variant;