簡體   English   中英

Rave報告-intToStr或StrToFloat上rtl150.bpl中的訪問沖突

[英]Rave Reports - Access Violation in rtl150.bpl on intToStr or StrToFloat

2012年1月20日我現在已經放縱了,轉而對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轉換,它就會失敗。

我對代碼進行了沙盒處理,有時在引入intToStrintToStrstrToFloat

失敗的特定代碼行是

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. 是否可以在rave中設置斷點並進行調試? 我找不到有關調試的任何幫助。

請查看我在上面所做的格式更改(特別是縮進級別以指示塊),然后查看下面的帶注釋的代碼,問題應該很容易解決。 (逐步調試程序也可能有所幫助。)

{ 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;

如果Value不是浮點Value則不會處理StrToFloat的失敗。 您可以嘗試使用StrToFloatDef用默認值,或TryStrToFloat和測試布爾返回值,看看是否應該繼續或退出。

順便說一句,您發布的代碼無法編譯。 您還有一個額外的end OnGetText; 與上面的代碼不匹配的底部。 請發布實際的,可編譯的代碼,並附上您的問題,尤其是有關您要跟蹤的異常或訪問沖突的問題。

另外,建議-將最后一行代碼替換為

Value := Format('%d:%d:%d:%d', [days, hours, minutes, seconds]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM