|
![]() |
#1 |
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). |
![]() |
#2 |
Moderator
|
Еще немного подумав, обнаружил, что собственно метод element.selectedControl() нам не особо и нужен, и для того, чтобы конкретный контрол сам докладывал о себе, вполне достаточно и просто его this.name():
X++: public void enter() { super(); infolog.writeCustomStatlineItem( this.name() ); } Т.е. несколько взмахов мышкой - и методы растиражированы. Также можно скопом удалить методы, предварительно натыкав их мышкой с Ctrl: |
|
|
За это сообщение автора поблагодарили: Sergikrus (1). |
![]() |
#3 |
Участник
|
Что-то сложно...
А чем не устраивает метод формы selectControl? X++: public boolean selectControl(FormControl _control) { boolean ret; ret = super(_control); print element.selectedControl().name(); return ret; } |
|
|
За это сообщение автора поблагодарили: Gustav (5). |
![]() |
#4 |
Moderator
|
пожалуй, вот этим:
Цитата:
Но с другой (положительной) стороны selectControl - это только ОДНО место, а не [колво колонок грида x 2]. И в этом одном месте можно вполне контролировать имена колонок грида и что-то с ними делать. В любом случае, спасибо за напоминание об этом методе. Это хороший позитив. |
|
![]() |
#5 |
Участник
|
Цитата:
Сделай print ДО super. Другими словами, получи имя контрола до того, как ядро отработало смену контрола. Разве нет? Единственно, нужно будет проверять неопределенный контрол в самом начале при инициализации формы. |
|
|
За это сообщение автора поблагодарили: Gustav (5). |
![]() |
#6 |
Moderator
|
|
|
![]() |
#7 |
Участник
|
Пробую как вы написали, после закрытия формы пишет ошибка времени выполнения: объект не инициализирован. Подскажите пожалуйста почему ?
|
|
![]() |
#8 |
Участник
|
Но сделав проверку как советуют выше - if (element.selectedControl()), ошибка перестает появляться
|
|
|
|