Поведение StringReplace на iOS

У меня есть поле TEdit, и в его событии KeyUp я заменяю любое вхождение "-" пробелом "". Когда я запускаю Win32, он работает именно так, как я ожидаю - каждый раз, когда я набираю клавишу -, он ненадолго появляется, а затем удаляется.

Когда я запускаю iOS и несколько раз нажимаю клавишу -, я получаю результат удаления последнего символа в поле редактирования каждый второй раз, когда я нажимаю -. Исключение составляют 2-е и 3-е нажатия, при которых я оба раза удаляю последний символ. Это должно быть просто удаление -.

например Если я начну с 123456 в Edit и нажму только клавишу минус, я получу то, что вы видите на этом gif ниже:

введите здесь описание изображения

В табличной форме результаты следующие:

введите здесь описание изображения

void __fastcall TForm1::EditConstantKeyUp(TObject *Sender, WORD &Key, System::WideChar &KeyChar,
      TShiftState Shift)
{
 if (KeyChar == 45) {  // minus key pressed  (ascii code for that key is 45)
 EditConstant->Text = StringReplace(EditConstant->Text, "-", "", TReplaceFlags() << rfReplaceAll);
}

Какую фундаментальную вещь мне здесь не хватает? Я работаю в Rad Studio 10.3.2, используя C++ Builder.


person relayman357    schedule 09.09.2019    source источник


Ответы (1)


Правильный способ справиться с этим — установить для параметра Key/KeyChar значение 0, чтобы отклонить нажатие клавиши, и вообще не манипулировать TEdit::Text.

Попробуйте что-то вроде этого:

// or, use the OnKeyDown event instead...
void __fastcall TForm1::EditConstantKeyUp(TObject *Sender,
    WORD &Key, System::WideChar &KeyChar, TShiftState Shift)
{
    if (Key == 0)
    {
        if (KeyChar == _D('-'))
            KeyChar = 0;
    }
    else
    {
        if ((Key == vkMinus) || (Key == vkSubtract))
            Key = 0;
    }
}
person Remy Lebeau    schedule 10.09.2019
comment
Спасибо, Реми, это решило проблему, когда я поместил ваш код в событие KeyDown, как вы предложили. Не работало при установке KeyUp. - person relayman357; 11.09.2019