Тема: Как создать EditBox, который будет считывать integer и double?

В предыдущем топике г-н Ривилис подробно объяснил, как создать EditBox, который будет считывать текстовые данные. За что ему ОГРОМНОЕ СПАСИБО!!!
Уж простите за глупые вопросы, да еще и не по ObjectARX. Подскажите, пожалуйста, как создать EditBox, считывающий типы данных integer и double? Честно попытался разобраться сам, не получилось... :о(

Re: Как создать EditBox, который будет считывать integer и double?

Тут не все так просто. На cколько я знаю, editbox-у все равно, что ты в него вводишь.
Если по простому, то есть функции atof - для перегонки стороки в double и atoi - для перегонки в integer.
Если по сложней (хочешь, чтоб вводились толко цифры, знак минус и точка), то просто отслеживай события OnChar для своего edita.
Но если этот нужно будет постоянно, то проще создать свой класс на базе CEdit, например CMyEdit, прописать там перегрузку OnChar, и заменить у себя CEdit m, на CMyEdit m. И тогда гарантированно будут писаться только те знаки, которые ты определишь в OnChar, но atof и atoi никто не отменял, если перегружать только OnChar.

Re: Как создать EditBox, который будет считывать integer и double?

Для целых ситуация попроще: edit-у можно выставить флаг ES_NUMBER, который запрещает ввод любых символов, кроме цифр.
А в общем случае, нужно действовать как сказал Николай, за тем исключением, что перегрукой только OnChar не обойтись, на практике необходимо обрабатывать ещё и WM_KEYDOWN и WM_PASTE (может что-то ещё, не помню).

Re: Как создать EditBox, который будет считывать integer и double?

А может поступить еще проще: проверять корректность ввода не online, а периодически. Т.е. если EditBox используется в диалоге, то в функции DoDataExchange (если используется MFC). В других случаях проверять можно, например, при потере фокуса EditBox'ом. Кроме экономии времени разработчика, при таком подходе программа меньше капает на мозги пользователю при вводе и, соответственно, меньше его раздражает.

Re: Как создать EditBox, который будет считывать integer и double?

А если еще проще, то можно с помощью ClassWizard добавить в диалог переменную нужного типа и все заботы переложить на соответсвующую DDX функцию.
Вариант абсолютно рабочий и подходит в 95%случаев.
Делается это так. Выносим edit на форму в редакторе ресурсов, щелкаем по нему правой внопкой и выбираем из меню "ClassWizard". В открывшемся окне переходим на закладку "Member variables", далее далее дважды щелкаем на строке с id нужного edit, откроется еще одно окошко где надо указать название переменной и ее тип (CString, int, UINT, long, float, double, ...).
После нажатия ok в диалог будет добавлена переменная и нужный код.
Вот собственно и все.
ЗЫ
Перед использованием значения переменной в диалоге не забыть вызвать

UpdateData(TRUE)

А если значение переменной изменили програмно и требуется вывести его в поле редактирование то вызывать надо:

UpdateData(FALSE)

Re: Как создать EditBox, который будет считывать integer и double?

> ROMA
Но есть как минимум одно замечание - если ввод не корректный, то сообщение об этом будет по-английски, что не всегда удобно.

> blond
Я бы написал свою функцию (или функции) проверки корректности ввода для разных типов данных (int, double и т.д.) и выполнял проверку при нажатии кнопки выполнения (например, кнопки "Да" "OK" "Применить" "Apply" и т.д.). Если значение(или значения - полей может быть несколько) корректно - выполняется работа и выход из диалога (если в этом есть необходимость). Если ввод некорректный, то выдаем соответствующее сообщение, и помещаем курсор в поле ввода. Диалог при этом не завершается пока все поля не исправлены или не нажата кнопка отказа - для нее проверку корректности проводить не следует.

Re: Как создать EditBox, который будет считывать integer и double?

> ROMA
Может я ничего не понимаю, но, поставив editBox и щелкнув по нему правой кнопкой, я в контекстном меню не нашел ClassWizard. :о(
Единственный пункт, связанный с классами - AddClass... Даже если предположить, что этот пункт следует выбрать, то не нашел я там вкладки "Member variables", там вообще только одна "страничка".
Что ж я не так-то делаю? Как-нить еще можно вызвать ClassWizard? А то обидно прям даже...

> Николай
Спасибо за совет! Попробовал - работает. :о)))
А все-таки интересно и с ClassWizard разобраться. ROMA, а у Вас какой ObjectARX? Может дело в этом?

