0
Answered

Как получить ссылку на кнопку в списке?

Oleg Bubnov 7 years ago in iRidium Script updated by Aleksandr Romanov (CTO) 7 years ago 4

Создаю список методом IR.ITEM_LISTBOX, заполняю его кнопками - выключателями релюх на AMX. Мне нужно при создании списка проверить какие реле включены и включить кнопки в списке. Как это правильно сделать? Я пытался изменять свойство Value у создаваемых кнопок (по аналогии с Text и Image), но генерируется ошибка. А как создать и поставить ссылку на кнопку в глобальный слушатель, не могу понять. Помогите, пожалуйста. Вот мой код:

var testPopup = "Баня";
var Switches = ["Вход","Душ","Пещера Потолок","Купель Патио","Купель Щит и Люстра","Батареи и Потолок","Пещера Люстра"];

IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{
IR.Log("Global Listener Activated: " + name + "\tValue: " + value);
//Как получить сюда ссылку на кнопку из списка и присвоить ее полю Value значение Value слушателя?
});

// оформляем подписку на изменения каналов драйвера
for (var i = 0; i < Switches.length; i++) {
IR.SubscribeTagChange("Drivers.amx."+Switches[i]);
};
IR.AddListener(IR.EVENT_START,0,function()
{
MakePanelID();
InitController();
NewPopup (testPopup);
IR.ShowPopup(testPopup)

// Создаем список и заполняем его
IR.GetItem(testPopup).CreateItem(IR.ITEM_LISTBOX,"Выключатели",0,0,750,1344);
test_list = IR.GetItem(testPopup).GetItem("Выключатели");
test_list.Template = "Шаблон Списка Выключателей";
for (var i = 0; i < Switches.length; i++) {
// или как здесь получить и указать значение GetFeedback из канала, соответствующего кнопке
test_list.CreateItem(i, 1,{Text: Switches[i]});

};

//При изменении выключателя, включаем или выключаем кнопку в AMX
IR.AddListener(IR.EVENT_LIST_ITEM_CHANGE, test_list, function(Item, Subitem, TypeEvent, object){
var tempnum = TypeEvent;
if(tempnum==12) {
amx.Set(Switches[Item],1);
amx.Set(Switches[Item],0);
Log(amx.GetFeedback(Switches[Item]));
object.Value = !amx.GetFeedback(Switches[Item]);

};
});
});

Under review

Здравствуйте!


Для того чтобы записать какое -либо значение в определенный элемент на листе необходимо использовать такой же синтаксис как и при создании элемента.

Т.е.

test_list.CreateItem(i, 1,{Text: Switches[i], Value: val});

И если элемент уже создан, то указанный метод просто поменяет значение указанного параметра элемента.


Попробуйте использовать такой скрипт


var testPopup = "Баня";
var Switches = ["Вход","Душ","Пещера Потолок","Купель Патио","Купель Щит и Люстра","Батареи и Потолок","Пещера Люстра"];  
 


IR.AddListener(IR.EVENT_START,0,function()
{
   MakePanelID();
   InitController();
   NewPopup (testPopup);
   IR.ShowPopup(testPopup)
   
   // Создаем список и заполняем его
   IR.GetItem(testPopup).CreateItem(IR.ITEM_LISTBOX,"Выключатели",0,0,750,1344);  
   test_list = IR.GetItem(testPopup).GetItem("Выключатели");           
   test_list.Template = "Шаблон Списка Выключателей";     
   for (var i = 0; i < Switches.length; i++) {
      // или как здесь получить и указать значение GetFeedback из канала, соответствующего кнопке
      var val = IR.GetDevice("amx").GetFeedback("Channel " + i);
      test_list.CreateItem(i, 1,{Text: Switches[i], Value: val});
  
   };
   
   
   IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
   {
     IR.Log("Global Listener Activated: " + name + "\tValue: " + value);
     //Как получить сюда ссылку на кнопку из списка и присвоить ее полю Value значение Value слушателя?
     test_list.CreateItem(i, 1,{Text: Switches[i], Value: val});
   });     
         
   //  оформляем подписку на изменения каналов драйвера
   for (var i = 0; i < Switches.length; i++) {
     
     IR.SubscribeTagChange("Drivers.amx."+Switches[i]);
   
   };
   
   
     
   //При изменении выключателя, включаем или выключаем кнопку в AMX
   IR.AddListener(IR.EVENT_LIST_ITEM_CHANGE, test_list, function(Item, Subitem, TypeEvent, object){
      var tempnum = TypeEvent; 
      if(tempnum==12) {
         amx.Set(Switches[Item],1);     
         amx.Set(Switches[Item],0);     
         Log(amx.GetFeedback(Switches[Item]));  
         object.Value = !amx.GetFeedback(Switches[Item]);
         
      };  
    });  
});

