Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как сделать, чтобы вместо instance6 писало само имя переменной экземпляра класса? (http://www.flasher.ru/forum/showthread.php?t=211501)

nelco 13.09.2015 03:44

как сделать, чтобы вместо instance6 писало само имя переменной экземпляра класса?
 
существует слушатель:
Код AS3:

_button1.addEventListener(MouseEvent.CLICK, mouseClickListener);

где _button1 имеет тип Button;

какое свойство и у какого объекта в функции mouseClickListenera вернёт именно название _button1?
e.currentTarget возвращает [Object Button], а e.currentTarget.name возвращает instance6 вместо самого имени кнопки (_button1)... как сделать, чтобы возвращалось именно само имя экземпляра? а то мне приходится цепляться в условии за сам текст текстового поля, вместо названия кнопки, а это не правильно... :\

Код AS3:

 
                private function mouseClickListener(e:MouseEvent):void
                {       
 
 
                        if (e.target.text == "arrays"){
 
                                _floatingCont = new FloatingCont("C://Arrays.as");
                                addChild(_floatingCont);
 
                        }
                        if (e.target.text == "textFields") {
 
                                _floatingCont = new FloatingCont("C://textForLoad.txt");
                                addChild(_floatingCont);
 
                        }
 
                }


udaaff 13.09.2015 04:45

_button1 - это не имя экземпляра кнопки, это имя переменной, которая хранит ссылку на объект кнопка и бессмысленно пытаться получить название этой переменной, т.к. это просто "хранитель ссылки", коих может быть сколько угодно с какими угодно именами. Что можно сделать, так это записать желаемое имя в свойство name.

nelco 13.09.2015 05:38

Цитата:

Сообщение от udaaff (Сообщение 1186649)
_button1 - это не имя экземпляра кнопки

я думал ИМЯ ЭКЗЕМПЛЯРА это и есть ИМЯ ПЕРЕМЕННОЙ :\ если у меня написано в поле класса private var _button1:Button = new Button(); , то _button1 - это имя ПЕРЕМЕННОЙ экземпляра? а имя экземпляра - это _button1.name = "name"? как коду отличать _button1.addEvetnListener от _button2.addEvenlistener без присваивания имени _button1 и button2? за сами названия _button1 и _button2 нельзя никак зацепиться без присваивания имени?

Wolsh 13.09.2015 11:16

Код AS3:

                private function mouseClickListener(e:MouseEvent):void 
                {       
 
 
                        if (e.currentTarget == _button1){
 
                                _floatingCont = new FloatingCont("C://Arrays.as");
                                addChild(_floatingCont);
 
                        }
                        if (e.currentTarget == _button2) {
 
                                _floatingCont = new FloatingCont("C://textForLoad.txt");
                                addChild(_floatingCont);
 
                        }
 
                }


ZackMercury 13.09.2015 11:25

Имя экземпляра(Instance name) было придумано исключительно для Flash IDE, для кода в кадрах. Больше не знаю мест, где оно используется.
Получать имя переменной нет смысла, имея на неё ссылку.
Вообще, судя по всему вы хотели сделать как-то так

Код AS3:

var button:Button = new Button();
button.label = "В игру!";
var button2:Button = new Button();
button2.label = "Выйти...";
button2.x += button1.width;
addChild(button);
addChild(button2);
button.addEventListener(MouseEvent.CLICK, onButtonHit);
button2.addEventListener(MouseEvent.CLICK, onButtonHit);
 
function onButtonHit(e:MouseEvent):void
{
  var label:String = (e.currentTarget as Button).label;
  switch(label)
  {
      case "В игру!":
        //Заходим в игру
        break;
      case "Выйти...":
        //Выходим
        break;
  }
}

или как Wolsh написал выше.

nelco 13.09.2015 19:46

спасибо! я хотел сделать так, как написал Wolsh (т.е. меньше кода, без присваивания параметра .name или .label), но e.currentTarget возвращало мне [object Button], поэтому я думал, что от обеих кнопок e.currentTarget будет возвращать одинаково [object Button] и не получится их так отличать, как написал Wolsh, но оказывается - получается. Теперь вот пробую сделать удаление контейнера с текстом (который открывается при нажатии на эти кнопки) и выходит ошибка, буду опять спрашивать в новой теме если сейчас не разберусь сам. Спасибо за ответы, за помощь! :)

