Скрытие/отображение фреймов или полей с изменением высоты окна
Лично у меня довольно часто возникала ситуация, когда необходимо скрывать/отображать какие-то отдельные поля или группы полей в зависимости от типа записи или других параметров. Вы спросите: почему бы не использовать пользовательские поля? Да хотя бы потому, что при их использвоании у программиста нет возможности разместить элементы в окне так, как он сам желает (порядок следования, ширина, высота и т.д.). Также эти поля наглядно видно в администраторе при редактировании сервиса окна.
Так и родилась эта функция, которая делает видимым или невидимым элемент окна при этом меняя соответсвенно высоту этого окна.
Если необходимо скрыть группу полей, то как аргумент необходимо передать обьект фреймгруппы, в которой находятся поля.
Функция:
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(edtAdditionalCost, false);
Если будет желание, выкладывайте ваши замечания по усовершенствованию или идеям использования этой функции.