AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.11.2013, 11:47   #1  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
Автодополнение в FormDateControl
Здравствуйте, коллеги.

При вводе даты в FormDateControl в некоторых случаях происходит автодополнение. Например, если ввести только число даты, подставится дата с этим числом месяца текущей системной даты (22 -> 22.11.2013). Есть ли способ как-то переопределить это поведение? Очень хочется в некоторых формочках вводить таким образом дату из прошлого месяца, не меняя при этом системную дату.
Старый 22.11.2013, 12:08   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Ввести 2210
Старый 22.11.2013, 12:16   #3  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
Цитата:
Сообщение от Player1 Посмотреть сообщение
Ввести 2210
Это же два лишних телодвижения
Старый 22.11.2013, 12:29   #4  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от McArrow Посмотреть сообщение
...Очень хочется в некоторых формочках...
Т.е. вы готовы перекрывать ну скажем modified() на контролах всех этих форм?
Старый 22.11.2013, 12:49   #5  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
Да их всего одна штука пока. Можно извратиться и написать в textChanged() свою реализацию автодополнения (больше вроде как нигде оригинальный текст, введённый пользователем в контрол, не виден). Только есть подозрение, что потом эту фичу будут просить на других формочках, к чему я пока морально не готов.
Старый 22.11.2013, 13:03   #6  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Цепочка вызовов вроде как
\Classes\FormRun\selectControl
\Classes\FormDateControl\leave
класс FormDateControl системный(

Если все контролы с датами на базе EDT TransDate, то вроде как можно допилить форму SysDateLookUp чтобы по-умолчанию открывался предыдущий месяц, но придется работать мышкой, в вашем случае это видимо еще более энергозатратно =)

PS: введите вместо даты какой-нибудь символ, типа "< > . ," - будет системная подсказка
Старый 22.11.2013, 13:09   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если пользователь всегда вводит только день без месяца и года, то может быть вместо даты запрашивать у пользователя число? Можно например в виде перечисления из 31-го элемента.

Если это не всегда только число, то можно реализовать свой календарик-лукап, который будет по умолчанию открываться на нужном месяце. Или вообще лукап не в виде календарика, а в другой более удобной форме.

Но мне кажется что использовать стандартный лукап не на много сложнее. Неужели пользователю так сложно щёлкнуть на предыдущий месяц? Или принципиален именно ввод с клавиатуры без мышки?
Старый 22.11.2013, 13:35   #8  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
Пользователи этой формочки в идеальной ситуации вообще не трогают мышь. Думаю сделать волшебный edit-метод, в который пользователь будет писать число, которое будет затем преобразовываться в дату в соответствии с необходимой логикой.
Старый 22.11.2013, 14:08   #9  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 108 (4) +++++
Регистрация: 06.03.2012
Адрес: Moscow/Ukraine/Malta
Цитата:
Сообщение от Player1 Посмотреть сообщение
Цепочка вызовов вроде как
\Classes\FormRun\selectControl
\Classes\FormDateControl\leave
класс FormDateControl системный(

Если все контролы с датами на базе EDT TransDate, то вроде как можно допилить форму SysDateLookUp чтобы по-умолчанию открывался предыдущий месяц, но придется работать мышкой, в вашем случае это видимо еще более энергозатратно =)

PS: введите вместо даты какой-нибудь символ, типа "< > . ," - будет системная подсказка
А еще лучше свой лукап написать, и делать внутри что душе угодно
Старый 22.11.2013, 15:43   #10  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
Цитата:
Сообщение от iCloud Посмотреть сообщение
А еще лучше свой лукап написать, и делать внутри что душе угодно
Заказчик не хочет по этой формочке мышкой возить Хотя можно сделать лукап, который в момент инициализации будет анализировать текст в контроле и в случае соответствия его некоторому правилу не будет открываться вообще, а будет сразу возвращать нужный текст. А лукап вызывать с клавиатуры по хоткею или звёздочкой.
Старый 22.11.2013, 16:02   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если речь об одной конкретной форме, то можно допилить ее - см. метод FormRun.setAutoCompleteString(). Я вот попробовал на тестовой форме сделать вот что (здесь DateEdit - название контрола на форме с AutoDeclaration=Yes):
X++:
public void init()
{
    super();
    element.setAutoCompleteString('22.10.2013', DateEdit);
}
Открываю форму, нажимаю 22 - вылезает строка с указанной датой за предыдущий месяц, и не надо никакие lookup'ы перекрывать.
Название: dateedit-autocomplete.png
Просмотров: 808

Размер: 1.1 Кб
За это сообщение автора поблагодарили: S.Kuskov (1), McArrow (1), iCloud (1).
Старый 22.11.2013, 17:28   #12  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
C 22 у меня тоже работает, а вот с 23, например, - нет.

Зато, если сделать вот так, то работает почти как хотелось:
X++:
void init()
{
    TransDate transDate;
;
    super();
    for (transDate = 01\10\2013; transDate <= 31\10\2013; transDate ++)
    {
        element.setAutoCompleteString(date2str(transDate,-1,-1,-1,-1,-1,-1), DateEdit);
    }
}
Почти, так как буфер автокомплита (у меня, по крайней мере) вмещает 29 элементов (на 1 и 2 число не хватает). Таким образом в октябре работать не будет, зато будет замечательно работать в феврале.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 22.11.2013, 18:15   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от McArrow Посмотреть сообщение
C 22 у меня тоже работает, а вот с 23, например, - нет. Зато, если сделать вот так, то работает почти как хотелось: for (transDate = 01\10\2013; transDate <= 31\10\2013; transDate ++) ...
Ну как бы... да я просто не стал "разжевывать", что надо забить строки для всего месяца
Старый 22.11.2013, 19:17   #14  
McArrow is offline
McArrow
Участник
 
45 / 38 (2) +++
Регистрация: 18.05.2009
Победил.
X++:
public void textChange()
{
    str text = WInAPI::getWindowText(this.hWnd());
    int day;
;
    if (strlen(text) == 2)
    {
        day = str2int(text);
        if (day > 0 && day <= 31)
        {
            element.setAutoCompleteString(strfmt('%1.10.2013', text), this);
        }
    }
    super();
}
Хардмод: вводить даты с 01.10.2013 по 09.10.2013 одной цифрой (1 а не 01, например).
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:57.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.