Поиграем в прятки

6 3

Как ни странно, даже в таком серьезном деле, как разработка на IS-Builder, есть место для игры.  Я вот недавно играла в прятки с кнопками, мне понравилось, присоединяйтесь.

Итак, есть некоторое условие, в зависимости от которого, кнопка либо показывается, либо прячется. Сделать это можно будет в событии «Карточка.Открытие» разными способами в зависимости от расположения кнопки на форме:

  • Расположение других объектов формы не зависит от прячущейся кнопки - просто прячем кнопку, найдя ее по имени соответствующего действия:
if (Мега-условие)
  Action = Form.Actions.FindAction('ИМЯ_ДЕЙСТВИЯ')
  if not VarIsNull(Action)
    Controls = From.Controls.FindControlsByAction(Action)
    foreach Control in Controls
      if not VarIsNull(Control)
        Control.Visible = FALSE
      endif
    endforeach
  endif   
endif
  • Прячущаяся кнопка – единственная в группе, а группа – последняя в ряду групп кнопок. Прячем родительскую группу.
if (Мега-условие)
  Action = Form.Actions.FindAction('ИМЯ_ДЕЙСТВИЯ')
  if not VarIsNull(Action)
    Controls = From.Controls.FindControlsByAction(Action)
    foreach Control in Controls
      ParentControl = Control.Parent
      if not VarIsNull(ParentControl)
        ParentControl.Visible = FALSE
      endif
    endforeach
  endif   
endif
  • Произвольное расположение прячущейся кнопки среди кнопок – алгоритм кроме прятанья кнопки должен также предусматривать  сдвиг взаимозависимых элементов, например сдвиг кнопок и групп, расположенных ниже - изменение IControl.Top. А также изменение высоты родительской группы – IControl.Height.

Так-то вот, господа-разработчики. «Ловкость рук и никакого мошенничества».

Арслан Абакаров

Не совсем понятно что за игра имелась введу.

А есть работающий пример?

Мария Макарцева

Вот вам реальный пример, где бы это могло пригодиться. Тип карточки "Письма исходящие (официальные)" кнопка "РКК" и связанное с ней действие "Регистрировать". Предположим, у вас нет модуля Канцелярия, тогда нажатие на эту кнопку в карточке документа приведет к сообщению об ошибке. Самое разумное в этой ситуации сделать так, чтобы этой кнопки не было на форме, если у вас нет модуля. Для этого, в событии "Карточка.Открытие" типа карточек эл. документов "Письма исходящие (официальные)" пишем такой код:

  RegistrationAvailable = …
  Form = Object.Form
  MARGIN_BETWEEN_BUTTONS = 4
  if not RegistrationAvailable
    RegisterAction = Form.Actions.FindAction('&Регистрировать')
    if not VarIsNull(RegisterAction)
      RegisterControl = Form.Controls.FindControlByAction(RegisterAction)
      RegisterControl.Visible = FALSE
      ParentControl = RegisterControl.Parent
      if not VarIsNull(ParentControl)
        ParentControl.Height = ParentControl.Height - RegisterControl.Height - MARGIN_BETWEEN_BUTTONS 
      endif
     
      MovingControls = CreateList()     
      // Найти кнопку, расположенную ниже
      SignaturesAction = Form.Actions.FindAction('По&дписи')
      if not VarIsNull(SignaturesAction)
        SignaturesControl = Form.Controls.FindControlByAction(SignaturesAction)
        if not VarIsNull(SignaturesControl)
          MovingControls.Add('1'; SignaturesControl)
        endif
      endif
      // Найти группу, расположенную ниже
      BarCodeAction = Form.Actions.FindAction('&Штрих-код')
      if not VarIsNull(BarCodeAction)
        BarCodeControl = Form.Controls.FindControlByAction(BarCodeAction)
        if not VarIsNull(BarCodeControl)
          BarCodeParentControl = BarCodeControl.Parent
          MovingControls.Add('2'; BarCodeParentControl)
        endif
      endif
     
      // Сдвинуть вверх нужные контроли
      foreach Control in MovingControls
        Control.Top = Control.Top - RegisterControl.Height - MARGIN_BETWEEN_BUTTONS 
      endforeach     
    endif  
  endif

Как вычислить значение переменной RegistrationIsAvalible можно узнать из статьи http://club.directum.ru/blog/post/Exception-vsemogushhijj.aspx. В результате у тех, у кого модуль есть увидят кнопку "РКК", у кого нет модуля - и искушения нажать кнопку не будет.

Аналогичное решение реализовано в DIRECTUM 4.6.1 в справочнике Совещания кнопка "Конференция» - прячущаяся. Кто нашел?

P.S. Найдет только тот, у кого установлена интеграция с системами мгновенных сообщений. 

Авторизуйтесь, чтобы написать комментарий