Публикация

Скрытие/отображение фреймов или полей с изменением высоты окна

Лично у меня довольно часто возникала ситуация, когда необходимо скрывать/отображать какие-то отдельные поля или группы полей в зависимости от типа записи или других параметров. Вы спросите: почему бы не использовать пользовательские поля? Да хотя бы потому, что при их использвоании у программиста нет возможности разместить элементы в окне так, как он сам желает (порядок следования, ширина, высота и т.д.). Также эти поля наглядно видно в администраторе при редактировании сервиса окна.
Так и родилась эта функция, которая делает видимым или невидимым элемент окна при этом меняя соответсвенно высоту этого окна.
Если необходимо скрыть группу полей, то как аргумент необходимо передать обьект фреймгруппы, в которой находятся поля.

Функция:

function ShowOrHideElementInWindow(Control, IsVisible) {
 if (!Assigned(Control)) {
  return;
 }
 if (Control.IsVisible != IsVisible) {
  if (Control.TypeCode == 'FrameGroup') {
    // Если компонент является фреймгрупом, то находим фрейм, в который
    // он входит и получаем высоту фреймгрупы
    var ParentFrame = Control;
    while (ParentFrame.TypeCode != 'Frame') {
     ParentFrame = ParentFrame.ParentComponent;
    }
    // Чтобы получить значение высоты фреймгрупы необходимо сделать контрол
    // видимым
    Control.IsVisible = true;
    var ControlHeight = ParentFrame.GetItemHeight(Control);
  } else {
    // Если контрол имеет свойство Height, то используем его
    var ControlHeight = Control.Height;
  }
  // Определяем значение на которое должна измениться высота окна.
  // Оно должно быть кратным 5
  var ModResult = ControlHeight % 5;
  var HeightDifference = ControlHeight + (5 - ModResult) + 5;
  var Window = Control.ParentWindow;
  Window.Height += (IsVisible ? HeightDifference : (- HeightDifference));
  Control.IsVisible = IsVisible;
 }
}

Пример вызова функции в скрипте:
ShowOrHideElementInWindow(fgAdditionlData, true);
ShowOrHideElementInWindow(edtAdditionalCost, false);

Если будет желание, выкладывайте ваши замечания по усовершенствованию или идеям использования этой функции.

Нравится

Поделиться

0 комментариев
Показать все комментарии