Как сделать, чтобы высота окна менялась в зависимости от отображаемых в нем фреймах

Как сделать, чтобы высота окна менялась в зависимости от отображаемых в нем фреймах?

То есть:
- создаю окно
- в окне создаю компонент FrameSet, указываю в FrameSet свойство IsResizible=True
- в FrameSet создаю два компонента Frame. Второй компонент Frame можно сворачивать и разворачивать с помощью стрелочки, которую видно на границе между первым фреймом и вторым

Теперь мне нужно, чтобы высота окна становилась меньше ровно на столько, на сколько уменьшиться второй Frame при сворачивании.

Цель этого всего: возможность делать окно меньше минимизируя ненужные фреймы в окне.

Я смотрю у окна есть свойство BorderStyle. Может в нем нужно указать какое-то значение правильное, чтобы все заработало?

Нравится

10 комментариев

Руками высоту окна меняем да и все.

Я решил не заморачиваться и просто добавил кнопку, которая будет скрывать/показывать нужный фрейм. Еще ранее я написал функцию, которая меняет высоту окна на высоту скрываемых элементов (фреймы, контролы).
Просто думал может есть какой-то более простой готовый способ.

В scr_WindowUtils описана функция GetFrameHeight(Frame), она может Вам пригодиться.

если перед открытием прячешь фремы , то просто меняешь высоту у окошка и отрываешь , если после отрытия(по смене типа напр.) то также
например
Self.Height = Self.Height + 10;
просто нужно знать какая высота тебе нужна

"Раловец Ольга" написал:В scr_WindowUtils описана функция GetFrameHeight(Frame), она может Вам пригодиться.

Да, именно эту функцию я использовал

С позволения автора функции GetFrameHeight(Frame) Артема Репко публикую ее код, т.к. выяснилось, что она существует не во всех конфигурациях.

function GetFrameHeight(Frame) {
	var clTop = 0;
	var clBottom = 3;
	var TotalHeight = 0;
	var Component, Height;
	for (var i = 0; i < Frame.Count; i++) {
		Height = 0;
		Component = Frame.Items(i);
		if (Component.IsVisible == false) {
			continue;
		}
		if ((IsStringInArray(Component.TypeCode, ['Frame', 'FrameSet']) && Component.IsClient) ||
			IsStringInArray(Component.TypeCode, ['FrameGroup', 'UserFieldsGroup'])) {
			Height = GetFrameHeight(Component);	
		} else 
		if (IsStringInArray(Component.TypeCode, ['Frame', 'FrameSet']) && !Component.IsClient) {
			Height = Component.Size;
		} else {
			Height = Component.Height;
			if ((Component.CaptionLayout == clTop) || 
				(Component.CaptionLayout == clBottom)) {
				Height += 18;
			};
		}
 
		if ((Frame.Direction == dVertical) && Frame.HasSeparator && (i > 0)) {
			Height += 6;
		}
 
		if (Frame.Direction == dHorizontal) {
			TotalHeight = Math.max(TotalHeight, Height);
		} else {
			TotalHeight += Height;
		}
	}
	switch (Frame.GroupType) {
		case fgtControls: 
			TotalHeight += 20;
			break;
		case fgtNormal:
			TotalHeight += 18;
			break;
		case fgtFooter: 
			TotalHeight += 10;
			break;
	}
	TotalHeight += (Frame.OffsetTop + Frame.OffsetBottom);
	return TotalHeight;
}

Прошу прощения, что не проверила наличие этой функции в базовой версии и вопрос к Андрею.

"Кошкаров Андрей" написал:Да, именно эту функцию я использовал

Откуда она у Вас?

А действительно откуда?
Спасибо Оле что обновила материал. Функция очень полезная.

Я ее просто вызывал и пользовался. А что, ее у меня не должно было быть?
Версия Terrasoft: XRM 3.3.1.31

Для интереса подняла базу 3.3.1.31, нет там этой функции, наверное, к Вам она попала позже.

хм. Мне кажется кто-то в блоге подобной (или этой) функцией делился.

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