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()), ошибка перестает появляться
|
|
|
|