![]() |
как сделать, чтобы вместо instance6 писало само имя переменной экземпляра класса?
существует слушатель:
Код AS3:
какое свойство и у какого объекта в функции mouseClickListenera вернёт именно название _button1? e.currentTarget возвращает [Object Button], а e.currentTarget.name возвращает instance6 вместо самого имени кнопки (_button1)... как сделать, чтобы возвращалось именно само имя экземпляра? а то мне приходится цепляться в условии за сам текст текстового поля, вместо названия кнопки, а это не правильно... :\ Код AS3:
|
_button1 - это не имя экземпляра кнопки, это имя переменной, которая хранит ссылку на объект кнопка и бессмысленно пытаться получить название этой переменной, т.к. это просто "хранитель ссылки", коих может быть сколько угодно с какими угодно именами. Что можно сделать, так это записать желаемое имя в свойство name.
|
Цитата:
|
Код AS3:
|
Имя экземпляра(Instance name) было придумано исключительно для Flash IDE, для кода в кадрах. Больше не знаю мест, где оно используется.
Получать имя переменной нет смысла, имея на неё ссылку. Вообще, судя по всему вы хотели сделать как-то так Код AS3:
|
спасибо! я хотел сделать так, как написал Wolsh (т.е. меньше кода, без присваивания параметра .name или .label), но e.currentTarget возвращало мне [object Button], поэтому я думал, что от обеих кнопок e.currentTarget будет возвращать одинаково [object Button] и не получится их так отличать, как написал Wolsh, но оказывается - получается. Теперь вот пробую сделать удаление контейнера с текстом (который открывается при нажатии на эти кнопки) и выходит ошибка, буду опять спрашивать в новой теме если сейчас не разберусь сам. Спасибо за ответы, за помощь! :)
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
nelco, для начала Вам хорошо бы понять, что такое ссылка, объект, экземпляр, переменная, свойство. Изучать программирование методом тыка чертовски занимательно, но крайне непродуктивно. Советую почитать книги, или хотя бы статьи в интернет.
Все объекты в AS3 являются экземплярами классов (и сами классы тоже могут рассматриваться как объекты). Для обращения к этим экземплярам используются ссылки. Ссылки хранятся в переменных, которые могут быть как зафиксированными свойствами экземпляров или классов, так и временными "локальными" переменными функций — к таким переменным нет доступа извне функции, и живут они только то время, пока выполняется функция. Ссылка на один и тот же объект может храниться в любом количестве переменных в самых разных "местах" программы. Например, все визуальные объекты имеют свойство .stage, хранящее ссылку на сцену (область отображения плеера). Сцена всегда одна, а ссылки на нее могут иметь тысячи объектов в своих собственных переменных. Из этого надо понять, почему объекты ничего не знают о ссылках на них, и нельзя спросить у объекта это вот "_button1". Потому что может быть он одновременно и "_button_А" и еще чёрти что. Мало того, переменная потому и "переменная", что в нее в любой момент может быть записана ссылка на другой объект, и тогда Ваша _button1 перестанет быть как-то вообще связанной с данной конкретной кнопкой. Физически, ссылка — это адрес объекта в памяти, номер байта в памяти, с которого начинается описание объекта. У объектов больше нет никаких собственных уникальных имён, по которым можно было бы обратиться к ним из любого места программы. Есть фиксированное свойство .name, которое является переменной строкового типа и может хранить какую-то строку. Но эта строка не уникальна, то есть Вы можете ВСЕ свои кнопки "назвать" одинаково, плееру до лампочки, что Вы туда записываете. Да, еще запомните, что переменные могут хранить не только ссылки на объекты, но и значения так называемых "простых типов" — строки и числа, которые "как бы" сами по себе не являются объектами. То есть переменные типа :String и :Number (:int, :uint) не хранят ссылку, а просто число или строку. С другой стороны, ссылки могут храниться не только в формально объявленных переменных (var), но и в ячейках массивов. Когда все ссылки на объект исчезают (хранящие их переменные обнуляются или начинают ссылаться на другой объект, или объект-"хозяин" переменных удаляется), то такой объект будет автоматически удален из памяти, чтобы не загромождать ее. Поскольку к нему больше нет доступа и он "никому не нужен". |
Wolsh, спасибо за такой большой ответ, я читаю книгу, сейчас читаю Колина Мука на 540 странице, потом буду читать Adobовское руководство, а потом ActionScript Cookbook... к сожалению, не всё, что в книге полностью понятно с первого раза, приходится постоянно перечитывать, и даже после этого остаются многие непонятные моменты, которые и планирую спрашивать тут, хорошо, что есть такой форум, где отвечают!
код писать начал, т.к. решил, что без практики многое из теории сразу забывается и намного эффективнее пытаться сразу применить знания на практике, чтобы запомнилось лучше. что такое экземпляр, переменная, свойство я понимаю, а вот про ссылку и заголовок - вроде не было объяснения у Колина Мука... ссылка - это, получается, как бы сама связь, которая указывает на объект в памяти? _button1 - это переменная-ссылка? заголовок - это cвойство .label? (просто в адобовском руководстве оно переводится как МЕТКА) про stage тоже не совсем понятно, если stage - только один и нет другого stage (у объектов своего), то пока не вижу смысла обращаться к stage через объект (_object.stage) все объекты же, получается, принадлежат одному stage? только находятся в разных DisplayObjectContaineraх... но с этим, думаю, разберусь по мере практики... Добавлено через 2 минуты Цитата:
|
Isfet, разве?
Я думал, label нужен, чтобы на кнопке появлялся текст))) И без него кнопка не кнопка. Так что удобнее читать будет свитч именно по заголовку, ибо он отображает текст кнопки. К тому же, да, когда кнопки в массиве это играет добрую роль. P.S. Да, всё верно, в справке написано метка, и label переводится как метка, но правильней это называть "Заголовок кнопки", так принято. И это грех эдобовцев, так как следовало дать имя свойству caption. |
Цитата:
|
Цитата:
Написать button.label = "blabla"; интуитивно понятнее, чем button.label.caption = "blabla"; |
Цитата:
У всех контейнеров есть так называемый СписокОтображения (Display List). Это не класс, это абстрактное понятие (физически реализованное чем-то вроде скрытого массива). Само понятие "добавить объект в контейнер" означает добавить объект в список отображения контейнера. Пока объект не добавлен ни в один список, он не будет отображаться на экране и [автоматически] взаимодействовать с другими объектами, которые отображаются. При добавлении одного контейнера в другой, его список включается в список старшего ("родителя" — parent). Если родитель сам никуда не добавлен, то и "ребенок" (child) тоже не будет отображаться. Чтобы объект появился на экране, он должен быть в списке отображения стейджа, то есть ВСЕ его старшие контейнеры должны в конечном итоге быть добавлены в мейн, который автоматически добавлен на стейдж. Представьте стейдж как пустое пространство, в котором находится огромный аквариум — мейн. В аквариуме могут лежать камни, и другие стеклянные банки, в которых камни или еще стеклянные баночки, в которых камни, и так [почти] до бесконечности. Если какую-то стеклянную банку вытащить, то будет изъято из аквариума и все ее содержимое. Оно больше не в аквариуме, не в списке отображения стейдж, хотя и остается в своей банке — в списке отображения своего контейнера. Просто контейнер больше не в списке отображения стейдж. |
спасибо за ответы! главное - понял, что stage - ОДИН! :) с displayList и DO in DOC разобрался, вот сижу с событиями теперь разбираюсь, опять непонятно за что цепляться слушателем в parent объектах при диспетчеризации события из ребёнка... буду спрашивать в новой теме
Добавлено через 17 минут Цитата:
|
о боже, я ш сказал, label - это надпись на кнопке...
|
Цитата:
|
Код AS3:
|
а, всё, понял, значит label есть только у объектов типа Button, значит для Spritов и TextFieldoв он не подходит, для них видимо используется свойство .name? буду пробовать, спасибо ещё раз за ответ!
|
нейм здесь вообще не при чём, ещё раз
http://cs624828.vk.me/v624828630/45376/icKUNeH3zsc.jpg label - это текст, который пишется в кнопке, т.е. появляется посередине кнопки. мы свитчим по нему только потому, что это удобно читать. это не "обозначение кнопки", а "то, что написано в кнопке". Спрайты как правило свитчатся по ссылкам. |
Цитата:
Код AS3:
гдe textField1 и textField2 - объекты типа Textfield Код AS3:
ведь trace (e.target) выдавало мне instance6 (не равно textField1), хотя условие e.target==textField1 выполняется, поэтому я спрашивал какое свойство объекта вернёт textField1, но все сказали, что НЕТ СМЫСЛА ПОЛУЧАТЬ ЭТО ЗНАЧЕНИЕ т.к. это имя переменной и видимо нет такого свойства вообще... теперь Вы говорите СПРАЙТЫ КАК ПРАВИЛО СВИТЧАТСЯ ПО ССЫЛКАМ... что такое ссылка тогда не понимаю, это не имя переменной? :\\ |
Именно имя переменной.
Код AS3:
То, что вы трейсите экземпляры классов - это не выведет имя объекта, это выведет имя класса. Что делает функция trace()? У всего, шо она выводит она вызывает метод toString(). |
а если у меня в массиве - спрайты, то их отличать по свойству .name?
|
Если у вас спрайты одного типа/интерфейса/экземпляры одного класса, то смысла в свитче вообще нет.
Напрямую вызывайте у него его методы/меняйте свойства через (e.currentTarget as Sprite) А если в массиве совершенно разные объекты - то это неправильно. |
Цитата:
Цитата:
Сложные типы передаются по ссылке. В чем разница: Код AS3:
Код AS3:
|
Цитата:
Можно просто сделать так: Код AS3:
что-то типа: Код AS3:
Цитата:
|
Вот так один плохой совет приводит к жуткой неразберихе.
.label и .name совершенно разные по смыслу свойства. Лейбл это метка, отображаемая на контролах (элементах интерфейса — кнопках, радио-буттонах, чекбоксах и т.п.), предназначенная для пользователя, чтобы он знал, что за кнопка перед ним нарисована, что она будет делать. Совет использовать лейбл для опознания кнопки в коде — плохой, потому что во-первых лейбл может быть не задан вообще, во-вторых лейбл может быть не текстом а иконкой, в-третьих, надпись на разных кнопках может быть одинаковой ("ок" например), и в-четвертых текст лейбла может меняться во время исполнения программы, в зависимости от контекста или в разных режимах. Свойство .name наследуется всеми объектами от суперкласса Object. Оно есть у ВСЕХ экземпляров всех классов. Но это просто переменная типа String (строка), которое опять же может быть не определено, может быть одинаковым и может меняться в процессе исполнения программы. Не рекомендуется пользоваться для идентификации ни тем, ни другим. Лейбл — просто вообще не для этого. Нейм можно юзать под свою ответственность. Но идеально будет организовать все так, чтобы не приходилось полагаться на переменчивые свойства объектов. Это все-равно как различать спрайты по ширине. Если у Вас "спрайты в массиве", то Вы должны понимать, зачем их туда запихнули. Массив предполагает упорядоченность, структуру, и предоставляет методы для работы именно с порядком. У всех элементов есть индексы, описывающие место элемента в структуре. Это не мешок картошки, а точная картотека ссылок. Единственная ситуация, когда требуется дополнительный напряг, это ситуация с определением индекса в массиве элемента, пославшего событие. То есть, ссылка на сам элемент у Вас есть (e.target), но его индекс Вы не знаете, а это нужно для обработки события по логике (допустим, в игре Пятнашки). Тогда лучший способ — завести у всех элементов дополнительные свойства. В случае пятнашек это .id, хранящее номер фишки (можно использовать .name) и два индекса — строка и колонка (вертикаль и горизонталь), которые будут меняться в процессе игры и хранить положение в массиве (то есть, имея ссылку на фишку, Вы сможете спросить у нее номер и положение в массиве/на поле). |
| Часовой пояс GMT +4, время: 20:59. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.