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

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

Данная серия статей адресована в первую очередь тем, кто уже изучил основы программирования 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 кодеинита, описанного выше. Таким образом, мы можем узнать о каком-то событии, произошедшем в другом объекте, и выполнить нужные нам действия в ответ на это событие.

Метки:



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