该指数是由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