Стараюсь писать про Аксапту, хотя частенько тянет в Офис
Круговорот значений в lookup'е
Запись от Gustav размещена 19.05.2010 в 18:41
Как известно, в Аксапте распространены два типа управляющих элементов (контролов) с выпадающим списком. Один из них - ComboBox, служащий для выбора и отображения списка значений конкретного перечисления (enum'а). Другой - редактируемое поле, обычно текстовое (StringEdit), значения для которого выбираются из специальной lookup-формы, отображающей строки определенной таблицы. Механизм отображения lookup-формы работает так, что строки для выбора появляются сразу под редактируемым полем, во много напоминая поведение ComboBox.
Помимо общего "выпадающего" характера оба контрола совпадают и в способе раскрытия списка значений при помощи клавиатуры: Alt-СтрелкаВниз. А вот от еще одной полезной особенности ComboBox'а поле с lookup'ом невыгодно (пока!) отличается. Речь идёт о возможности перебора значений ComboBox'а при помощи двойного щелчка мышкой по этому полю. При каждом очередном щелчке в поле подставляется следующее по очереди значение перечисления, без необходимости раскрывать список. По достижении последнего значения очередь опять переходит к первому, второму и т.д. по кругу. Если при выполнении щелчков удерживать нажатой клавишу Shift, то перебор элементов осуществляется в обратном направлении, также по кругу.
Подобное поведение можно имитировать в форме и на контроле с lookup'ом. Для этого придется написать несложную обработку события mouseDblClick. В качестве примера приведу текст моего метода, предназначенного в нашей Аксапте от GMCS для изменения значение специфического поля "Первичная группа пользователей" (UserGroupDim в таблице SysUserInfo) в форме "Параметры" (SysUserSetup):
Список нужных для перебора элементов (филиалов) у меня жёстко прописан в контейнере. Это потому, что изменяется он крайне редко - за год я добавил в него один элемент (и мне не сложно это сделать, исправив код, а накручивание здесь какого-то более "правильного" функционала - экономически не оправдано). Но при необходимости можно организовать чтение этого списка и из таблицы:
Особое внимание обращаю на то, что список перебора для большего удобства можно сознательно ограничить. У нас, например, количество строк для выбора в lookup-форме, выпадающей из поля "Первичная группа пользователей", на порядок больше, нежели количество элементов контейнера. Но нам так надо!
Помимо общего "выпадающего" характера оба контрола совпадают и в способе раскрытия списка значений при помощи клавиатуры: 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 += .; }
Всего комментариев 0