2015-10-21 7 views
0

При заполнении определенного метода, который вычисляет значение, и устанавливает TText.text к этому значению, я получаю следующее сообщение об ошибке бросила:Строки Index Error Delphi Seattle

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

Я сделал, что мой расчет был безопасным и обрабатывать возможные исключения до и после того, как они могут произойти. Это действительно только простой расчет дополнение ....

Быстрый поиск Google привел меня к: Firemonkey: Setting TLabel Text causes String Index out of Range Exception

1) Я не использую каретку возвращается, хотя, ни каких-либо разрывов строк. Это мой код для установки значения TText -

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

2) Это не TLabel, а компонент TText.

3) Это не бросает какие-либо ошибки на любом устройстве Android, симулятор или мой 4-го поколения IPad погонных прошивкой 9.0.2, но бросать ошибки на новых айфонов также работает IOS 9.

Любые идеи о обходной путь или исправление ошибки? Трудно отлаживать, какая строка точно выбрасывает ошибку, так как у меня нет прямого доступа к более новому iPhone, и у меня нет устройств или симуляторов, которые генерируют исключение при отладке.

Благодаря

+1

Почему закрытое голосование? Потому что мой вопрос слишком «длинный, или не краткий»? Ну разве это не противоречит тому, как часто я вижу нормализацию стека переполнения новых членов для вопросов, не предоставляющих достаточно деталей? – ThisGuy

+1

Вам нужно выполнить некоторую отладку. Довольно трудно понять, как мы можем помочь. Ограничьте проблему, изолируйте ее. –

+0

Сообщение об ошибке нечетное, звучит так, как будто все, что его производит, будет удовлетворено только индексом String нуля. Hey ho ... – MartynA

ответ

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 обращений к 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, или это может быть в некотором стороннем коде, который вы используете. Опять же, мы не можем сказать.

Я не думаю, что дополнительная информация может быть предоставлена ​​с учетом фактов, которые вы представляете в вопросе.