|  15.05.2010, 23:21 | #1 | 
| Участник | Ax 3. Определить в какой колонке на форме стою 
			
			Есть форма, в ней  grid, в ней табличная часть с колонками Dimension. Что хочу: встать в grid на строку, нажать кнопку и в методе clicked определить не только строку, где была при нажатии кнопки, но и номер Dim, где стояла. | 
|  | 
|  16.05.2010, 02:10 | #2 | 
| Участник | 
			
			Можно попробовать через метод  X++: selectedControl() | 
|  | 
|  16.05.2010, 23:35 | #3 | 
| Участник | |
|  | 
|  17.05.2010, 14:23 | #4 | 
| Moderator | 
			
			Любопытная задачка. Решить, наверное, можно примерно так: 1. В ClassDeclaration формы объявляем переменную типа str и будем хранить в ней имя последнего активного контрола грида (lastGridActiveControlName) 2. В эту переменную будем писать из некоторых событий всех контролов, соответствующих колонкам грида. 3. В процедуре clicked кнопки будем считывать значение lastGridActiveControlName. Подробнее о шаге 2. Событий предлагается два: enter() и mouseEnter(). Оператор сохранения lastGridActiveControlName = element.selectedControl().name(); в методах событий вставляем после super(). Итого надо будет прописать это присваивание в [кол-во колонок грида х 2] мест. Я потестировался на гриде формы "Основные средства" (RAssetTable) при помощи такого фрагмента, вставляемого после super() - например, для контрола Name: X++: public void enter() { super(); if (element.selectedControl()) infolog.writeCustomStatlineItem(element.selectedControl().name()); } Прописав такой оператор в enter() и mouseEnter() всех колонок грида, можно потом щелкать по различным колонкам и наблюдать как меняется значение в "Поле настраиваемой подсказки". Имеется осложнение в виде ComboBox'а на enum'е (колонка "Статус"). Имя этого контрола возникает в "Поле настраиваемой подсказки" только при входе в него по клавише Tab из соседнего контрола слева (или по Shift+Tab справа). Произвольный первый клик мышью на "Статусе" не срабатывает. Срабатывает только второй, когда раскрывается выпадающий список. Но если в гриде нет ComboBox'ов, либо события от них в конкретном случае не интересны и легко игнорируемы, то всё остальное вполне прилично отрабатывает. Правда, придется немножко понапрягаться с прописыванием в события. P.S. Кстати говоря, системная подсказка в StatusBar'е, которая внизу слева, ведет себя абсолютно так же, как наша. Кликнем вначале колонку "Инв.номер ОС" - получаем подчказку "Основное средство" внизу слева и наше "AssetNum" внизу справа. Далее один раз кликаем "Статус" - ничего не меняется. И только второй клик (в той же ячейке грида!) отображает "Статус основного средства" слева и "AssetTable_Status" справа. Так что с ComboBox'ом - это общая клиническая картина. Последний раз редактировалось Gustav; 17.05.2010 в 14:51. | 
|  | |
| За это сообщение автора поблагодарили: alex55 (1). | |
|  19.05.2010, 10:46 | #5 | 
| Moderator | 
			
			Еще немного подумав, обнаружил, что собственно метод element.selectedControl() нам не особо и нужен, и для того, чтобы конкретный контрол сам докладывал о себе, вполне достаточно и просто его this.name(): X++: public void enter() { super(); infolog.writeCustomStatlineItem( this.name() ); } Т.е. несколько взмахов мышкой - и методы растиражированы. Также можно скопом удалить методы, предварительно натыкав их мышкой с Ctrl: | 
|  | |
| За это сообщение автора поблагодарили: Sergikrus (1). | |
|  19.05.2010, 11:04 | #6 | 
| Участник | 
			
			А как быть если захочется использовать AutoDataGroup? Неужели нет готового свойства? Ведь грид явно где-то хранит свой активный контрол
		 | 
|  | 
|  19.05.2010, 11:04 | #7 | 
| Участник | 
			
			Что-то сложно... А чем не устраивает метод формы selectControl? X++: public boolean selectControl(FormControl _control) { boolean ret; ret = super(_control); print element.selectedControl().name(); return ret; } | 
|  | |
| За это сообщение автора поблагодарили: Gustav (5). | |
|  19.05.2010, 11:33 | #8 | 
| Moderator | 
			
			пожалуй, вот этим:  Цитата: Но с другой (положительной) стороны selectControl - это только ОДНО место, а не [колво колонок грида x 2]. И в этом одном месте можно вполне контролировать имена колонок грида и что-то с ними делать. В любом случае, спасибо за напоминание об этом методе. Это хороший позитив. | 
|  | 
|  19.05.2010, 11:41 | #9 | 
| Участник | Цитата: Сделай print ДО super. Другими словами, получи имя контрола до того, как ядро отработало смену контрола. Разве нет? Единственно, нужно будет проверять неопределенный контрол в самом начале при инициализации формы. | 
|  | |
| За это сообщение автора поблагодарили: Gustav (5). | |
|  19.05.2010, 12:04 | #10 | 
| Moderator | |
|  | 
|  19.05.2010, 15:13 | #11 | 
| Moderator | 
			
			Вроде, в группе полей при AutoDataGroup = Yes нормально опознаются отдельные контролы при использовании selectControl.   Также при AutoDataGroup = Yes можно добавлять свои методы независимо в любой контрол группы, и они сохраняются, но, увы, не работают. Они заработают, если установить AutoDataGroup = No. НО! Если затем группе вернуть AutoDataGroup = Yes, то эти методы отдельных контролов исчезнут! Рекомендую желающим поиграться с какой-нибудь сложной формой, содержащей вкладки, грид, вкладки внутри вкладки при помощи такого метода формы: X++: public boolean selectControl(FormControl _control) { boolean ret; if (element.selectedControl()) info(strFmt('before super: %1', element.selectedControl().name())); ret = super(_control); // SUPER! SUPER! SUPER! :) if (element.selectedControl()) info(strFmt('AFTER SUPER: %1', element.selectedControl().name())); return ret; } | 
|  | 
|  26.05.2010, 14:26 | #12 | 
| Участник | 
			
			Проверил в AX4 в методе mouseDown() кнопки element.selectedControl() всё ещё возвращает предыдущий элемент управления. Причём и до super() и после. К большому сожалению, в AX2009 это уже не так   | 
|  | 
|  26.05.2010, 15:19 | #13 | 
| Участник | 
			
			сесть на таймер и запоминать, какой же control selected
		 | 
|  | 
|  03.07.2014, 10:58 | #14 | 
| Участник | 
			
			Пробую как вы написали, после закрытия формы пишет ошибка времени выполнения: объект не инициализирован. Подскажите пожалуйста почему ?
		 | 
|  | 
|  03.07.2014, 11:47 | #15 | 
| Участник | 
			
			Но сделав проверку как советуют выше - if (element.selectedControl()), ошибка перестает появляться
		 | 
|  | 
|  | 
| 
 |