AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.05.2010, 23:21   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Ax 3. Определить в какой колонке на форме стою
Есть форма, в ней grid, в ней табличная часть с колонками Dimension.

Что хочу: встать в grid на строку, нажать кнопку и в методе clicked определить не только строку, где была при нажатии кнопки, но и номер Dim, где стояла.
Старый 16.05.2010, 02:10   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Можно попробовать через метод
X++:
selectedControl()
формы
Старый 16.05.2010, 23:35   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Можно попробовать через метод
X++:
selectedControl()
формы
А разве при описанном сценарии выделенным контролом формы будет не сама кнопка? Может быть есть selectedControl() грида или его аналог?
Старый 17.05.2010, 14:23   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Любопытная задачка. Решить, наверное, можно примерно так:

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());
}
Оператор infolog.writeCustomStatlineItem(...) как бы имитирует сохранение имени, "сохраняя" его в "Поле настраиваемой подсказки"( Как вывести строку в StatusBar?). Перед выполнением необходимо включить вывод в это "поле" в Сервис \ Параметры \ Строка состояния \ флажок "Поле настраиваемой подсказки".

Прописав такой оператор в 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  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Еще немного подумав, обнаружил, что собственно метод element.selectedControl() нам не особо и нужен, и для того, чтобы конкретный контрол сам докладывал о себе, вполне достаточно и просто его this.name():
X++:
public void enter()
{
    super();

    infolog.writeCustomStatlineItem( this.name() );
}
И по поводу "напрягаться с прописыванием" тоже не всё так печально. Просто напомню, что достаточно прописать методы enter() и mouseEnter() у первого контрола грида (на рисунке - RAssetTable_AssetMainGroupId), выделить их в AOT с Shift или Ctrl и затем, удерживая ЛКМ, последовательно поперетаксивать это выделение в узлы Methods других контролов грида:

Название: WhereAmI1.JPG
Просмотров: 1005

Размер: 36.8 Кб

Т.е. несколько взмахов мышкой - и методы растиражированы.

Также можно скопом удалить методы, предварительно натыкав их мышкой с Ctrl:

Название: WhereAmI2.JPG
Просмотров: 993

Размер: 33.3 Кб
За это сообщение автора поблагодарили: Sergikrus (1).
Старый 19.05.2010, 11:04   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А как быть если захочется использовать AutoDataGroup? Неужели нет готового свойства? Ведь грид явно где-то хранит свой активный контрол
Старый 19.05.2010, 11:04   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Gustav Посмотреть сообщение
Т.е. несколько взмахов мышкой - и методы растиражированы.
Что-то сложно...
А чем не устраивает метод формы selectControl?

X++:
public boolean selectControl(FormControl _control)
{
    boolean ret;

    ret = super(_control);

    print element.selectedControl().name();

    return ret;
}
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Gustav (5).
Старый 19.05.2010, 11:33   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от mazzy Посмотреть сообщение
А чем не устраивает метод формы selectControl?
пожалуй, вот этим:
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А разве при описанном сценарии выделенным контролом формы будет не сама кнопка?
т.е. в момент щелканья по кнопке мы теряем предыдущий контрол, который нам и нужен.

Но с другой (положительной) стороны selectControl - это только ОДНО место, а не [колво колонок грида x 2]. И в этом одном месте можно вполне контролировать имена колонок грида и что-то с ними делать. В любом случае, спасибо за напоминание об этом методе. Это хороший позитив.
Старый 19.05.2010, 11:41   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Gustav Посмотреть сообщение
т.е. в момент щелканья по кнопке мы теряем предыдущий контрол, который нам и нужен.
Почему теряем?
Сделай print ДО super.
Другими словами, получи имя контрола до того, как ядро отработало смену контрола. Разве нет?
Единственно, нужно будет проверять неопределенный контрол в самом начале при инициализации формы.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Gustav (5).
Старый 19.05.2010, 12:04   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от mazzy Посмотреть сообщение
Сделай print ДО super.
Другими словами, получи имя контрола до того, как ядро отработало смену контрола.
Ох, mazzy, ты сегодня просто ацкий терапевт!
Ну, конечно же! Спасибо еще раз! Всё изящно встает на свои места.
Старый 19.05.2010, 15:13   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А как быть если захочется использовать AutoDataGroup?
Вроде, в группе полей при 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Проверил в AX4 в методе mouseDown() кнопки element.selectedControl() всё ещё возвращает предыдущий элемент управления. Причём и до super() и после.
К большому сожалению, в AX2009 это уже не так
Старый 26.05.2010, 15:19   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
сесть на таймер и запоминать, какой же control selected
Старый 03.07.2014, 10:58   #14  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от mazzy Посмотреть сообщение
Что-то сложно...
А чем не устраивает метод формы selectControl?

X++:
public boolean selectControl(FormControl _control)
{
    boolean ret;

    ret = super(_control);

    print element.selectedControl().name();

    return ret;
}
Пробую как вы написали, после закрытия формы пишет ошибка времени выполнения: объект не инициализирован. Подскажите пожалуйста почему ?
Старый 03.07.2014, 11:47   #15  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Но сделав проверку как советуют выше - if (element.selectedControl()), ошибка перестает появляться
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: WCF: The Enterprise Service Bus for Dynamics AX and the rest of the Microsoft Stack Blog bot DAX Blogs 0 10.03.2009 16:05
Как AX определяет, какой профиль безопасности использовать? Razbezhkin DAX: Администрирование 1 23.10.2007 13:02
Inside Dynamics AX 4.0: Usage Scenarios Blog bot DAX Blogs 0 04.10.2007 05:15
Inside Dynamics AX 4.0: Inside the Business Connector Blog bot DAX Blogs 0 04.10.2007 05:15
какой метод выполняется на форме... lev DAX: Программирование 8 02.10.2007 16:29

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:32.