FireMonkey Android: поднял класс исключения EJNIException с сообщением 'java .lang.IndexOutOfBoundsException: setSpan (XX ... XX) заканчивается за пределами длины X - PullRequest
0 голосов
/ 13 июля 2020

У меня есть 2 TNumberBox элемента управления на моей странице, и их свойства меняются следующим образом:

MaxValue: 1E9 ДесятичныйЦифры: 2 Текст: 0.00 KeyBoardType: DecimalNumberpad

Кроме того, в обоих полях я вызываю SelectAll() в событии OnClick, например:

procedure TfrmExpenseClaim.numTaxClick(Sender: TObject);
begin
  numTax.SelectAll;
end;

У меня также есть TComboBox на странице. Я могу ввести значение для первого TNumberBox, а затем, в зависимости от определенного значения TComboBox, будет обновлено второе TNumberBox. Кроме того, я могу обновить второе значение TNumberBox вручную, что не влияет на первое TNumberBox.

значение First Number Box: 110 Значение поля со списком: налог 10% Второе значение TNumberBox обновляется как 10 = ( NumberBox1.Value – ( NumberBox1.Value / ( 1 + 10/ 100))

Расчеты работают нормально.

Проблема в том, что если я изменю второе значение TNumberBox вручную, а затем быстро изменю TComboBox значение снова и снова, а затем выберите второй TNumberBox, отобразится следующая ошибка:

Project ExpenseClaims.apk вызвал класс исключения EJNIException с сообщением 'java .lang. IndexOutOfBoundsException: setSpan (6 ... 6) заканчивается за пределами длины 4 '.

setSpan (6 … 6) изменяется, так как иногда отображается (5 … 5) и (4 … 4). Впоследствии, большую часть времени, когда я выбираю этот второй TNumberBox, я получаю эту ошибку, и значения также обновляются неправильно.

Единственный способ восстановить после получения этой ошибки - закрыть приложение и открыть это снова.

Я попытался зафиксировать эту ошибку в коде, но не смог, так как она выходит за рамки написанного мной кода Delphi.

Это известная ошибка? Если да, что я могу сделать, чтобы исправить это?

type
  TfrmExpenseClaim = class(TForm)
    numTax: TNumberBox;  
    numInclTax: TNumberBox;  
    cmbTaxCategory: TComboBox;
    procedure numInclTaxClick(Sender: TObject);
    procedure numTaxClick(Sender: TObject);
    procedure numInclTaxChange(Sender: TObject);
    procedure cmbTaxCategoryChange(Sender: TObject);
  private
    FTaxDetailsList : TTaxDetailsList;
    procedure CalculateTax;
  end;

...

procedure TfrmExpenseClaim.cmbTaxCategoryChange(Sender: TObject);
begin
  CalculateTax;
end;

procedure TfrmExpenseClaim.numInclTaxChange(Sender: TObject);
begin
  if cmbTaxCategory.Selected.Text <> '' then
  begin
    CalculateTax;
  end;
end;

procedure TfrmExpenseClaim.numInclTaxClick(Sender: TObject);
begin
  numInclTax.SelectAll;
end;

procedure TfrmExpenseClaim.numTaxClick(Sender: TObject);
begin
  //This is where the problem occur as I think, but not in delphi code
  numTax.SelectAll;
end;

procedure TfrmExpenseClaim.CalculateTax;
var
  I: Integer;
var
  dPriceEx, dTaxVal: Double;
begin
  dPriceEx := 0.00;
  for I := 0 to FTaxDetailsList.Count - 1 do
  begin
    // Filling up the FTaxDetailsList work fine which is done via a API call
    if (cmbTaxCategory.Selected.Text = FTaxDetailsList[I].RateTitle) then
    begin
      if FTaxDetailsList[I].TaxRate = 0.00 then
      begin
        numTax.Value := 0.00;
      end
      else
      begin
        dPriceEx := numInclTax.Value / (1 + FTaxDetailsList[I].TaxRate / 100);
        dTaxVal := numInclTax.Value;
        numTax.Value := dTaxVal - dPriceEx;
        // Example 1 : numInclTax.Value is 110.00 and the FTaxDetailsList[I].TaxRate is 10 (10%). Therefore the numTax.Value should be 10.00;
        // Example 2 : numInclTax.Value is 110.00 and the FTaxDetailsList[I].TaxRate is 0 (0%). Therefore the numTax.Value should be 0.00;
      end;
    end;
  end;
end;

Проблема не возникает в первую очередь. Может быть, не раньше 5-го или 6-го экземпляра. Но это произойдет после нескольких быстрых изменений.

Как произвести:

Первый набор шагов:

  1. Введите значение numInclTax.Value (например: 115.00)

  2. По умолчанию cmbTaxCategory установлено на 15% GST. Это означает ставку налога 15%.

  3. Он рассчитает numTax.Value на основе кода TfrmExpenseClaim.CalculateTax как 15,00

Это нормально работает.

Второй набор шагов:

  1. Затем измените параметр cmbTaxCategory на Нулевой налог (который не является налогом)

  2. Он вычислит numTax.Value на основе кода TfrmExpenseClaim.CalculateTax как 0

Работает нормально.

Третий набор шагов:

  1. Затем обновите numTax.Value, заменив поле Число. Он либо увеличит, либо уменьшит numTax.Value в зависимости от направления, в котором вы меняете местами (я никогда не переходил к отрицательным значениям)

  2. Затем снова измените параметр cmbTaxCategory, снова он должен вычислить

  3. Затем numTax.Value, снова поменяв местами числовое поле.

В какой-то момент, снова повторив третий набор шагов и снова, на 3-м шаге, как только вы выберете numTax.Value, произойдет ошибка.

Мне удалось воспроизвести это только на Android. И я думаю, что это может быть как-то связано с переключением мест в числовом поле. Но я не уверен.

...