我在cxgrid 上的值,当我用改变某一列的值的时候 触发onEditValueChanged的方法
问题是:
     用鼠标点击某一列修改其中的值后,再点击另外一列的时候一切都没有问题,没有报错。但是修改其中一列的值用键盘的上下左右键移动的时候会就报错了。报错的提示如下:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004C75D5 in module 'Project1.exe'.Read of address 00000000' 找了很久发现下面其中一个方法的错误引起,去掉这个方法就没有问题了,但是这个方法我调试也没有发生错误。
方法如下:procedure TMainForm.CalcTzjeTotal(cdsData : TClientDataSet);
var
  iIDIndex:Integer;
  fTzjeTotal:Double;
begin
  try
    iIDIndex := cdsData.FieldByName('ID').AsInteger;
    fTzjeTotal := 0;
    cdsData.First;
    while not cdsData.Eof do
    begin
      fTzjeTotal := fTzjeTotal + cdsData.FieldByName('JinE').AsFloat;
      cdsData.Next;
    end;
    cdsData.Locate('ID',iIDIndex,[]);//重新定位
    fTzjeTotal := MakeDecimalValue(fTzjeTotal);
    edtTzjeTotle.Value := fTzjeTotal;
  except On ex: Exception do
    raise Exception.Create(ex.Message);
  end;
end;{
功能说明:个位数四舍五入进位
   fTzje=12345,输出12350 ; fTzje=12343,输出12340
}
function TMainForm.MakeDecimalValue(fValue:Double): Double;
begin
  fValue := MyDivide(fValue,GDivide);
  //round 计算四舍五入,比如 round(-123.55)=-124,round(123.55)=124
  //trunc 直接切下整数,比如 trunc(-123.55)=-123, floor(123.55)=123
  Result := round(fValue) * GDivide;
end;function TMainForm.MyDivide(byDivide, divide: Double): Double;
begin
  if divide = 0 then
     result := 0
  else
     result := byDivide/ divide;
end;
{
功能说明:个位数四舍五入进位
   fTzje=12345,输出12350 ; fTzje=12343,输出12340
}
function TMainForm.MakeDecimalValue(fValue:Double): Double;
begin
  fValue := MyDivide(fValue,GDivide);
  //round 计算四舍五入,比如 round(-123.55)=-124,round(123.55)=124
  //trunc 直接切下整数,比如 trunc(-123.55)=-123, floor(123.55)=123
  Result := round(fValue) * GDivide;
end;

解决方案 »

  1.   

    试试在keydown里 + 是否Editing来判断, 是否屏掉上下左右
      

  2.   

    主要好像在下面的代码中cdsData.First;
        while not cdsData.Eof do
        begin
          fTzjeTotal := fTzjeTotal + cdsData.FieldByName('JinE').AsFloat;
          cdsData.Next;
        end;
      

  3.   

    这个定位能否加个判断,如果确定找到再执行下面的操作:if cdsData.Locate('ID',iIDIndex,[]) then//重新定位
    begin
        fTzjeTotal := MakeDecimalValue(fTzjeTotal);
        edtTzjeTotle.Value := fTzjeTotal;
    end;
      

  4.   

    最奇怪的是,用鼠标触发onchange没问题,用键盘才有问题,是不是cxgrid的bug?