Rave Reports - нарушение прав доступа в rtl150.bpl на intToStr или StrToFloat - PullRequest
0 голосов
/ 23 сентября 2011

20/01/2012 Я отказался от rave и переработал отчеты в 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

Я полагаю, что это происходит в rave 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 голосов
/ 20 января 2012

Пожалуйста, посмотрите на изменения форматирования, которые я сделал выше (особенно уровни отступа для обозначения блоков), а затем мой аннотированный код ниже, и проблему должно быть довольно легко выяснить. (Может помочь и отладчик.)

{ 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]);
...