Rave Reports - 在intToStr或StrToFloat上的rtl150.bpl中访问冲突

时间:2011-09-23 12:36:12

标签: delphi delphi-xe

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;
  1. 是否有可能在狂欢中设置断点和调试?我在调试方面找不到任何帮助。

1 个答案:

答案 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]);