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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.05.2014, 12:29   #21  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
_control.parentControl() можно реализовать при помощи _control.containerid() или _control.owner()
а _control.fieldBinding().fieldId() через _control.dataField()

Последний раз редактировалось S.Kuskov; 30.05.2014 в 12:34.
За это сообщение автора поблагодарили: Cardagant (1).
Старый 30.05.2014, 14:38   #22  
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   #23  
michel1971 is offline
michel1971
Участник
 
78 / 78 (3) ++++
Регистрация: 14.01.2011
На мой взгляд топикстартекр решил изобрести велосипед, а мы решили закидать его идеями как можно это сделать.
А сделать это можно многими способами, если только не привязываться к идее сделать это по кнопке.
Кто-нибудь видел кнопку которая, скажем, эмулирует нажатие Ctrl+K (Поиск по полю)? Ее нет!
И я не совсем понял, эту кнопку которая будет вызывать "велосипед" ее на каждой форме рисовать?
Добавить в контектсное меню формы (не контрола) свой пункт меню пока, как я понял, никому не удалось.
Кстати пока экспериментировал, обратил внимание на метод \Forms\SysFormSearch\Methods\field - это именно то что нужно, вообще без выкрутасов. Вызывается ядром из метода task с формы, откуда вызвали поиск.
Создайте такой метод на Вашей форме, а в \Classes\SysSetupFormRun\task определите сочетание клавиш по которым она будет вызываться. И работать будет на всех формах.
Старый 30.05.2014, 16:18   #24  
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   #25  
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()));
    }
}
Старый 30.05.2014, 19:32   #26  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Идея проверять на parent правда интересна.

Однако методов
X++:
_control.parentControl()
для FormControl я в 2009й не нахожу.
X++:
_control.isContainer()
может подойти
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 18.06.2014, 11:36   #27  
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   #28  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от userax2009 Посмотреть сообщение
Пытался сделать через _control.dataField()
В итоге получал ошибку: Класс FormControl не содержит эту функцию.
Какая есть альтернатива ?
Не все контролы на форме, которые могут получить фокус, могут быть связаны с источником данных. Добавьте проверку на существование метода dataField.
Старый 19.06.2014, 10:18   #29  
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:04   #30  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от Logger Посмотреть сообщение
Ну почему же ?
Можно запихнуть анализатор сюда :
\Classes\SysSetupFormRun\selectControl

и запоминать какой контрол активировался и.т.п.
А если только для одной формы интересно, то аналогичный метод для конкретной формы.
Обьясните пожалуйста более подробней как это сделать
Старый 25.06.2014, 16:10   #31  
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:43   #32  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от userax2009 Посмотреть сообщение
Обьясните пожалуйста более подробней как это сделать
Например, так

X++:
public boolean selectControl(FormControl _control)
{
    #GRD_sysDataBaseLogFixStack4Button // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011
    boolean ret;
    ;
    // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 -->
//    if (GRD_isPkoz())
    {
        //mes = strFMT("%1 : %2", Element.name(),  _control.name());
        //info::messageWinAddLine(mes);
      //  info::messageWinAddLine( strFMT("%1 : %2 : %3", Element.name(),  _control.name(), ret));
        /*
         info::messageWinAddLine( strFMT("%1 : %2 : %3 : %4",
            this ? this.name() : "",
            _control ? _control.name() : "",
            ret,
            classid2Name(_control ? _control.handle() : 0)
            ));
        */
        if (_control)
        {
            switch (_control.handle())
            {
            case classNum(FormButtonControl)         :    // button
            case classNum(FormCommandButtonControl)  :   // commandButton
            case classNum(FormFunctionButtonControl) :  // menuItem
            case classNum(FormMenuButtonControl)     : // MenuButton
                    if (infolog)
                    {
                        infolog.globalCache().set(#GRD_FixStack4Button, #GRD_FixStack4ButtonMainKey, [
                            this ? this.name() : "",
                            _control ? _control.name() : "",
                            _control ? _control.id() : 0,
                            ret
                        ]);
                    }
                    break;
            }
        }

    }
    // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 <--

    ret = super(_control);

    return ret;
}
Это цитата из нашего кода. Он проверяет, что тип выбранного контрола - кнопка, запоминаем информацию о нем в глобальном кеше. А затем хитрым образом прокидывает её на сервер в начале транзакции (и при наличии еще ряда оптимизаций, минимизирующих клиент серверный трафик) и там уже использует при записи в SysDatabaseLog - ставит в стек вызовов имя кнопки и формы с которого он начинался. Естественно мы сохраняем стек вызовов в SysDataBaseLog ( в отличие от стандартного приложения)
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 25.06.2014, 16:46   #33  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от userax2009 Посмотреть сообщение
Когда я пишу _control.dataField() пишет ошибку, но если я пишу конкретно название моего контрола(StatusGroupLine_ZTR.dataField()), то могу получить его Id.
если _control.dataField() возвращает ошибку ,значит в этот момент переменная _control указывает не на StatusGroupLine_ZTR, а на какой-то другой контрол (например такой как ButtonControl). Попробуете посмотреть имя контрола _control.name() чтобы убедиться.
За это сообщение автора поблагодарили: userax2009 (1).
Старый 08.07.2014, 10:44   #34  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Возможно, я не правильно обьяснил. Сейчас напишу еще более подробно что нужно получить.
Есть форма, скриншот 1. На ней мышкой клацаем на любое поля на нашем гриде. Затем, по нажатию кнопки история, открывается вторая форма(скриншот 2), в которой показывается история поля, выделенного на первой форме.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 224
Размер:	213.8 Кб
ID:	8907   Нажмите на изображение для увеличения
Название: 2.jpg
Просмотров: 207
Размер:	133.4 Кб
ID:	8908  

Старый 08.07.2014, 10:50   #35  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Если делать для определенного контрола, то проблем нет.
Но для любого не могу придумать как это реализовать.
А именно не могу считать код поля таблицы(скриншот 3).
Что я делаю не так ???
Изображения
 
Старый 08.07.2014, 11:02   #36  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от userax2009 Посмотреть сообщение
Что я делаю не так ???
Покажите ваш код.
Старый 08.07.2014, 11:18   #37  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Покажите ваш код.
1 скриншот - перекрываю метод init формы, которая вызывается
2 скриншот - метода init датасоурса той же формы
Миниатюры
Нажмите на изображение для увеличения
Название: dsinit.jpg
Просмотров: 506
Размер:	57.0 Кб
ID:	8911  
Изображения
 
Старый 08.07.2014, 11:34   #38  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
Старый 08.07.2014, 17:41   #39  
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   #40  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (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, время: 03:03.