|  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й? | 
|  |