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

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
Dec
Posts: 67
Joined: Wed 14 Jul, 2010 08:59
Been thanked: 3 times

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

Post by Dec »

Имею маску (###) #99-99-99, начальное значение (012) 345-67-89, но в поле ввода появляется (012) 34-56-78. Так и задумано, или я чего то не понимаю?
User avatar
Alexey Samlyukov
Posts: 1765
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 7 times
Contact:

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

Post by Alexey Samlyukov »

а ширина поля задана правильно?
Dec
Posts: 67
Joined: Wed 14 Jul, 2010 08:59
Been thanked: 3 times

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

Post by Dec »

Если идет речь о поле MaxLength, то при значениях 0/15/100 результат один.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Dec, это нормальное поведение, так как # в маске матчит пробел в вашем начальном значении.
Dec
Posts: 67
Joined: Wed 14 Jul, 2010 08:59
Been thanked: 3 times

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

Post by Dec »

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

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

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

После закрывающей скобки в маске и строке пробелы - совпадает. Следующий символ в маске - #, а в строке - 3, также совпадает, поскольку # "позволяет вводить в данную позицию строки ввода цифры, пробел и знак минуса". Последующие символы также совпадают. Поясните, где у меня логическая ошибка?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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

Я не утверждаю, что существующий алгоритм - единственно правильный и т.п. Но так он работает. Во избежание недоразумений - это не я его писал. Смотрите его реализацию в функции Edit::SetString (файл edit.cpp).
Last edited by Shmuel on Tue 04 Jul, 2017 06:35, edited 1 time in total.
Dec
Posts: 67
Joined: Wed 14 Jul, 2010 08:59
Been thanked: 3 times

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

Post by Dec »

Сейчас все понял, спасибо. Я бы сказал, что было выбрано весьма своеобразное решение.
Post Reply

Return to “Разработка плагинов”