該指數是由System.Character
到CheckZeroStringRange
呼叫提高。相關定義:
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庫代碼中,或者可能出現在您使用的某些第三方代碼中。再次,我們不能說。
鑑於您在問題中提出的事實,我不認爲可以提供任何更多信息。
爲什麼近距離投票?因爲我的問題太「冗長或不簡明」?那麼這與我看到Stack Overflow法線在多少次提供新成員的問題並不矛盾? – ThisGuy
你需要做一些調試。很難看到我們如何提供幫助。縮小問題範圍,隔離它。 –
錯誤消息很奇怪,聽起來好像什麼產生它只會滿足零索引。 Hey ho ... – MartynA