ZackMercury 13.09.2015 23:06

Цитата:

где _button1 имеет тип Button;
Цитата:

(т.е. меньше кода, без присваивания параметра .name или .label)
Тоесть ваши кнопки без заголовка?

nelco 14.09.2015 01:50

Цитата:

Сообщение от ZackMercury (Сообщение 1186681)
Тоесть ваши кнопки без заголовка?

заголовок - это label? да, без него... для чего он нужен? чтобы обращаться к кнопке? по имени переменной нельзя обратиться будет? я просто только начинаю изучать AS3 поэтому вообще ничего ещё не знаю.

Isfet 14.09.2015 08:52

Цитата:

Сообщение от nelco (Сообщение 1186695)
заголовок - это label? да, без него... для чего он нужен? чтобы обращаться к кнопке?

чтобы имея ссылку на кнопку, понять что это за кнопка, как вы поймете что это за кнопка, если у вас все кнопки хранятся не в переменных, а, допустим, в массиве?

Wolsh 14.09.2015 13:15

nelco, для начала Вам хорошо бы понять, что такое ссылка, объект, экземпляр, переменная, свойство. Изучать программирование методом тыка чертовски занимательно, но крайне непродуктивно. Советую почитать книги, или хотя бы статьи в интернет.
Все объекты в AS3 являются экземплярами классов (и сами классы тоже могут рассматриваться как объекты). Для обращения к этим экземплярам используются ссылки. Ссылки хранятся в переменных, которые могут быть как зафиксированными свойствами экземпляров или классов, так и временными "локальными" переменными функций — к таким переменным нет доступа извне функции, и живут они только то время, пока выполняется функция. Ссылка на один и тот же объект может храниться в любом количестве переменных в самых разных "местах" программы. Например, все визуальные объекты имеют свойство .stage, хранящее ссылку на сцену (область отображения плеера). Сцена всегда одна, а ссылки на нее могут иметь тысячи объектов в своих собственных переменных. Из этого надо понять, почему объекты ничего не знают о ссылках на них, и нельзя спросить у объекта это вот "_button1". Потому что может быть он одновременно и "_button_А" и еще чёрти что. Мало того, переменная потому и "переменная", что в нее в любой момент может быть записана ссылка на другой объект, и тогда Ваша _button1 перестанет быть как-то вообще связанной с данной конкретной кнопкой.
Физически, ссылка — это адрес объекта в памяти, номер байта в памяти, с которого начинается описание объекта. У объектов больше нет никаких собственных уникальных имён, по которым можно было бы обратиться к ним из любого места программы.
Есть фиксированное свойство .name, которое является переменной строкового типа и может хранить какую-то строку. Но эта строка не уникальна, то есть Вы можете ВСЕ свои кнопки "назвать" одинаково, плееру до лампочки, что Вы туда записываете.
Да, еще запомните, что переменные могут хранить не только ссылки на объекты, но и значения так называемых "простых типов" — строки и числа, которые "как бы" сами по себе не являются объектами. То есть переменные типа :String и :Number (:int, :uint) не хранят ссылку, а просто число или строку.
С другой стороны, ссылки могут храниться не только в формально объявленных переменных (var), но и в ячейках массивов. Когда все ссылки на объект исчезают (хранящие их переменные обнуляются или начинают ссылаться на другой объект, или объект-"хозяин" переменных удаляется), то такой объект будет автоматически удален из памяти, чтобы не загромождать ее. Поскольку к нему больше нет доступа и он "никому не нужен".


Часовой пояс GMT +4, время: 19:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.