0

当完成某个计算值并将 TText.text 设置为该值的方法时,我收到以下错误:

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

我确保我的计算是安全的,并在可能发生之前和之后处理了可能的异常。这真的只是一个简单的加法计算......

一个快速的谷歌搜索导致我: Firemonkey:设置 TLabel 文本导致字符串索引超出范围异常

1)我没有使用回车,也没有任何换行符。这是我设置 ttext 值的代码 -

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

2)它不是一个TLabel,而是一个TText组件。

3) 这不会在任何运行 iOS 9.0.2 的 Android 设备、模拟器或我的第 4 代 iPad 上引发任何错误,但会在运行 iOS 9 的较新 iPhone 上引发错误。

关于解决方法或错误修复的任何想法?很难调试哪一行会引发错误,因为我无法直接访问较新的 iPhone,我拥有的设备或模拟器在调试时也不会引发异常。

谢谢

4

2 回答 2

1

索引是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 的从零开始的字符串。这就是你的错误信息告诉你的。

有 20 次调用CheckZeroStringRangein System.Character。它们都非常相似,看起来像这样:

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 库代码中,也可能存在于您使用的某些第三方代码中。同样,我们不能说。

鉴于您在问题中提出的事实,我认为无法提供更多信息。

于 2015-10-22T16:53:41.813 回答
0

当我使用 #10 作为换行符(GlobalUseGPUCanvas := true)时,我遇到了同样的错误。我将其更改为 #13#10 并且可以正常工作。

于 2018-08-22T21:31:36.337 回答