我在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;
问题是:
用鼠标点击某一列修改其中的值后,再点击另外一列的时候一切都没有问题,没有报错。但是修改其中一列的值用键盘的上下左右键移动的时候会就报错了。报错的提示如下:
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;
while not cdsData.Eof do
begin
fTzjeTotal := fTzjeTotal + cdsData.FieldByName('JinE').AsFloat;
cdsData.Next;
end;
begin
fTzjeTotal := MakeDecimalValue(fTzjeTotal);
edtTzjeTotle.Value := fTzjeTotal;
end;