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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.05.2014, 10:02   #1  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Идея проверять на parent правда интересна.

Однако методов
X++:
_control.parentControl()
X++:
_control.fieldBinding()
для FormControl я в 2009й не нахожу.

Может это решение применимо для 2012й?
Старый 30.05.2014, 19:32   #2  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Идея проверять на parent правда интересна.

Однако методов
X++:
_control.parentControl()
для FormControl я в 2009й не нахожу.
X++:
_control.isContainer()
может подойти
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 30.05.2014, 12:29   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
_control.parentControl() можно реализовать при помощи _control.containerid() или _control.owner()
а _control.fieldBinding().fieldId() через _control.dataField()

Последний раз редактировалось S.Kuskov; 30.05.2014 в 12:34.
За это сообщение автора поблагодарили: Cardagant (1).
Старый 18.06.2014, 11:36   #4  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
_control.parentControl() можно реализовать при помощи _control.containerid() или _control.owner()
а _control.fieldBinding().fieldId() через _control.dataField()
Пытался сделать через _control.dataField()
В итоге получал ошибку: Класс FormControl не содержит эту функцию.
Какая есть альтернатива ?

Метод selectControl вызывается до открытия формы. Как он определит какой контрол выделен ?

Последний раз редактировалось userax2009; 18.06.2014 в 12:28.
Старый 19.06.2014, 09:00   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от userax2009 Посмотреть сообщение
Пытался сделать через _control.dataField()
В итоге получал ошибку: Класс FormControl не содержит эту функцию.
Какая есть альтернатива ?
Не все контролы на форме, которые могут получить фокус, могут быть связаны с источником данных. Добавьте проверку на существование метода dataField.
Старый 19.06.2014, 10:18   #6  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Не все контролы на форме, которые могут получить фокус, могут быть связаны с источником данных. Добавьте проверку на существование метода dataField.
Вариант реализации того, что предложил S.Kuskov:
X++:
SysDictClass sysDictClass;
boolean      methodExist;
    
// true
FormControl  formControl = new FormStringControl();
// false
// FormControl  formControl = new FormGroupControl();
;
    
sysDictClass = new SysDictClass(classidget(formControl));

methodExist = sysDictClass.hasObjectMethod(identifierstr(DataField));

info(strfmt('%1', methodExist));
За это сообщение автора поблагодарили: userax2009 (1).
Старый 25.06.2014, 16:10   #7  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Не все контролы на форме, которые могут получить фокус, могут быть связаны с источником данных. Добавьте проверку на существование метода dataField.
Когда я пишу _control.dataField() пишет ошибку, но если я пишу конкретно название моего контрола(StatusGroupLine.dataField()), то могу получить его Id. Так же с функцией fieldName2Id, если задавать второй параметр конкретным названием контрола, то функция отрабатывает.
Мне же надо что бы по нажатию на любое поле я могу получить его Id.
Есть еще какие то варианты ? Возможно я не правильно понял, поэтому у меня не работает.

Последний раз редактировалось userax2009; 25.06.2014 в 17:07.
Старый 25.06.2014, 16:46   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от userax2009 Посмотреть сообщение
Когда я пишу _control.dataField() пишет ошибку, но если я пишу конкретно название моего контрола(StatusGroupLine_ZTR.dataField()), то могу получить его Id.
если _control.dataField() возвращает ошибку ,значит в этот момент переменная _control указывает не на StatusGroupLine_ZTR, а на какой-то другой контрол (например такой как ButtonControl). Попробуете посмотреть имя контрола _control.name() чтобы убедиться.
За это сообщение автора поблагодарили: userax2009 (1).
Старый 30.05.2014, 14:38   #9  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Проблема получения информации о текущем выбранном поле решалась в утилите FormDigger.

Где же это поле?! (Form digger)

Я бы попробовал усовершенствовать эту утилиту и прикрутить историю изменения данных туда. И выложил бы полученный результат на форуме. А то неудобно через паспорт записи все время в журнал базы данных лазить и искать там нужное поле. Но у меня нет мотивации. А вы как раз решаете такую задачу.

PS. Человек, написавший эту утилиту, внес вклад в усовершенствование Аксапты сравнимый с вкладом, который внес Бетховен в развитие музыки! Сугубо мое личное мнение Просто я каждый день пользуюсь этой утилитой и слушаю Бетховена.
Старый 30.05.2014, 15:18   #10  
michel1971 is offline
michel1971
Участник
 
