String Index Error Delphi Seattle

时间:2015-10-21 19:34:17

标签: delphi delphi-10-seattle

当完成某个计算值的方法并将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)这不会在运行iOS 9.0.2的任何Android设备,模拟器或我的第4代iPad上出现任何错误,但是在运行iOS 9的较新iPhone上也会出错。

关于变通方法或错误修复的任何想法?由于我没有直接访问较新的iPhone,我所拥有的设备或模拟器在调试时抛出异常,因此难以调试哪条线确切地抛出错误。

由于

2 个答案:

答案 0 :(得分: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。这就是您的错误消息告诉您的内容。

CheckZeroStringRange中有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库代码中,或者可能在您使用的某些第三方代码中。再说一次,我们不能说。

根据您在问题中提供的事实,我认为不能提供更多信息。

答案 1 :(得分:0)

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