ShowDecisionDialog
wnd_DecisionDialog
Скрипты
Разработка

результат работы формы ShowDecisionDialog ( wnd_DecisionDialog )

Добрый день!

Подскажите, пожалуйста, почему результатом функция 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 надо бы строку
[javascript]
DecisionResult = Math.pow(2, i);
[/javascript]
заменить на
[javascript]
DecisionResult = Math.pow(2, i-1);
[/javascript]
тогда красиво будет!

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

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

[javascript]
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;
}
[/javascript]

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

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

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

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

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

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

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

если точнее, я бы убрал кусок:
[javascript]
if (i > 2) {
[/javascript]

если точнее, я бы убрал кусок:
[javascript]
if (i > 2) {
[/javascript]

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

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

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

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

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

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

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