У меня есть 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-го экземпляра. Но это произойдет после нескольких быстрых изменений.
Как произвести:
Первый набор шагов:
Введите значение numInclTax.Value
(например: 115.00)
По умолчанию cmbTaxCategory
установлено на 15% GST. Это означает ставку налога 15%.
Он рассчитает numTax.Value
на основе кода TfrmExpenseClaim.CalculateTax
как 15,00
Это нормально работает.
Второй набор шагов:
Затем измените параметр cmbTaxCategory
на Нулевой налог (который не является налогом)
Он вычислит numTax.Value
на основе кода TfrmExpenseClaim.CalculateTax
как 0
Работает нормально.
Третий набор шагов:
Затем обновите numTax.Value
, заменив поле Число. Он либо увеличит, либо уменьшит numTax.Value
в зависимости от направления, в котором вы меняете местами (я никогда не переходил к отрицательным значениям)
Затем снова измените параметр cmbTaxCategory
, снова он должен вычислить
Затем numTax.Value
, снова поменяв местами числовое поле.
В какой-то момент, снова повторив третий набор шагов и снова, на 3-м шаге, как только вы выберете numTax.Value
, произойдет ошибка.
Мне удалось воспроизвести это только на Android. И я думаю, что это может быть как-то связано с переключением мест в числовом поле. Но я не уверен.