2015-10-21 63 views
0

當完成計算的值,並設置一個TText.text爲該值的一定的方法,我拋出了以下錯誤:字符串指數誤差德爾福西雅圖

'String index out of range. (-1) Must be >=0 and <=0' 

我完全相信我的計算是安全的,在可能發生之前和之後處理可能的例外情況。這僅僅是一個簡單的加法計算....

快速谷歌搜索導致我:我沒有使用馬車 Firemonkey: Setting TLabel Text causes String Index out of Range Exception

1)雖然返回,也沒有任何換行符。這是我設置ttext值碼 -

TotalCost.text:='$'+FormatFloat('0.00',total); 

2)它不是一個的TLabel,但TText組件。

3)這不拋出任何Android設備,仿真器或我的第四代iPad運行iOS 9.0.2的任何錯誤,但是在新的iPhone引發錯誤也運行iOS 9

任何想法解決方法或錯誤修復?由於我沒有直接訪問更新的iPhone,所以很難調試哪條線正好拋出錯誤,我也沒有設備或模擬器在調試時拋出異常。

感謝

+1

爲什麼近距離投票?因爲我的問題太「冗長或不簡明」?那麼這與我看到Stack Overflow法線在多少次提供新成員的問題並不矛盾? – ThisGuy

+1

你需要做一些調試。很難看到我們如何提供幫助。縮小問題範圍,隔離它。 –

+0

錯誤消息很奇怪,聽起來好像什麼產生它只會滿足零索引。 Hey ho ... – MartynA

回答

1

該指數是由System.CharacterCheckZeroStringRange呼叫提高。相關定義:

resourcestring 
    sArgumentOutOfRange_StringIndex = 
    'String index out of range (%d). Must be >= %d and <= %d'; 

class procedure TCharHelper.RaiseCheckStringRangeException(Index, LowIndex, 
    MaxIndex: Integer); 
begin 
    raise EArgumentOutOfRangeException.CreateResFmt(@sArgumentOutOfRange_StringIndex, 
    [Index, LowIndex, MaxIndex]) at ReturnAddress; 
end; 

procedure CheckZeroStringRange(const S: string; Index: Integer); inline; 
var 
    MaxIndex: Integer; 
begin 
    MaxIndex := High(S); 
    if (Index > MaxIndex) or (Index < 0) then 
    Char.RaiseCheckStringRangeException(index, 0, MaxIndex); 
end; 

現在你的錯誤表示您的代碼試圖訪問長度爲1從零開始的字符串,指數-1。這就是你的錯誤信息告訴你的。

System.Character有20個電話CheckZeroStringRange。他們都非常相似,看起來像這樣:

class function TCharHelper.IsDigit(const S: string; Index: Integer): Boolean; 
var 
    C: UCS4Char; 
begin 
    CheckZeroStringRange(S, Index); 
    C := UCS4Char(S[Index]); 
    if IsLatin1(C) then 
    Result := C in [$0030..$0039] // '0'/'9' 
    else 
    Result := InternalGetUnicodeCategory(ConvertToUtf32(S, Index)) = 
     TUnicodeCategory.ucDecimalNumber; 
end; 

因此,在一些程序中撥打電話,看起來像這樣:

if TCharHelper.IsDigit(str, -1) then // BOOM! 

當然,它不會完全一樣,但這與我們所能看到的一樣多。

你的下一步是做一些調試。如果您無法直接在設備上進行調試,則需要在程序中添加一些跟蹤日誌記錄以確定導致錯誤的調用序列。缺陷可能出現在您的代碼中,也可能出現在Delphi庫代碼中,或者可能出現在您使用的某些第三方代碼中。再次,我們不能說。

鑑於您在問題中提出的事實,我不認爲可以提供任何更多信息。