Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 14.04.2015
Сообщений: 72

Собрал код и сам не понимаю, как он работает. Маска ввода TextBox

03.06.2017, 19:07. Показов 1558. Ответов 3

Студворк — интернет-сервис помощи студентам
Приветствую. В общем ситуация такая, что нужно было запретить пользователю вводить все символы, кроме: числа, запятая и тире. А так же, убрать возможность добавления второй запятой в строке и автоматическое добавление 0 вначале, если первым символов в строке стоит запятая. С этими всеми задачами код справляется правильно. Как оно работает мне понятно кроме одного момента. Вот весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private: System::Void textBox6_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
             if ((e->KeyChar < '0' || e->KeyChar > '9') && (e->KeyChar != ',') && (e->KeyChar != '-') && (e->KeyChar != 8)) 
            { 
                e->Handled = true; 
            }
 
             if (e->KeyChar == ',')
             {
                                 if (textBox6->Text->Length == 0)
                 {
                     textBox6->Text += "0,";
                     this->textBox6->Select(this->textBox6->Text->Length,this->textBox6->Text->Length);
                 }
                 if (textBox6->Text->IndexOf(',') != -1)
                 {
                     e->Handled = true; 
                 }
             }
             if (e->KeyChar == '-')
             {
                 if (textBox6->Text->Length >= 1)
                 {
                     e->Handled = true; 
                 }
                 if (textBox6->Text->IndexOf('-') != -1)
                 {
                     e->Handled = true; 
                 }
             }
 
         }
Не понимаю одного. Свойство IndexOf возвращает, как говорят учебники, номер позиции искомого элемента. Т.е. например, IndexOf('о') вернет в строке со словом "Форум" значение позиции буквы 'о' = 1. В противном случае, если объект не найден, возвращает -1. Так вот, я не понимаю, как оно работает правильно, если я ввожу первый раз в строку запятую, проверяется
C++
1
if (textBox6->Text->IndexOf(',') != -1)
, получается если запятая вводится в строку первой, она будет иметь позицию 0 и соответственно условие выполнится (т.к. 0 не равно -1 будет) и в теле условия стоит
C++
1
e->Handled = true;
, т.е. ЗАПРЕТИТЬ ввод, но запятая то вводится все равно. А вот если вводить запятую второй раз, то второй раз она уже не вводится, как и требуется.
Или, допустим еще пример, если я введу запятую не вначале строки, а через 2-3 символа(да хоть через 10, без разницы). Берем к примеру такую строку "456,34". На 4-ом нажатии на клавишу, во время ввода запятой, будет проверяться условие
C++
1
if (textBox6->Text->IndexOf(',') != -1)
, которое выполнится, ибо IndexOf вернет номер позиции найденной запятой как = 3 и она не равна -1, в таком случае выполнится запрет ввода в теле условия, НО ЗАПЯТАЯ ВВОДИТСЯ, а вот если я еще раз введу запятую, то тогда она уже не введется.
Такое ощущение, что IndexOf работает не так, как пишут учебники. Может кто мне разъяснить? Прошу прощение за возможно путанный текст, трудно было объяснить по-простому.

Добавлено через 23 часа 14 минут
up.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.06.2017, 19:07
Ответы с готовыми решениями:

Маска ввода номера. Сам номер не приходит в почту :(
Друзья, скажите, что не так в коде? Сделал скрипт маски ввода тел номера вот код: // маска телефона// function clearVal(val, limit){ ...

переведите код из C++ В Assembler (Сам не понимаю как перевести)
ВОТ Код. #include &lt;iostream&gt; //output include #include &lt;string&gt; //kernel include #include &lt;vector&gt; //kernel include ...

Маска ввода TextBox
Здравствуйте. Вопрос: как сделать так, чтобы в textbox нельзя было записать буквы или цифры?..

3
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
03.06.2017, 22:51
Читал-читал - не понял. В чем проблема? В понимании или коде? Код вполне рабочий, запрещает ввод 2 запятой.
0
0 / 0 / 1
Регистрация: 14.04.2015
Сообщений: 72
03.06.2017, 22:55  [ТС]
Sklifosofsky, каким образом он пропускает первую запятую? Ведь IndexOf находит не кол-во этих запятых, а номер позиции первой найденной запятой. Она может быть вообще на 10 месте, но даже на первом месте в поле она принимает позицию 0, в таком случае условие
C++
1
if (textBox6->Text->IndexOf(',') != -1)
будет выполняться, а в теле этого условия стоит запрет на ввод. Так почему все же первая запятая вводится?
Да и если я поставлю ее на позицию 4, к примеру, то условие опять выполнится, т.к. IndexOf найдет ее на 4ой позиции и не будет равна -1, но она все равно введется в поле.
0
 Аватар для Sklifosofsky
1085 / 915 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
03.06.2017, 23:25
В понимании. Обработчик события KeyPress срабатывает до присвоенния значения. То есть, после ввода запятой в обработчикие, при проверке содержания элемента управления её ещё небудет, она повится или нет в зависимости от флага состояния Handled

C++
1
e->Handled = true;
- дает парметр(флаг) вызывающему коду запрет на ввод значения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2017, 23:25
Помогаю со студенческими работами здесь

Маска ввода в TextBox
Привет! Как реализовать маску ввода (№дог.____от.________ ____дней.) в TextBox? №дог.____ - 4 символа от.________ - дата ...

Маска ввода в TextBox
Добрый день, подскажите как можно показывать маску ввода в TextBox? Пытался сделать с помощью NUDTextBox.Text =...

Купил комп.собрал сам и естественно не работает
Доброго всем времени суток! Купил вчера вот эту сборку – ...

Маска ввода времени в поле TextBox
Товарищи, хелп плз. Мне нужно создать маску быстрого ввода времени (формат такой = 00:00, где первые две цифры это часы, а вторые две - это...

Маска ввода для поля TextBox по шаблону MVVM
Привет, есть поля TextBox для ввода телефона, паспортных данных и т.д. Как наиболее правильно реализовать проверку по маске ввода не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru