PDA

Просмотр полной версии : Доступ к компоненту Label


Coffein
18.11.2007, 18:51
Почему я не могу получить доступ к компоненту Label.text, который находится на клипе, который я приаттачиваю к основному(_root.attachMovie('inf','inf',1)) ?

если я его просто скидываю на основной клип этот компонет, то я могу изменять свойство text.
Вот пример:

udaaff
18.11.2007, 19:05
Приведите пример.

Coffein
18.11.2007, 19:06
уже привел, взгляните пожалуста.

glin
18.11.2007, 19:43
не первый раз не могу запустить скачанный пример в своем FlashMX 2004, 7-я версия... не пойму почему

Coffein
18.11.2007, 19:53
Наверно по тому что я использовал Macromedia flash 8 Pro.

Вот код в основном клипе:

stop();
_root.t1.text = "dsfffffffffffffffffff";
_root.attachMovie('clip','clip',2);
_root.clip.t2.text = "dsfffffffffffffffffff";


На основной клип скидываю компонент Label и даю ему имя t1, создаю еще один клип с именем clip, на него кидаю еще label и даю имя t2.

silin
18.11.2007, 20:04
дело здесь в том, что классы приаттаченного мувика еще не проинициализированы, когда ты пытаешься то text добраться..
в этом случае достаточно сделать это в следующем фрейме:
_root.attachMovie('clip','clip',2);
function onEnterFrame(){
_root.clip.t2.text = "222";
onEnterFrame=null;
}

Coffein
18.11.2007, 20:17
спасибо за помощь!

У меня вопрос, а что означает onEnterFrame=null;?

silin
18.11.2007, 22:16
да null и означает, не нужен он больше..

Coffein
19.11.2007, 01:00
А как сделать на оборот, чтобы активировать onEnterFrame?

silin
19.11.2007, 09:16
а наоборот, стало быть не null Ж)
function setTextLater(){
_root.clip.t2.text = "222";
onEnterFrame=null;
}
onEnterFrame=setTextLater;

Coffein
19.11.2007, 12:13
Попробывал, ни какого эффекта(неактивируется) - смотрел в хелпе, такой функции нет в Флеш 8, пробывал логическое значение - ошибка(Type mismatch in assignment statement: found Boolean where Function is required.)
числовое - все равно ошибка(...found Number where Function is required.)

aksios
19.11.2007, 14:11
Я ваще не догоняю, зачем это вам надо. Пачему Label и почему в мувиклипе нужен компонент UI. Ну я бы сделал все таки как то так.->
PS: 23 кило на вывод 2х строк текста. Ну ну.

silin
19.11.2007, 14:18
>>смотрел в хелпе, такой функции нет в Флеш 8

путаница:
такой функции действительно нет, это обработчик, который (если определен для мувика) будет вызываться на каждом такте (фрейме) плеера

определить его можно написав в кадре
function onEnterFrame(){
_root.clip.t2.text = "222";
onEnterFrame=null;
}
или присвоив onEnterFrame какой-то заранее определенный метод..
mc.onEnterFrame =someMethod;

соответсвенно mc.onEnterFrame =null убьет ссылку на функцию, обработчик не будет вызываться..


2aksios: Label.text не рид онли (с чего бы?), дело имеено в том, что доступ к сеттеру будет организован только в следующем кадре

iNils
19.11.2007, 14:21
Удалять надо, а не null присваивать.

silin
19.11.2007, 14:32
'надо' это слишком категорично..:)
'можно', 'лучше' (потому-то), 'удобнее' (потому-то) - еще куда ни шло..

iNils
19.11.2007, 15:28
Не, наоборот. Лучше ты объясни, почему не надо удалять, а присваивать null. Я вот не вижу ни одной причины для этого.

silin
19.11.2007, 15:42
нет, не наоборот: я же не говорил, что надо присваивать null, а не удалять :)

подозреваю, что есть нюансы, раз ты пишешь , но я, собственно, не встречал проблем с этим, типа халдеи (GC) подберут..), может потому так беспечен..

