БлогNot. C++ Builder: разрешить вводить в TEdit только вещественные числа

C++ Builder: разрешить вводить в TEdit только вещественные числа

...при этом, числа в экспоненциальной форме (с буквой E) вводить не разрешим. Если разберётесь с кодом примера, такое легко сделать по аналогии, просто код будет подлинней. Зато мы попытаемся учесть и не допустить "хитрые" способы ввода числа, такие, как вставка его из буфера обмена.

Создав пустой проект, добавим на форму поле ввода TEdit, по умолчанию оно получит имя Edit1.

В классе формы пропишем в секции private: файла Unit1.h новую функцию:

private:	// User declarations
 void __fastcall NewEditProc(TMessage &message);

В конструкторе формы выставим новую функцию слушателем событий от поля ввода:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  Edit1->WindowProc = NewEditProc;
  Edit1->MaxLength = 5;
}

Заодно мы здесь ограничили максимальную длину вводимого числа 5 символами.

Вот реализация функции:

void __fastcall TForm1::NewEditProc(TMessage &message)
{
    if(message.Msg != WM_PASTE)
        Edit1->Dispatch(&message);
}

Смысл в том, чтобы нельзя было вставить неправильные данные из буфера обмена.

Обработчик события OnMouseDown запретит на поле ввода правую кнопку мыши:

void __fastcall TForm1::Edit1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 if(Button == mbRight) Edit1->ReadOnly = true;
}

Как обычно, основной контроль выполнит обработчик события OnKeyPress нашего поля ввода:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
 Edit1->ReadOnly = false;
 if (isdigit(Key) || (Key == VK_BACK)) { return; }
  //Разрешили цифры и BackSace
 else if (Key == 13) { //Что делаем по нажатию Enter, здесь просто сообщение
  ShowMessage (Edit1->Text);
 }
 else if ((Key=='-' || Key=='+') && 
  Edit1->SelStart==0 && Edit1->SelLength==0) return;
  //Знак числа можно вводить только в первую позицию поля
 String dsstr = DecimalSeparator; //Разделитель целой и дробной частей числа из системы
 if (Key == '.' && dsstr=="." || Key == ',' && dsstr==",") {
  if (Edit1->Text.Pos(Key)!=0) Key=0; //уже есть разделитель - нельзя вводить
  else return;
 }
 Key = 0; //Всё остальное вводить нельзя
}

Решение неидеально, например, нельзя будет выделить две-три введённых в начале цифры числа и заменить их знаком "+" или "-"... но с целью заморочить юзера сойдёт :)

P.S. В новой линейке Builder XE кое-какие мелочи в коде изменятся:

  • FormatSettings.DecimalSeparator вместо DecimalSeparator;
  • Application->MessageBox(L"Введено неверное значение",L"Ошибка"); вместо того вывода сообщений, что в примере.

29.09.2014, 20:28 [13962 просмотра]


теги: числа c++ builder

К этой статье пока нет комментариев, Ваш будет первым