当完成某个计算值的方法并将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,我所拥有的设备或模拟器在调试时抛出异常,因此难以调试哪条线确切地抛出错误。
由于
答案 0 :(得分: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。这就是您的错误消息告诉您的内容。
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,并且可以使用。