Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > EDITTEXT Разрешить только ввод float


Автор: Riddik 24.5.2013, 12:23
Как лучше всего реализовать ввод только float значений - т.е. цифр и точки?

EDITTEXT в диалоговом окне, в ф-ии обработчике жду уведомления EN_CHANGE, там смотрю введённые значения:

Код

wchar_t b[16] = {0};       
uint32 count = GetDlgItemTextW(m_hwnd, ID_ET1, b, sizeof(b));
if(count == 0) break;
for(int i = 0; i < count; ++i)
{
    if(!((b[i] >= L'0' && b[i] <= L'9') || b[i] == L'.'))
    {
        if(i + 1 < count) for(int j = i + 1; j < count; ++j) { b[j - 1] = b[j]; b[j] = 0; }
        else b[i] = 0;
        SetDlgItemTextW(m_hwnd, ID_ET1, b);
    }
}


Жутко коряво. Есть ли способ удалять неверный символ по-другому?
Да ешё SetDlgItemTextW снова шлёт уведомления и при каждом вводе два раза обработка идёт. Не эффективно.

Автор: GremlinProg 24.5.2013, 14:27
Цитата(Riddik @  24.5.2013,  14:23 Найти цитируемый пост)
Жутко коряво. Есть ли способ удалять неверный символ по-другому?

Можно подать b в функцию _input по шаблону "%f" и смотреть, на каком символе закончился разбор b:
  если FILE::_ptr указывает на последний символ ( '\0' ), то все норм., просто число недописано,
  в противном случае - FILE::_ptr будет указывать на неверный символ.

Но я бы не рекомендовал делать посимвольную проверку уже просто потому, что пользователю может потребоваться сформировать float в экспоненциальной форме - это с буквой 'E' и знаком показателя после нее. Не уверен, что такая запись пройдет посимвольную проверку. Т.е. вполне возможно, что например значение 0.345E-16 пользователь вести уже не сможет.

Делайте разбор значения по нажатию "Enter".

Автор: Riddik 24.5.2013, 15:00
Спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)