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

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

Круговорот значений в lookup'е

Запись от Gustav размещена 19.05.2010 в 18:41

Как известно, в Аксапте распространены два типа управляющих элементов (контролов) с выпадающим списком. Один из них - ComboBox, служащий для выбора и отображения списка значений конкретного перечисления (enum'а). Другой - редактируемое поле, обычно текстовое (StringEdit), значения для которого выбираются из специальной lookup-формы, отображающей строки определенной таблицы. Механизм отображения lookup-формы работает так, что строки для выбора появляются сразу под редактируемым полем, во много напоминая поведение ComboBox.

Помимо общего "выпадающего" характера оба контрола совпадают и в способе раскрытия списка значений при помощи клавиатуры: Alt-СтрелкаВниз. А вот от еще одной полезной особенности ComboBox'а поле с lookup'ом невыгодно (пока!) отличается. Речь идёт о возможности перебора значений ComboBox'а при помощи двойного щелчка мышкой по этому полю. При каждом очередном щелчке в поле подставляется следующее по очереди значение перечисления, без необходимости раскрывать список. По достижении последнего значения очередь опять переходит к первому, второму и т.д. по кругу. Если при выполнении щелчков удерживать нажатой клавишу Shift, то перебор элементов осуществляется в обратном направлении, также по кругу.

Подобное поведение можно имитировать в форме и на контроле с lookup'ом. Для этого придется написать несложную обработку события mouseDblClick. В качестве примера приведу текст моего метода, предназначенного в нашей Аксапте от GMCS для изменения значение специфического поля "Первичная группа пользователей" (UserGroupDim в таблице SysUserInfo) в форме "Параметры" (SysUserSetup):
X++:
public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
{
    int                 ret;
    str                 groupToFind;
    container           filials = ['ГЛАВК','ФилМ','ФилК','ФилП','ФилВ','ФилА',''];
    int                 pos;

    ret = super(_x, _y, _button, _Ctrl, _Shift);

    groupToFind = SysUserInfo.UserGroupDim;

    pos = conFind(filials, groupToFind); // позиция текущего отображаемого элемента

    if (_Shift) // если нажат Shift, то перебор в обратном направлении
    {
        pos--;
        if (pos < 1) pos = conLen(filials);
    }
    else // иначе - в прямом
    {
        pos++;
        if (pos > conLen(filials)) pos = 1;
    }

    SysUserInfo.UserGroupDim = conPeek(filials, pos);
    SysUserInfo.write();

    SysUserInfo_ds.reread();
    SysUserInfo_ds.refresh();

    return ret;
}
Список нужных для перебора элементов (филиалов) у меня жёстко прописан в контейнере. Это потому, что изменяется он крайне редко - за год я добавил в него один элемент (и мне не сложно это сделать, исправив код, а накручивание здесь какого-то более "правильного" функционала - экономически не оправдано). Но при необходимости можно организовать чтение этого списка и из таблицы:
X++:
    while select  order by ... where ...
    {
        filials += .;
    }
Особое внимание обращаю на то, что список перебора для большего удобства можно сознательно ограничить. У нас, например, количество строк для выбора в lookup-форме, выпадающей из поля "Первичная группа пользователей", на порядок больше, нежели количество элементов контейнера. Но нам так надо!
Размещено в Без категории
Просмотров 143809 Комментарии 0
Всего комментариев 0

Комментарии

 


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