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 просмотра]