Пожалуйста, посмотрите на изменения форматирования, которые я сделал выше (особенно уровни отступа для обозначения блоков), а затем мой аннотированный код ниже, и проблему должно быть довольно легко выяснить. (Может помочь и отладчик.)
{ 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]);