Серия статей: Курс Молодого Самурая. Часть первая: Управляем формой.

Вступительное слово

Данная серия статей адресована в первую очередь тем, кто уже изучил основы программирования Navision, но при этом еще не успел уйти от них далеко. Здесь можно будет найти ряд каждодневных хитростей, которые не являются очевидными. Надеюсь, читатель найдет здесь полезную для себя информацию.

Часть первая: Управляем формой

1. Управление параметрами элементов, находящихся на форме, из C/AL кода.

У каждого объекта на форме есть ряд параметров, которые могут быть изменены непосредственно из кода, написанного на одном из триггеров данной формы. Обычно это параметры, отвечающие за расположение и отображение объекта на форме, его размеры и возможность редактирования. Каждый элемент при создании получает по умолчанию имя (свойство Name), которое состоит из слова Control и номера элемента на форме, заключенных в угловые скобки. (Пример:<Control1210002> ).

Для того, что бы свойства элемента были доступны из кода и видны в Symbol Menu, нужно, что бы его имя отличалось от имени по умолчанию. Если элементом является TableBox, то при проставлении ему в SourceExpr поля из таблицы, на которой построена форма (TableSource формы), имя элемента автоматически изменится на имя данного поля, заключенного в угловые скобки. Во всех других случаях при необходимости получения доступа к свойствам объекта из кода следует вручную изменить имя соответствующего элемента.

После того как элемент получил имя отличное от имен по умолчанию, его свойства можно найти в Symbol Menu, выбрав по порядку: в левом столбце CurrForm, в среднем столбце Controls, в правом его имя; затем воспользоваться кнопкой Zoom In (см. Рис. 1) и выбрать интересующее свойство. В итоге в коде должна появиться примерно такая строка: CurrForm.MyControl.VISIBLE

Dynamics NAV (Navision) C/AL Sympol MenuВ 
Р РёСЃ. 1

2. Подмена MenuButton кнопок на форме.

РќРµ редко возникает ситуация, РєРѕРіРґР° РїРѕ той или РёРЅРѕР№ причине разным сотрудникам нужно иметь доступ Рє разным пунктам РІ MenuButton. Обычно этот РІРѕРїСЂРѕСЃ может быть решен разграничением прав доступа Рє соответствующим объектам. Если же РїРѕ каким-то соображениям нельзя ограничиться настройкой прав, то необходимо скрывать соответствующие пункты MenuButton. РќРѕ РёР· C/AL РєРѕРґР° этого сделать нельзя. Для решения данного РІРѕРїСЂРѕСЃР° можно воспользоваться подменой РѕРґРЅРѕРіРѕ MenuButton РЅР° РґСЂСѓРіРѕР№. Р?наче РіРѕРІРѕСЂСЏ, РјС‹ копируем существующую РєРЅРѕРїРєСѓ Рё вставляем ее РЅР° ту же самую форму, даем РёРј различные имена, например, MButtonOrig Рё MButtonCopy1, убираете РёР· РЅРѕРІРѕР№ РєРЅРѕРїРєРё соответствующие пункты Рё РІ нужный момент РІ РєРѕРґРµ указываем программе, какую РёР· этих РєРЅРѕРїРѕРє отображать РЅР° форме. РџСЂРё использовании подмены РЅРµ следует размещать заменяемые РєРЅРѕРїРєРё точно РѕРґРЅСѓ РЅР° РґСЂСѓРіСѓСЋ, так как РїСЂРё последующей доработке этой формы РЅРµ будет сразу РІРёРґРЅРѕ, что РєРЅРѕРїРѕРє РЅР° самом деле несколько. Положите лучше РёС… каскадом или вообще разнесите. РџСЂРё этом надо сделать РЅРµ видимыми РІСЃРµ РєРЅРѕРїРєРё РєСЂРѕРјРµ РѕСЃРЅРѕРІРЅРѕР№. Непосредственно РІ момент подмены РјС‹ можем установить заменяющую РєРЅРѕРїРєСѓ вместо заменяемой, просто скопировав координаты последней. Р’ итоге РєРѕРґ должен иметь следующий РІРёРґ:

OnOpenForm()
 
IF NOT UserSetup.GET(USERID) THEN
 
В  ERROR(ErrorMsg);IF UserSetup.SpecialButton THEN BEGIN
 
В  CurrForm.MButtonCopy1.XPOS := CurrForm.MButtonOrig.XPOS;
 
В  CurrForm.MButtonCopy1.YPOS := CurrForm.MButtonOrig.YPOS;
 
В  CurrForm.MButtonCopy1.VISIBLE := TRUE;
 
В  CurrForm.MButtonOrig.VISIBLE := FALSE;
 
END;

3. Р?спользование свойств TimerInterval формы Рё SingleInstance кодеюнита

У каждого кодеюнита есть свойство SingleInstance. Если это свойство установить равным Yes, то все запуски данного кодеюнита из различных мест системы в рамках одного клиента Nav будут иметь дело с одними и теми же переменными. Т.е. значение переменных данного кодеюнита будут храниться все время работы клиента! Таким образом, мы можем завести в неком кодеюните глобальную переменную Value и две функции SetValue и GetValue, которые соответственно записывают и возвращают переменную Value. Теперь мы можем, вызвав из одного объекта SetValue данного кодеюнита, сохранить значение, и потом, вызвав GetValue из другого, считать это значение. Такой прием удобен, если нет другого способа передать данные между объектами.

У каждой формы есть свойство TimerInterval. Как следует из встроенной справки, в данном поле указывается время в миллисекундах, через которое запускается триггер формы OnTimer. В частности здесь можно прописать вызов функции GetValue кодеинита, описанного выше. Таким образом, мы можем узнать о каком-то событии, произошедшем в другом объекте, и выполнить нужные нам действия в ответ на это событие.

Метки:



Оставьте свой отзыв!