AXForum  
Вернуться   AXForum > Блоги > Gustav'ово бложище, или Записки DAX-дилетанта-III
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

Стараюсь писать про Аксапту, хотя частенько тянет в Офис
Оценить эту запись

Свойство Command кнопки CommandButton

Запись от Gustav размещена 01.06.2010 в 19:05
Обновил(-а) Gustav 10.08.2010 в 18:07

Возможно, я что-то пропустил на своем аксаптовском пути или что-то не так понял, но когда мне захотелось на форме динамически создать командную кнопку (FormCommandButtonControl) и нагрузить ее предопределенной командой - OK или Cancel, я не смог найти в своих подручных источниках информации вразумительного списка команд, пригодного для использования при разработке. Конечно, в поле свойства Command выпадающий список появляется, но получить его оттуда полностью как-то не получается. Я полагал, что, как водится в подобных случаях, существует какое-нибудь перечисление (enum) и команда легко задается константой вроде Command::Ok.

Ничего подобного не обнаружилось (или я плохо искал). Поэтому пришлось создавать тестовую форму, помещать на нее единственный контрол - командную кнопку, устанавливать свойство Command этой кнопки в OK и в метод init формы вставлять оператор, информирующий после запуска формы о целочисленном значении, соответствующем этой команде:
X++:
public void init()
{
    FormCommandButtonControl    button;

    super();

    button = element.design().controlNum(1);
    box::info(strFmt('Код команды: %1', button.command())); // 263 - ОК
}
Разумеется, мне тут же захотелось по аналогии получить список всех команд. Усилия привели к следующему джобу, на ходу создающему форму, кнопку и выводящему желаемую информацию в инфолог (форма за всё это время даже не появляется на экране) :
X++:
static void job_getCommandButtonCommandList(Args _args)
{
    Args                        args    = new Args();
    Form                        form    = new Form();
    FormRun                     formRun;
    FormCommandButtonControl    commandButton;
    int                         i;
    str                         currCaption,prevCaption;
;
    form.addDesign('Design');
    args.object(form);

    formRun = classFactory.formRunClass(args);
    formRun.init();

    commandButton = formRun.design().addControl(FormControlType::CommandButton, 'CommandButton');

    for (i=0;i<=10000;i++)
    {
        commandButton.command(i);
        currCaption = CommandButton.caption();

        if (currCaption != prevCaption)
            info(strFmt('%1 -- %2 -- %3', i, commandButton.caption(), commandButton.toolTip()));

        prevCaption = currCaption;
    }

    formRun.close();
}
В результате выполнения джоба вы становитесь счастливым обладателем актуальной информации о паре сотен команд: числовой код, название (подпись на кнопке) и текст всплывающей подсказки (последний особенно помогает в случае повторяющихся названий команд - некоторое количество таковых присутствует в списке, причем, в разных его местах).

Верхний предел цикла - 10000 - был подобран эмпирически, с целью заведомого покрытия диапазона имеющихся значений кодов команд от 257 - "Справка" до 4388 - "Создать из файла" (для Ax 3.0 SP4; в версии 2009 список команд побольше). Было также обнаружено, что если к обеим границам цикла прибавить 65536*N (где N = 1..65536), то последовательность кодов повторяется в других числовых диапазонах и с другими абсолютными значениями. Это говорит о том, что в свойстве command система использует лишь 4 младших байта передаваемого туда целого числа.

P.S. В процессе тестирования джоба в Ax 3.0 SP4 я сверил его результаты с содержимым выпадающего списка свойства Command. Для этого сравнения мне пришлось фрагментарно наскриншотить список. Публикую его здесь на память, чтобы труд не пропал даром (порядок следования частей определяется числами сверху):



Джоб вывел в инфолог 199 команд (Ax 3.0 SP4). В списке же их - 205. Абсолютно повторяются (caption и tooltip): "Сохранить" - 2 раза, "Точки останова" - 2 раза, "Удаление всех точек останова" - 3 раза, "Вставка/удаление точек останова" - 2 раза, "Блокировка/разблокировка точек останова" - 2 раза. Итого имеем "лишних": 1+1+2+1+1 = 6 строк = 205 - 199.

P.S. 10.08.2010. P.S. Обнаружена идентичность параметров n (кодов команд), передаваемых методам FormCommandButtonControl.command(n) и FormRun.task(n): Как программно снять "фильтр по выделению"
Размещено в Без категории
Просмотров 141264 Комментарии 0
Всего комментариев 0

Комментарии

 


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