16.05.2014, 10:42 | #1 |
Участник
|
Выбранное поле
Подскажите пожалуйста. Нахожусь на форме, выбираю какое-то поле в гриде. Как определить, на каком поле находится мой курсор, то есть какую ячейку я выбрал на форме ? Axapta 2009
|
|
16.05.2014, 10:48 | #2 |
Участник
|
Правая кнопка мыши, пункт меню: настройка.
Это интересует? |
|
16.05.2014, 10:58 | #3 |
Участник
|
Нет. Есть форма А с кнопкой, по нажатию которой открывается форма Б с данными для поля на форме А. Подумал, для того, чтобы корректно отображать данные в форме Б, необходимо определить на каком поле в данный момент находиться курсор. Соответственно вопрос, как определить где в данный момент мой курсор ?
|
|
16.05.2014, 11:01 | #4 |
северный Будда
|
А можно поподробнее задачу описать?
Из вашего текста совершенно непонятно, зачем надо подхватывать именно активное поле, а не активную строку
__________________
С уважением, Вячеслав |
|
16.05.2014, 11:02 | #5 |
Участник
|
Нужно знать конкретное поле с точностью до столбца или строки будет достаточно?
|
|
16.05.2014, 11:02 | #6 |
Участник
|
форма Б, которая открывается по кнопке, должна показывать историю изменения для выбранного поля на форме А
|
|
16.05.2014, 14:16 | #8 |
Участник
|
Цитата:
X++: client static container getCallerControlProperty(Args args, container _propertyCon) { container res; Object callerControl; FormRun caller; SysDictClass dictClass; ContainerEnumerator ce; IdentifierName methodName; #Properties ; if (args && args.caller()) { if (SysDictClass::isEqualOrSuperclass(args.caller().handle(), classnum(FormRun))) { caller = args.caller(); callerControl = caller.selectedControl(); dictClass = new SysDictClass(classidget(callerControl)); ce = new ContainerEnumerator(_propertyCon); while (ce.moveNext()) { methodName = ce.current(); if (dictClass.hasObjectMethod(methodName)) res += dictClass.callObject(methodName, callerControl); else res += ""; } } } return res; } на вызываемой форме вызовите следующий код: X++: c = getCallerControlProperty(element.args(), [#PropertyDatasource, #PropertyDataField]); |
|
16.05.2014, 18:54 | #9 |
северный Будда
|
Цитата:
Такого рода кунштюки обычно нужны для разборок типа "кто накосячил". Если в каком-то поле кто-то регулярно косячит с данными, то это говорит о наличии трёх возможных проблем: 1) кривое разграничение прав доступа (не те люди имеют разрешение на правку) 2) ошибка программирования (не сделаны нужные проверки для ввода данных в поле) 3) ошибочная реализация бизнес-процессов (данные вводят не те, кто должен это делать) вот с этим и надо разобраться в первую очередь.
__________________
С уважением, Вячеслав |
|
16.05.2014, 21:53 | #10 |
Участник
|
Коллега слегка неверно разъяснил задачу. Попробую подправить.
Задание состоит в чём: Есть таблица логирования, куда заносятся данные, какое действие с каким полем какой таблицы было сделано. Таблица имеет вид: Код таблицы \ Код поля \ Действия \ Время ... Необходимо открывать форму с датасорсом в виде этой таблицы логирования на любой таблице путём вызова её через контекстное меню. То есть, как я вижу задачу: в init формы ловить args.record() с датасорса, который пришёл и отсеивать ненужные запросом. |
|
19.05.2014, 09:07 | #11 |
Участник
|
Форма SysDatabaseLog Вам в помощь. Хотя из смысла задача не понимаю, чем стандартный журнал базы данных Вас не устроил?
__________________
Айрат Вильданов. skype: vildanov.a |
|
19.05.2014, 11:30 | #12 |
Участник
|
Цитата:
Сообщение от userax2009
Нет. Есть форма А с кнопкой, по нажатию которой открывается форма Б с данными для поля на форме А. Подумал, для того, чтобы корректно отображать данные в форме Б, необходимо определить на каком поле в данный момент находиться курсор. Соответственно вопрос, как определить где в данный момент мой курсор ?
X++: public void gotFocus() { ; super(); curFieldId = this.fieldBinding().fieldId(); } |
|
29.05.2014, 17:54 | #13 |
Участник
|
В общем, получилось сделать вот что:
узнал код таблицы и код записи if ((element.args()) && (element.args().record())) { refTableId = element.args().record().tableId; refRecId = element.args().record().RecId; ... } затем в методе Init моего датасоурса задаю критерии для открываемой(вызываемой) формы if (refRecId) { this.query().dataSourceTable(tablenum(SysDataBaseLog2_ZTR)).addRange(fieldnum(SysDataBaseLog2_ZTR, Table)).value(queryValue(refTableId)); this.query().dataSourceTable(tablenum(SysDataBaseLog2_ZTR)).addRange(fieldnum(SysDataBaseLog2_ZTR, LogRecId)).value(queryValue(refRecId)); this.query().dataSourceTable(tablenum(SysDataBaseLog2_ZTR)).addRange(fieldnum(SysDataBaseLog2_ZTR, Field)).value(queryValue(fieldId)); } Вот, теперь осталось узнать, как считать код поля, на котором находится мой курсор. Есть идеи как это сделать ? |
|
29.05.2014, 18:35 | #14 |
Участник
|
В каком методе ? Если в методе Init, то ни как, курсор еще ни где не находится. Чуть выше я рассказал, как узнать в методе gotFocus поля грида. Может быть в методе active датасорса ?
|
|
29.05.2014, 19:10 | #15 |
Участник
|
Цитата:
Можно запихнуть анализатор сюда : \Classes\SysSetupFormRun\selectControl и запоминать какой контрол активировался и.т.п. А если только для одной формы интересно, то аналогичный метод для конкретной формы. Последний раз редактировалось Logger; 29.05.2014 в 19:13. |
|
|
За это сообщение автора поблагодарили: Мартынов Дмитрий (1), Pustik (2), gl00mie (3). |
29.05.2014, 20:14 | #16 |
Участник
|
думаю не покатит. Человека интересует момент, когда открывается вторая форма, и там он хочет видеть на каком же поле находился курсор, находящийся на первой форме. Метод SelectControl уже позади. Если я не ошибаюсь, то интуиция мне подсказывает, что это сделать вполне реально, надо просто поэкспериментировать. Завтра будет такая возможность.
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
29.05.2014, 20:20 | #17 |
Участник
|
Вот это не заметил, пропустил , Sorry. Тоже вариант. останется только это реализовать.
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
29.05.2014, 21:27 | #18 |
Участник
|
Хорошая мысль. Как то так получается:
X++: public boolean selectControl(FormControl _control) { boolean ret; ; ret = super(_control); if (ret && _control.parentControl().name() == "Grid2") { curFieldId = _control.fieldBinding().fieldId(); } else { curFieldId = 0; } return ret; } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
30.05.2014, 08:30 | #19 |
Участник
|
Проверка на parent - интересное решение. А для решения задачи в общем случае на уровне SysSetupFormRun можно предложить хранить не только самый последний контрол, а последовательный список активных контролов (хранить можно в виде стека - если выбранный контрол уже присутствует в списке, то удалять его из середины списка и добавлять на вершину). Таким образом в любой момент можно будет по такому списку найти последний контрол с нужным парентом.
|
|
30.05.2014, 10:02 | #20 |
Участник
|
Идея проверять на parent правда интересна.
Однако методов X++: _control.parentControl() X++: _control.fieldBinding() Может это решение применимо для 2012й? |
|