Добрый день!
Подскажите, пожалуйста, почему результатом функция ShowDecisionDialog возвращает сумму степеней двойки, за исключением "два в степени два"?
получается проверяются чеки 0,1,3,4,5,6,7....
Какая-то цель в "дырке" с двойкой преследовалась (заранее прошу прощения, давным давно забыл что такое геометрическая прогрессия и другие термины связанные с математикой )
Terrasoft 3.4.1.84
SQL Server 10.50.2500.0
Microsoft Windows NT 6.1 (7601) x64 en
Нравится
Для тех, кто ничего не понял, как и я вчера вечером :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
"Александр Кудряшов" написал:Смысл так понимаю в чистоте кода? :wink:
Для меня смысл выцыплять "клацаные" чекбоксы чтоб эти клацы обрабатывать.
А как-то писать константный массив [1,2,8,16...] не эстетично, только потому что разработчки решили извратиться :wink: и не сделать для чекбокса просто степень двойки!
"AlexLS" написал:А как-то писать константный массив [1,2,8,16...] не эстетично
IMHO написать один раз и забыть, благо это не GUID которые могут варьироваться от базы к базе. Еще и вынести его в "мировые константы" scr_Consts.