wvxvw
19.11.2007, 16:30
На самом деле удалить онЕнтерФрейм нельзя %) т.е. он всегда существует у любого потомка МувиКлипа (Вернее, даже не так, все потомки МувиКлипа подписаны на событие с одноименным названием.). Но с практической точки зрения, лучше делать то, что предлагает iNils. Т.как "сборщик мусора" на каком-то этапе почистит место в памяти отведенное под этот ентерФрейм, а если присвоить ему значение - то он не будет чистить его никогда.

silin
19.11.2007, 16:43
>>удалить онЕнтерФрейм нельзя %) т.е. он всегда существует

путаница: onEnterFrame это ссылка на метод, плеер всегда пытается его вызвать, и если он определен (существует) то и вызовется, если нет, то и не надо..

>>а если присвоить ему значение - то он не будет чистить его никогда.

тоже путаница:
onEnterFrame всего лишь ссылка на метод, ее-то мусорщик все равно не трогает, речь о методе на который onEnterFrame ссылается
после delete onEnterFrame;
onEnterFrame будет undefined;
после onEnterFrame=null;,соотвественно null
и в том и в другом случае сборщик удалит метод на который ссылался onEnterFrame

Coffein
19.11.2007, 21:47
определить его можно написав в кадре

Так я так и сделал, все равно не идет, вот взгляните:

silin
20.11.2007, 00:20
все как написано, так и работает
что "не идет" не понятно..

Coffein
20.11.2007, 00:25
почему тогда приатаченный клип не начинает двигаться?

silin
20.11.2007, 00:32
у меня двигается..

terbooter
20.11.2007, 07:09
У меня тоже работает так как и написано.
При первом щелчке останавливается при втором меняет текст.

Если проблема не решена, то попробуй использовать setInterval
закомменентируй
/*function onEnterFrame(){
_root.clip.t2.text = "222";
_root.clip._x++;
//onEnterFrame=null;
}
*/
И добавь
ID = setInterval(initLabel, 10);
function initLabel()
{
_root.clip.t2.text = "222";
}

У меня хватает 10 милисикунд для инициализации компонента.
Когда впервые я наткнулся на твою проблему, то был несколько озадачен.
Я перепробовал много стандартных компонентов - 10 милисекунд хватает всем

Про delete onEnterFrame и onEnterFrame = null
Давным давно я как то пытался удалить обработчик с помощью delete,
а он никак не хотел удаляться (может руки тогда совсем кривые были ...)
И тут я увидел в каком-то исходнике onEnterFrame = null, заменил у себя
и все заработало!
С тех пор у меня мистический страх перед delete
-))))))))

Coffein
20.11.2007, 11:39
подождите ...может я что то не понимаю.... вот при зупуске клипа у меня начинает двигаться "222", при клике он останавливается, после второго клика, изменяется надпись и, как я понял, клип "222" должен снова начать двигаться. Или я ошибся?

silin
20.11.2007, 11:48
да,
после второго клика onEnterFrame=echo;
т.е. чтоб клип двигался нужно в echo() добавить _root.clip._x++;

wvxvw
20.11.2007, 14:16
...
onEnterFrame это ссылка на метод, плеер всегда пытается его вызвать, и если он определен (существует) то и вызовется, если нет, то и не надо..
...
Хм, не, не совсем так... null - это значение, т.е. по логике плеера, нужно будет вызвать метод, посчитать чего получилось и т.д... конечно, считать там нечего, но попытка все равно будет. В случае, когда это undefined - даже попытки посчитать не будет. Я не думаю, что будет заметная разница в производительности, но в глобальной перспективе все-таки делит лучше, в конце концов, это его непосредственное назначение =)

silin
20.11.2007, 14:30
очень может быть, что и так..
зы: 'в глобальной перспективе' это removeEventListener :)
delete там (в этой перспективе) вообще почти не при делах

Coffein
20.11.2007, 17:20
Понятно, теперь разобрался, спасибо silin.