Добрый день!

Подскажите, пожалуйста, почему результатом функция ShowDecisionDialog возвращает сумму степеней двойки, за исключением "два в степени два"?
получается проверяются чеки 0,1,3,4,5,6,7....
Какая-то цель в "дырке" с двойкой преследовалась (заранее прошу прощения, давным давно забыл что такое геометрическая прогрессия и другие термины связанные с математикой :sad: )

Terrasoft 3.4.1.84
SQL Server 10.50.2500.0
Microsoft Windows NT 6.1 (7601) x64 en

Нравится

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

Думаю в wnd_DecisionDialogScript надо бы строку

DecisionResult = Math.pow(2, i);

заменить на

DecisionResult = Math.pow(2, i-1);

тогда красиво будет!

Для тех, кто ничего не понял, как и я вчера вечером :wink:

Давайте сначала пройдемся по коду. Это из скрипта окна wnd_DecisionDialog, которое вызывает ShowDecisionDialog

function InitializeDecisions(Window, FrameGroup) {
	var DecisionType = Window.Attributes('DecisionType');
	var DecisionsArray = Window.Attributes('DecisionsArray');
	var DefaultDecisionIndex = Window.Attributes('DefaultDecisionIndex');
	var ComponentName = DecisionType; // внимание, зачем-то создаем еще одну переменную для типа
	DefaultDecisionIndex = DefaultDecisionIndex || 1;
	var Component;
	var DecisionResult;
	var MaxCaptionLengthComponent;
	var ComponentOffset = 25;
	var DecisionTypeControlDefWidth = 20;
	for (var i = 1; i <= DecisionsArray.length; i++) {
		Component = Window.CreateComponent(ComponentName, 'edtDecision' + i); // создаем компонент указанного в атрибутах типа
		if (i > 2) {
			if (DecisionType == 'CheckBox') { // внимание, только если чекбокс
				DecisionResult = Math.pow(2, i); // после контрола №2 присваиваем степени двойки
			} else {
				DecisionResult = i; // иначе просто по порядку
			}	
		} else {
			DecisionResult = i;
		}
		Component.Caption = DecisionsArray[i - 1];
		if ((!MaxCaptionLengthComponent) ||
			(MaxCaptionLengthComponent.Caption.length < Component.Caption.length)) {
			MaxCaptionLengthComponent = Component;
		}
		Component.Tag = DecisionResult; // присваиваем контролу "очки" за его выбор
		Component.AlignHorizontal = alhClient;
		Component.AlignVertical = alvTop;
		Component.OffsetLeft = ComponentOffset;
		if (i == DefaultDecisionIndex) {
			Component.IsChecked = true;
		}
		FrameGroup.Add(Component);
	}
	var SummaryOffset = frmMain.OffsetLeft + frmMain.OffsetRight +
		DecisionTypeControlDefWidth + 20; // Offset by GroupType
	Window.Attributes('MinWindowWidth') = 2 * ComponentOffset + SummaryOffset +
		GetWindowMinWidthByComponentCaption(MaxCaptionLengthComponent.Caption);
 
}
 
function GetWindowMinWidthByComponentCaption(Caption) {...}
 
function GetDecisionResult() { // считаем сумму результата
	if (!DecisionDialog.IsOK) {
		return -1;
	}
	var Result = 0;
	var Component;
	for (var i = 0; i < fgDecision.Count; i++) { // только для группы fgDecision
		Component = fgDecision.Items(i);
		if (Component.IsChecked) { // только если IsChecked
			Result = Result + Number(Component.Tag); // простая сумма
		}
	}
	return Result;
}

Другими словами если у вас наполняется чекбоксами (галочками), то применяются степени двойки, а если радиобатонами:lol: - то просто считается по порядку. Потому что

Т.е. если чекбосы у вас может вернуть:
либо 0 либо сумму чисел 1, 2, 8, 16 и т.д. Тогда по сумме легко вычисляются порядковые номера выбранных чекбоксов

если радио:
либо 0 либо 1, 2, 3, 4 и т.д. по порядку. Тогда вообще ничего вычислять не надо

А AlexLS предлагает следующее:

если чекбосы у вас может вернуть:
либо 0 либо сумму чисел 1, 2, ! 4 !, 8, 16 и т.д. Тогда по сумме тоже легко вычисляются порядковые номера выбранных чекбоксов

Вопрос и правда интересный, но ответ скорее всего в том, что это либо просто заготовка, либо, наоборот, артефакт. Т.к. в конфигурации XRM я не нашел применения ShowDecisionDialog с чекбоксами.

Кстати, не понятно, откуда может взяться DecisionResult == -1

если точнее, я бы убрал кусок:

if (i > 2) {

если точнее, я бы убрал кусок:

if (i > 2) {

Смысл так понимаю в чистоте кода? :wink:

"Александр Кудряшов" написал:

Смысл так понимаю в чистоте кода? :wink:

Для меня смысл выцыплять "клацаные" чекбоксы чтоб эти клацы обрабатывать.
А как-то писать константный массив [1,2,8,16...] не эстетично, только потому что разработчки решили извратиться :wink: и не сделать для чекбокса просто степень двойки!

"AlexLS" написал:А как-то писать константный массив [1,2,8,16...] не эстетично

IMHO написать один раз и забыть, благо это не GUID которые могут варьироваться от базы к базе. Еще и вынести его в "мировые константы" scr_Consts.

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