20/01/2012我现在放弃了狂欢,并在FastReport中重新编写了报告。
我现在通过下载DelphiXE2并使用Rave版本10重新编译报告来完成报告。
我正在使用RAD Studio XE版本15.0.3953.35171和RV90RAVBE Build 100610。
1)
我正在将旧的delphi2005项目转换为DelphiXE并在Rave中遇到问题。
错误消息是
Access Violation at address 5003c0a0 in module ‘rtl50.bpl’. Read of address 000006F9
我相信这是在狂欢OnGetText
事件中发生的。
数据是一个浮点数,表示以天为单位的持续时间,我将以天,小时,分钟,秒显示。
在没有事件的情况下运行代码会显示正确的数字,但是一旦我进行strToFloat
转换,它就会失败。
我已经沙箱化了代码,有时候在引入intToStr
时会失败,有时会引入strToFloat
失败的特定代码行是
tmp := StrToFloat(value);
以下是代码:
{ Event for Duration.OnGetText }
function Duration_OnGetText(Self: TRaveDataText; var Value: string);
var
tmp :Extended;
days :Integer;
hours: Integer;
minutes: Integer;
seconds: Integer;
begin
if(value <> '') then
tmp := StrToFloat(value);
days := Trunc(tmp);
tmp := Frac(tmp)*24;//fraction of a day in hours
hours := Trunc(tmp);
tmp := Frac(tmp)*60;
minutes := Trunc(tmp);
tmp := Frac(tmp)*60;
seconds := Trunc(tmp);
Value := IntToStr(days) + ':' + IntToStr(hours)+ ':' + IntToStr(minutes)+ ':' + IntToStr(seconds);
end;
答案 0 :(得分:0)
请查看我上面的格式更改(特别是缩进级别以指示块),然后是我在下面注释的代码,问题应该很容易理解。 (逐步调试调试器也可能有所帮助。)
{ Event for Duration.OnGetText }
function Duration_OnGetText(Self: TRaveDataText; var Value: string);
var
tmp :Extended;
days :Integer;
hours: Integer;
minutes: Integer;
seconds: Integer;
begin
if(value <> '') then
tmp := StrToFloat(value); // This only gets called if Value <> ''
// Note that value could contain 'Pete', '123.45', 'Argh!', etc.
// This gets called no matter what the value of tmp is,
// whether it's a valid floating point created by StrToFloat
// above, or a random value picked up from memory (since it
// may never have been initialized above. The same applies to
// every line of code that follows.
days := Trunc(tmp);
tmp := Frac(tmp)*24;//fraction of a day in hours
hours := Trunc(tmp);
tmp := Frac(tmp)*60;
minutes := Trunc(tmp);
tmp := Frac(tmp)*60;
seconds := Trunc(tmp);
Value := IntToStr(days) + ':' + IntToStr(hours)+ ':' + IntToStr(minutes)+ ':' + IntToStr(seconds);
end;
如果StrToFloat
不是浮点值,那么您不会处理Value
的失败。您可以尝试使用StrToFloatDef
使用默认值或TryStrToFloat
并测试布尔返回值以查看是否应继续或退出。
发布的代码无法编译,顺便说一下。您在底部有一个额外的end OnGetText;
,与上面的代码不匹配。请在您的问题上发布实际的,可编辑的代码,尤其是那些您尝试追踪的异常或访问违规行为。
另外,作为建议 - 用
替换最后一行代码Value := Format('%d:%d:%d:%d', [days, hours, minutes, seconds]);