Re: Как создать EditBox, который будет считывать integer и double?

> Александр Ривилис
Поэтому и написал в 95% случаев.

> blond
Дело вовсе не в ARX.
В Вашем случае ClassWizard не может добавить переменную в связи с тем что не знает какой клас в коде будет связан с формой в ресурсах. Поэтому и "говорит" - сначала надо AddClass.
В том окошке укажите название класа и он будет создан, либо укажите уже существующий клас диалога.
А далее как описал раньше.
Чесно говоря, все эти финты с мастером требуют кучу щелков мышью, а при увеличении размера проекта глюкавят или перестают работать.
Если получится то увидиш что мастер сделает всего два изменения:
1. В код класса добавит переменную, н-р

    double    m_ValInEdit1;

2. В код ф-и DoDataExchange добавит строчку

    DDX_Text(pDX, IDC_EDIT1, m_ValInEdit1);

Вот собственно и все.
Т.е. можно дописать эти строки ручками, что как правило всегда быстрее и проще.

Re: Как создать EditBox, который будет считывать integer и double?

> ROMA
Если я правильно понял человека, то ему нада контролировать именно ввод данных.
А при нажатии на кнопку ОК, достаточно просто считать что записано в окне и проанализировать, потом вернуть человека на это же окно, и пущай вводит все заново. Кстати, есть маленькая проблема по этому поводу. Сам сталкивался. Называется "региональные настройки". Если язык русский, то по умолчанию в вещественных числах ставится запятая. Так вот, если дополнительно проводить контроль ввода на потере окном фокуса, то в зависимости от шаловливости ручек (например, округление до третьего знака), можно поменять точки на запятые, даже этого и не заметив. И тогда double перестает восприниматься как таковой. Поэтому, все-таки лучше один раз устроить себе геморой по поводу написания класса, и больше об этом даже и не задумываться, чем каждый раз писать кучу лишних строчек текста для проверки правильности ввода. :)

Re: Как создать EditBox, который будет считывать integer и double?

как создать EditBox, считывающий типы данных integer и double

IМНО требуется получить значени введенное в Edit, а о самом вводе и других рассматриваемых проблемах речь пока не идет.
Если человек пишет прогу для себя, и о комерческом распространении речь не  идет, то лучше убить время на эффективное решение поставленой задачи, а не на изучене особенностей MFC и борьбу с CEdit

Re: Как создать EditBox, который будет считывать integer и double?

Спасибо всем большое! Поскольку вопрос был от начинающих, то проблема, действительно, была в получении значения,введенного в Edit. И о проблемах ввода данных задумываться на тот момент не приходилось. Но спасибо за советы! Сразу получил ответы на несколько вопросов.
:о)

Re: Как создать EditBox, который будет считывать integer и double?

Еще один вопрос в продолжение темы. По просьбам пользователей. Запустили они мою програмку(выполнили команду), появилось окошко, они ввели опр. значения->Ок, появилась опр. геометрия. Возможно ли в принципе организовать окно с EditBoxaми так, чтобы при повторном вызове программы в окошке отображались введенные ранее значения?
Уж простите, если вопрос совсем безграмотный!

Re: Как создать EditBox, который будет считывать integer и double?

> blond
Элементарно. Например, их можно прописать в эти EditBox'ы при повторном старте программы в методе OnInitDialog().