79 / 80 (3) ++++
Регистрация: 14.01.2011
На мой взгляд топикстартекр решил изобрести велосипед, а мы решили закидать его идеями как можно это сделать.
А сделать это можно многими способами, если только не привязываться к идее сделать это по кнопке.
Кто-нибудь видел кнопку которая, скажем, эмулирует нажатие Ctrl+K (Поиск по полю)? Ее нет!
И я не совсем понял, эту кнопку которая будет вызывать "велосипед" ее на каждой форме рисовать?
Добавить в контектсное меню формы (не контрола) свой пункт меню пока, как я понял, никому не удалось.
Кстати пока экспериментировал, обратил внимание на метод \Forms\SysFormSearch\Methods\field - это именно то что нужно, вообще без выкрутасов. Вызывается ядром из метода task с формы, откуда вызвали поиск.
Создайте такой метод на Вашей форме, а в \Classes\SysSetupFormRun\task определите сочетание клавиш по которым она будет вызываться. И работать будет на всех формах.
Старый 30.05.2014, 16:18   #11  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
в FormDigger эта задача элегантно решается вставкой всего одной строки кода в класс SysSetupFormRun. То есть стандартное приложение модифицируется минимально.
В методе task() просто не вызывается super(), если нажата сокровенная комбинация клавиш.
X++:
   //EVO: 31.01.09 #DEV02 Find from control by name -->
    if (!FormDigger::overloadButton(this, _taskId))
    //EVO: 31.01.09 #DEV02 Find from control by name <--
    ret = super(_taskId);
А метод, вызывающий свою форму такой (открывает свою форму по клавишам ALT+тильда):
X++:
static boolean overloadButton(FormRun _formRun, int _taskId)
{
    #define.VK_OEM_3(0xC0)// ~
    #define.VK_OEM_F12(123)
    #Task
    boolean   ret = true;
    Object      obj;
    int         i;
    ;

    if (_taskId != #taskAlt)
        return false;

    switch (true)
    {
        case FormDigger::getAsyncKeyState(#VK_OEM_3) > 1:
            ret = FormDigger::newForm(_formRun);
            break;
        case FormDigger::getAsyncKeyState(#VK_OEM_F12) > 1:
            if (formHasMethod(_formRun, identifierStr(altF12)))
            {
                obj = _formRun;
                obj.altF12();
                ret = true;
            }
            break;
        default:
            ret = false;
    }

    return ret;
}
Старый 30.05.2014, 16:25   #12  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Анализируя FormDigger, понимаем, как дойти до выбранного поля в форме, на которой нажали комбинацию клавиш. В element.args().caller находится ссылка на исходную форму

X++:
void selectCurrent()
{
    FormControl         currentControl;
    ;

    currentControl = element.args().caller().selectedControl();

    if (element.args())
    {
        element.args().lookupField(fieldnum(FormDiggerTmpData, id));
        element.args().lookupValue(int2str(currentControl.id()));
    }
}
Старый 08.07.2014, 11:34   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
Старый 08.07.2014, 17:41   #14  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
вроде бы понятно:
if (element.selectedControl() /*&& тут наверное должна еще идти проверка на тип выбранного контрола, как ее реализовать пока что не придумал */)
{
s = element.selectedControl().name(); // имя активного контрола
i = element.selectedControl().id();
}
Старый 09.07.2014, 08:41   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я говорил не о свойстве selectedControl а о событии selectControl.
Основная же проблема в вашей ситуации какая? У вас вторая форма вызывается при нажатии кнопки. Нажатие кнопки переводит фокус с колонки таблицы на кнопку! В этот момент пользоваться свойством selectedControl уже поздно. Поэтому предлагается внедрить свой код в событие активации каждого контрола - selectControl, но запоминать там только нужные вам контролы (или не только последний).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Поле в гриде не из датасорса Katuxa DAX: Программирование 9 01.03.2013 16:24
Закрыто поле на таблице kaw DAX: Программирование 2 15.03.2012 10:55
Пробелы теряются в текстовом поле erudit DAX: Программирование 20 07.04.2011 17:47
сопоставление оплат клиента, переносов сальдо-поле накладная в общем журнале? Aquarius DAX: Функционал 3 28.01.2009 12:51
Поле "Оплатить до" в строке общего журнала longson DAX: Функционал 7 29.03.2008 14:38

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

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

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