В итоге заработал несколько видоизмененный скрипт. Переменная i в глобальном слушателе в Вашем варианте всегда равна длине массива. Я добавил к названиям кнопок номера и потом вычленял их. Решение работает, но несколько туповатое. Нет ли более изящного варианта? Вот итоговый скрипт:


var objBtn, testPopup = "Подсобные", testBtn = "Вход";
var relay = ["Вход","Душ","Пещера Потолок","Купель Патио","Купель Щит и Люстра","Батареи и Потолок","Пещера Люстра"];
IR.AddListener(IR.EVENT_START,0,function(){
//добавляем цифру к названию кнопки
for (var i = 0; i < relay.length; i++) {
if (i > 9) {
relay[i] = i + relay[i];
Log(relay[i]);
} else {
relay[i] = "0" + i + relay[i];
Log("добавляем ноль " + relay[i]);
};
}; MakePanelID();
InitController();
NewPopup (testPopup);
IR.ShowPopup(testPopup)

// создаем список выключателей, и заполняем кнопками
IR.GetItem(testPopup).CreateItem(IR.ITEM_LISTBOX,"Выключатели",0,0,750,1344);
test_list = IR.GetItem(testPopup).GetItem("Выключатели");
test_list.Template = "Шаблон Списка Выключателей";

for (var i = 0; i < relay.length; i++) {
var val = IR.GetDevice("amx").GetFeedback(relay[i]);
test_list.CreateItem(i, 1,{Text: relay[i].slice(2), Value: val});
Log("Кнопка '" + relay[i] + "' создана со значением Value '" + val+ "'" );
};

Log("---------------------------------------------");


IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value){

var i = Number(name.slice(12,14));
Log (name.slice(12,14) + "номер элемента списка " + i);
test_list.CreateItem(i, 1,{Text: relay[i].slice(2), Value: value});
Log("Глобальный слушатель активирован для: '" + name + "' со значением Value: '" + value)+"'";
Log("Relay[i]: "+relay[i]+", Val: "+val+", i: "+ i);
Log("---------------------------------------------");
}); for (var i = 0; i < relay.length; i++) {
IR.SubscribeTagChange("Drivers.amx."+relay[i]);
Log ("relay[i]: " + relay[i]);
};
IR.AddListener(IR.EVENT_LIST_ITEM_CHANGE, test_list, function(Item, Subitem, TypeEvent, object){
var tempnum = TypeEvent;
if(tempnum==12) {
amx.Set(relay[Item],1);
amx.Set(relay[Item],0);
};
});
});

Я использую "глобальный" массив типа

events[port][channel]

В глобальном слушателе идет проверка

if (events[port][channel]!==undefined) events[port][channel].Event(parseInt(value));

Элементами массива являются ссылки на объекты с необходимыми функциями

инициализация вида

buttons[1]=new BtnElement({Txt: "Вход", Color: 1, Port: 1, Channel: 123);
var BtnElement = function(o)
{
    this.Name=o.Txt;
    this.Color=o.Color;
    this.Object=test_list.CreateItem( .. //Clone( ..
    events[o.Port][o.Channel]=this; //events[o.Port] === Array
    IR.AddListener(IR.EVENT_ITEM_PRESS, this.Object, this.Do, this);
};
//BtnElement.constructor = function1
BtnElement.prototype.Event = function(value) 
{
    this.Object.Text = (value) ?  "Yes" : "No";
    ...
};
BtnElement.prototype.Do = function() 
{
    this.Object.Text="Yepp!";
    this.OtherObject.Color=this.Color;
    ...
};

В вашем примере для массива наверно можно использовать индексы Item, Subitem