22.11.2013, 11:47 | #1 |
Участник
|
Автодополнение в FormDateControl
Здравствуйте, коллеги.
При вводе даты в FormDateControl в некоторых случаях происходит автодополнение. Например, если ввести только число даты, подставится дата с этим числом месяца текущей системной даты (22 -> 22.11.2013). Есть ли способ как-то переопределить это поведение? Очень хочется в некоторых формочках вводить таким образом дату из прошлого месяца, не меняя при этом системную дату. |
|
22.11.2013, 12:08 | #2 |
Участник
|
Ввести 2210
|
|
22.11.2013, 12:16 | #3 |
Участник
|
|
|
22.11.2013, 12:29 | #4 |
Участник
|
|
|
22.11.2013, 12:49 | #5 |
Участник
|
Да их всего одна штука пока. Можно извратиться и написать в textChanged() свою реализацию автодополнения (больше вроде как нигде оригинальный текст, введённый пользователем в контрол, не виден). Только есть подозрение, что потом эту фичу будут просить на других формочках, к чему я пока морально не готов.
|
|
22.11.2013, 13:03 | #6 |
Участник
|
Цепочка вызовов вроде как
\Classes\FormRun\selectControl \Classes\FormDateControl\leave класс FormDateControl системный( Если все контролы с датами на базе EDT TransDate, то вроде как можно допилить форму SysDateLookUp чтобы по-умолчанию открывался предыдущий месяц, но придется работать мышкой, в вашем случае это видимо еще более энергозатратно =) PS: введите вместо даты какой-нибудь символ, типа "< > . ," - будет системная подсказка |
|
22.11.2013, 13:09 | #7 |
Участник
|
Если пользователь всегда вводит только день без месяца и года, то может быть вместо даты запрашивать у пользователя число? Можно например в виде перечисления из 31-го элемента.
Если это не всегда только число, то можно реализовать свой календарик-лукап, который будет по умолчанию открываться на нужном месяце. Или вообще лукап не в виде календарика, а в другой более удобной форме. Но мне кажется что использовать стандартный лукап не на много сложнее. Неужели пользователю так сложно щёлкнуть на предыдущий месяц? Или принципиален именно ввод с клавиатуры без мышки? |
|
22.11.2013, 13:35 | #8 |
Участник
|
Пользователи этой формочки в идеальной ситуации вообще не трогают мышь. Думаю сделать волшебный edit-метод, в который пользователь будет писать число, которое будет затем преобразовываться в дату в соответствии с необходимой логикой.
|
|
22.11.2013, 14:08 | #9 |
Enjoy!
|
Цитата:
Сообщение от Player1
Цепочка вызовов вроде как
\Classes\FormRun\selectControl \Classes\FormDateControl\leave класс FormDateControl системный( Если все контролы с датами на базе EDT TransDate, то вроде как можно допилить форму SysDateLookUp чтобы по-умолчанию открывался предыдущий месяц, но придется работать мышкой, в вашем случае это видимо еще более энергозатратно =) PS: введите вместо даты какой-нибудь символ, типа "< > . ," - будет системная подсказка |
|
22.11.2013, 15:43 | #10 |
Участник
|
Заказчик не хочет по этой формочке мышкой возить Хотя можно сделать лукап, который в момент инициализации будет анализировать текст в контроле и в случае соответствия его некоторому правилу не будет открываться вообще, а будет сразу возвращать нужный текст. А лукап вызывать с клавиатуры по хоткею или звёздочкой.
|
|
22.11.2013, 16:02 | #11 |
Участник
|
Если речь об одной конкретной форме, то можно допилить ее - см. метод FormRun.setAutoCompleteString(). Я вот попробовал на тестовой форме сделать вот что (здесь DateEdit - название контрола на форме с AutoDeclaration=Yes):
X++: public void init() { super(); element.setAutoCompleteString('22.10.2013', DateEdit); } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1), McArrow (1), iCloud (1). |
22.11.2013, 17:28 | #12 |
Участник
|
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); } } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
22.11.2013, 18:15 | #13 |
Участник
|
Ну как бы... да я просто не стал "разжевывать", что надо забить строки для всего месяца
|
|
22.11.2013, 19:17 | #14 |
Участник
|
Победил.
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(); } |
|