Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   Обсуждение скриптов в Системе Базис (https://промебельклуб.рф/forum/showthread.php?t=13614)

Максим Геннадьевич 12.06.2018 12:39

Цитата:

Сообщение от Letos (Сообщение 457591)
Лучше использовать свойство ItemIndex у комбо, которое указывает на индекс выбранной строки. Есть два варианта решения:

Выручайте использую код
Код:

MakeProperties();

Action.Continue();

function MakeProperties() {
Prop = Action.Properties;
combo = Prop.NewCombo('Тип шкафа', 'Тип1\nТип2');

Prop.OnChange = function() {
if (combo.ItemIndex == 0){
    Door = Prop.NewGroup('Дверь');
    // какой-то еще код
}
else if (combo.ItemIndex == 1){
    Box = Prop.NewGroup('ящик');
    // какой-то еще код
}
}
}

Как очистить форму? Выбираю тип1 появляется дверь, выбираю тип2 появляется ящик, но и дверь остается. Подскажите какая функция очищает форму? Спасибо

Letos 12.06.2018 20:04

Цитата:

Сообщение от Максим Геннадьевич (Сообщение 457914)
Как очистить форму? Выбираю тип1 появляется дверь, выбираю тип2 появляется ящик, но и дверь остается. Подскажите какая функция очищает форму? Спасибо

Вот решение:
Код:

MakeProperties();

Action.Continue();

function MakeProperties() {
    Prop = Action.Properties;
    combo = Prop.NewCombo('Тип шкафа', 'Тип1\nТип2');

    Prop.OnChange = function () {
        if (combo.ItemIndex == 0) {
            if (typeof Box !== 'undefined'){
                Box.DeleteSelf();
            }
            if (typeof Door !== 'undefined'){
                Door.DeleteSelf();
            }
            Door = Prop.NewGroup('Дверь');
            // какой-то еще код
        }
        else if (combo.ItemIndex == 1) {
            if (typeof Box !== 'undefined'){
                Box.DeleteSelf();
            }
            if (typeof Door !== 'undefined'){
                Door.DeleteSelf();
            }
            Box = Prop.NewGroup('ящик');
            // какой-то еще код
        }
    }
}

Но, в зависимости от количества свойств, оно может еще прибавить в размерах. Лучшим вариантом будет создание отдельной группы для изменяемых параметров и создавать эти параметры внутри группы, например:
Код:

MakeProperties();

Action.Continue();

function MakeProperties() {
    var Prop = Action.Properties;
    var combo = Prop.NewCombo('Тип шкафа', 'Тип1\nТип2');
    var params = Prop.NewGroup('Параметры');
    combo.OnChange = function () {
        if (combo.ItemIndex == 0) {
            params.Clear();
            Door = params.NewGroup('Дверь');
            // какой-то еще код
        }
        else if (combo.ItemIndex == 1) {
            params.Clear();
            Box = params.NewGroup('ящик');
            // какой-то еще код
        }
    }
}


Максим Геннадьевич 13.06.2018 07:08

В первом случае выдает
Door.DeleteSelf(); - TypeError:Door.DeleteSelf is not function
Во втором случае проблема осталась и форма не очищается от предыдущего выбора. Думаю метод Clear() не срабатывает т.к я его до этого тоже использовал и толку не было.

Letos 13.06.2018 11:08

Цитата:

Сообщение от Максим Геннадьевич (Сообщение 457955)
В первом случае выдает
Door.DeleteSelf(); - TypeError:Door.DeleteSelf is not function
Во втором случае проблема осталась и форма не очищается от предыдущего выбора. Думаю метод Clear() не срабатывает т.к я его до этого тоже использовал и толку не было.

Проверил у себя на (вы же вроде про 8 версию пишете) демке версии 8.0.7.9649 - всё работает нормально. Думаю, метод Clear работал всегда. А у вас какая версия (полная)?

Максим Геннадьевич 13.06.2018 12:13

Цитата:

Сообщение от Letos (Сообщение 457971)
Проверил у себя на (вы же вроде про 8 версию пишете) демке версии 8.0.7.9649 - всё работает нормально. Думаю, метод Clear работал всегда. А у вас какая версия (полная)?

Извиняюсь за смайлик, случайно нажал.
Версия 8.0.12.12765.

Letos 13.06.2018 13:48

Цитата:

Сообщение от Максим Геннадьевич (Сообщение 457978)
Версия 8.0.12.12765.

Судя по версии, должно всё работать. Попробуйте запустить у себя такой код:
Код:

Action.Continue();
var btn = Action.Properties.NewButton('123123');
var grp = Action.Properties.NewGroup('group');
var i = 0;
btn.OnClick = function (){
    i++;
    grp.Clear();
    grp.NewBool('item' + i);
}

Должны появиться кнопка и группа. При нажатии на кнопку в группе появляется логическое свойство с именем <"Item" + кол-во нажатий на кнопку>. При этом старых свойств в группе не должно оставаться. У вас так же отработает?

Максим Геннадьевич 13.06.2018 14:26

Цитата:

Сообщение от Letos (Сообщение 457986)
Должны появиться кнопка и группа. При нажатии на кнопку в группе появляется логическое свойство с именем <"Item" + кол-во нажатий на кнопку>. При этом старых свойств в группе не должно оставаться. У вас так же отработает?

Появляются свойства один за другим. Т.е шесть нажатий на кнопку и в группе все шесть свойств без удаления предыдущего.
Clear отказывается срабатывать. Буду думать дальше. Спасибо

Максим Геннадьевич 13.06.2018 21:01

Создаю заранее Door.NewBool() и Box.NewBool() и через Visible отображаю в зависимости от типа

Guamoko 17.06.2018 06:59

Добрый день. Запнулся на цикле. Имею функцию:

function HNap(Mater11,Hnap11){
arguments[0].SetActive();
var thick = ActiveMaterial.Thickness;
if(thick == 10){
arguments[1].Value=Window1.Hprm.Value-99;
arguments[1].Layout.Top=arguments[1].Layout.Top;
}
if(thick == 4){
arguments[1].Value=Window1.Hprm.Value-102;
arguments[1].Layout.Top=arguments[1].Layout.Top;
}
}
Если вызываю так:

Window1.Hprm.OnValueChange=function(){
HNap(Window1.Mater11,Window1.Hnap11);
HNap(Window1.Mater21,Window1.Hnap21);
HNap(Window1.Mater31,Window1.Hnap31);
}
то все нормально. Но мне она нужна через цикл. Моя попытка:

var mater = ["Mater11","Mater21","Mater31"];
var hnap = ["HNap11","HNap21","HNap31"];
Window1.Hprm.OnValueChange=function(){
for (var i=0, j=0; i<mater.length, j<hnap.length; i++, j++){
HNap(mater[i],hnap[j]);
}
}
но выдает ошибку:
TypeError: arquments(0).SetActive is not a function at HNap at Function.Window1.Hprm.OnValueChange

или что то другое , еси пробую варианты.Прошу указать на мою ошибку.
Спасибо.

Letos 17.06.2018 22:56

Цитата:

Сообщение от Guamoko (Сообщение 458217)
Прошу указать на мою ошибку.
Спасибо.

Ошибка в этой строке:
Код:

HNap(mater[i],hnap[j]);
Вы пытаетесь в свою функцию передать строку вместо объекта (ведь у вас в массиве хранятся строки). Ее можно решить двумя способами (выбирайте понравившийся, который вам удобнее понять):

Вариант 1


Код:

var mater = ["Mater11", "Mater21", "Mater31"];
var hnap = ["HNap11", "HNap21", "HNap31"];
Window1.Hprm.OnValueChange = function () {
    for (var i = 0, j = 0; i < mater.length, j < hnap.length; i++ , j++) {
        HNap(Window1[mater[i]], Window1[hnap[j]]);
    }
}

Здесь перед передачей в функцию у окна запрашиваются свойства по имени из массива.
[свернуть]

Вариант 2


Код:

var mater = [Window1.Mater11, Window1.Mater21, Window1.Mater31];
var hnap = [Window1.HNap11, Window1.HNap21, Window1.HNap31];
Window1.Hprm.OnValueChange = function () {
    for (var i = 0, j = 0; i < mater.length, j < hnap.length; i++ , j++) {
        HNap(mater[i], hnap[j]);
    }
}

Здесь сразу в массив записываются свойства и потом просто передаются в функцию. Я считаю этот вариант наиболее понятным.
[свернуть]

Пока писал варианты придумал еще один "изврат" на основе первого варианта. Используется как "смотрите, что можно сделать", но, по-моему этот вариант сложнее читать, чем первые два.:

"изврат"


Код:

const mater = "Mater"
const hnap = "HNap"
Window1.Hprm.OnValueChange = function () {
    for (var i = 0; i < mater.length; i++) {
        HNap(Window1[mater + i + '1'], Window1[hnap + i + '1']);
    }
}

[свернуть]


P.S. Я писал всё это без проверки, поэтому возможны опечатки.


P.P.S.Из "придраться по поводу кода":
1. почему вы используете "arguments[0]" и "arguments[1]" вместо "Mater11" и "Hnap11"? Имхо, в вашем случае читаемость скрипта хуже.
2. Такой цикл тоже кажется странным:
Код:

for (var i=0, j=0; i<mater.length, j<hnap.length; i++, j++)
Ведь на каждой итерации (в вашем примере) у вас переменные i и j равны, и можно просто использовать лишь одну из них. Но это замечание актуально только если у вас количество mater'ов и hnap'ов одинаково и вы передаёте в функцию элементы массива с одинаковым индексом.


Текущее время: 02:12. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL