2015-10-21 29 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库代码中,或者可能出现在您使用的某些第三方代码中。再次,我们不能说。

鉴于您在问题中提出的事实,我不认为可以提供任何更多信息。