Page 1 of 1

Непонятна работа DI_FIXEDIT

Posted: Mon 03 Jul, 2017 04:32
by Dec
Имею маску (###) #99-99-99, начальное значение (012) 345-67-89, но в поле ввода появляется (012) 34-56-78. Так и задумано, или я чего то не понимаю?

Непонятна работа DI_FIXEDIT

Posted: Mon 03 Jul, 2017 06:49
by Alexey Samlyukov
а ширина поля задана правильно?

Непонятна работа DI_FIXEDIT

Posted: Mon 03 Jul, 2017 07:02
by Dec
Если идет речь о поле MaxLength, то при значениях 0/15/100 результат один.

Непонятна работа DI_FIXEDIT

Posted: Mon 03 Jul, 2017 13:08
by Shmuel
Dec, это нормальное поведение, так как # в маске матчит пробел в вашем начальном значении.

Непонятна работа DI_FIXEDIT

Posted: Mon 03 Jul, 2017 23:16
by Dec
Shmuel, не понял объяснения. Мне не понятно, почему (012) 345-67-89 является корректной выходной строкой для маски (###) #99-99-99, но по какой то причине НЕ является корректной входной строкой. Т.е. если я решил сохранить ввод пользователя и при следующем показе диалога подставляю сохраненное значение, то пользователь получает не то, что он вводил до этого.

Давайте сравним посимвольно:

(###) #99-99-99
(012) 345-67-89

После закрывающей скобки в маске и строке пробелы - совпадает. Следующий символ в маске - #, а в строке - 3, также совпадает, поскольку # "позволяет вводить в данную позицию строки ввода цифры, пробел и знак минуса". Последующие символы также совпадают. Поясните, где у меня логическая ошибка?

Непонятна работа DI_FIXEDIT

Posted: Tue 04 Jul, 2017 06:29
by Shmuel
Dec wrote: Mon 03 Jul, 2017 23:16После закрывающей скобки в маске и строке пробелы - совпадает.
Алгоритм устроен не так. Символы в строке маски, не являющиеся "особыми", не сопоставляются с символами входной строки, они являются просто "обрамлением" для действительной информации в выходной строке. Пробел в маске не сопоставляется с пробелом во входной строке, он просто вставляется в выходную. Следующий символ маски # сопоставляется с пробелом во входной строке, вставляя и его.

Я не утверждаю, что существующий алгоритм - единственно правильный и т.п. Но так он работает. Во избежание недоразумений - это не я его писал. Смотрите его реализацию в функции Edit::SetString (файл edit.cpp).

Непонятна работа DI_FIXEDIT

Posted: Tue 04 Jul, 2017 09:06
by Dec
Сейчас все понял, спасибо. Я бы сказал, что было выбрано весьма своеобразное решение.