Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Доступ к локальной переменной "извне" (http://www.flasher.ru/forum/showthread.php?t=131200)

Ynks 15.10.2009 00:58

Доступ к локальной переменной "извне"
 
Салют! В AS3 начинающий. Поэтому стлокнулся с такой вот трудностью. Есть код:
Код AS3:

var tfCount:int;
function xmlLoadComplete(event:Event):void
                {
                        var newsPaper:XML = new XML(event.target.data);
                        var newsCount:int =  newsPaper.@count;
                }

Глобальная перменная tfCount - это кол-во элементов массива, которое зависит от кол-ва новостей в XML файле. Локальная переменная newsCount - это и есть кол-во новостей. Мне нужно глоб. переменной tfCount присвоить значение newsCount.

Как это сделать? Только без технарских замашек, а так, чтобы понятно было. Ну или предложите альтернативную реализацию. Просто не хочется весь остальной код писать в функции xmlLoadComplete. Спасибо.

Возможно уже и была такая, тема. Даже я ее нашел вроде-бы, но там так написано все, что находясь на моем уровне знаний AS3 сложно понять.

Lecosson 15.10.2009 01:29

Код AS3:

var tfCount:int;
function xmlLoadComplete(event:Event):void
                {
                        var newsPaper:XML = new XML(event.target.data);
                        var newsCount:int =  newsPaper.@count;
                        tfCount=parseInt(newsCount);
                }


Ynks 15.10.2009 10:05

Насколько я знаю parseInt преобразовывает String в Int. Но это не делает доступной мою переменную newsCount вне функции.

Задача у меня такая, чтобы обработать весь XML, вытянуть с него все и позаливать в переменные. Все. А потом уже у других функциях удобно с ними рабтать, а не в xmlLoadComplete все делать. Кото, что подскажет?

kackbip 15.10.2009 10:15

Нука внимательнее приглядитесь к варианту предложенному Lecosson. он не обращается к newsCount вне функции и притом выполняет поставленную вами задачу - "вытянуть в сего все и позаливать в переменные".

Ynks 15.10.2009 10:27

Хм, либо я чего-то не пойму либо вы. newsCount - это уже int. Зачем его снова в int преобразовывать? Это раз, а два — это то, что при таком коде:
Код AS3:

var tfCount:int;
function xmlLoadComplete(event:Event):void
                {
                        var newsPaper:XML = new XML(event.target.data);
                        var newsCount:int =  newsPaper.@count; //newsCount = 8;
                        tfCount=newsCount; //либо parseInt(newsCount) — этот код не работает, только что попробовал;
trace(tfCount);//Выведет 8
                }
trace(tfCount);//Выведет 0

Истинное значение tfCount не будет доступно вне функции. А нужно, чтобы вне функции tfCount тоже был равен 8. Вот.

alecsisk 15.10.2009 10:33

tfCount'у присваивается 8 только после выполнения xmlLoadComplete. После tfCount=newsCount вызывайте нужную вам функцию в которой будет дальнейшее выполнение программы.

incoob 15.10.2009 10:35

напишите просто
Код AS3:

tfCount=newsCount

скорее всего Lecosson просто не обратил внимания на тип
Код AS3:

newsCount

и подумал, что это строка

PS локальные переменные не видны вне области метода

Ynks 15.10.2009 10:41

Цитата:

После tfCount=newsCount вызывайте нужную вам функцию в которой будет дальнейшее выполнение программы.
Но при вызове этой функции tfCount будет равен все-равно 0, а не 8.

Если пишу просто tfCount=newsCount — то см. мой код выше. Результат есть, но не тот, что нужно. :)

Цитата:

PS локальные переменные не видны вне области метода
Вот в этом-то и дело... :( А как мне тогда быть?
Не хочу остальной код новостоного модуля своего (я его делаю) писать в функции xmlLoadComplete...

alecsisk 15.10.2009 10:53

А вы проверяли ?
Код AS3:

var tfCount:int;
xmlLoadComplete(null);
 
function xmlLoadComplete(event:Event):void {
        tfCount=8;
        someMethod();
}
 
 
function someMethod():void {
        trace(tfCount); // 8
}

Цитата:

Если пишу просто tfCount=newsCount — то см. мой код выше. Результат есть, но не тот, что нужно.
Код AS3:

var tfCount:int;
function xmlLoadComplete(event:Event):void
                {
                        var newsPaper:XML = new XML(event.target.data);
                        var newsCount:int =  newsPaper.@count; //newsCount = 8;
                        tfCount=newsCount; //либо parseInt(newsCount) — этот код не работает, только что попробовал;
trace(tfCount);//Выведет 8
                }
trace(tfCount);//Выведет 0

естественно. Вы думаете что сначала компилятор выполнит xmlLoadComplete, а затем trace(tfCount). Но сначала выполняется trace(tfCount) //0, а затем приходит событие xmlLoadComplete, где уже tfCount == 8.

incoob 15.10.2009 11:00

Цитата:

Сообщение от Ynks (Сообщение 857977)
Не хочу остальной код новостоного модуля своего (я его делаю) писать в функции xmlLoadComplete...

вы свой код вызывайте из xmlLoadComplete

Ynks 15.10.2009 11:16

Цитата:

вы свой код вызывайте из xmlLoadComplete
Да, так можно. Но это всю программу надо туда запхнуть... как-то по-чайниковски мне кажется, может есть красивый способ :)

Хм, что-то я все пробую, что вы советуете и безрезультатно...
Тогда приведу в пример код, кот. идет у меня дальше, может сиуация разъяснится :)

Код AS3:

var tfCount:int; //Кол-во текстовых полей (новостей)
        xmlLoadComplete(null);
function xmlLoadComplete(event:Event):void
                {
                        var newsPaper:XML = new XML(event.target.data);
                        var newsCount:int =  newsPaper.@count; //8 новостей в XML файле
                                tfCount = newsCount;
                }
var tf:Array = new Array(); //массив текстовых полей
        for (var i:int=0; i<tfCount; i++)
                {...

В итоге массив у меня должен быть от 0 до 8, а получается от 0 до 0. Так как tfCount вне xmlLoadComplete равна нулю.

alecsisk 15.10.2009 11:17

Прочитайте внимательно полностью моё последнее сообщение.

Код AS3:

var tfCount:int; //Кол-во текстовых полей (новостей)
function xmlLoadComplete(event:Event):void {
        var newsPaper:XML = new XML(event.target.data);
        var newsCount:int =  newsPaper.@count; //8 новостей в XML файле
        tfCount = newsCount;
        someMethod();
}
 
function someMethod():void {
        var tf:Array = new Array(); //массив текстовых полей
        for (var i:int=0; i<tfCount; i++) {};
}


Ynks 15.10.2009 11:33

Ух... сработало :) Спасибо.
Но возникли попутные вопросы:
1. Как этот способ называется? Ну в смысле что мы сделали? Создали новую ф-ю и передали в ее все или как... как это сказать? :)
2. Я попробовал. Теперь массив tf у меня оказался внутри новой ф-ии someMethod (к примеру) и все, что ниже массива и то, что от него зависит — перестало работать, так как массив тоже стал как бы локальным. Как теперь быть? С новой этой ф-ии someMethod таким же способом передавать переменные и каждое действие засовыват в отдельную нову. ф-ю?

alecsisk 15.10.2009 11:46

1. Мы ничего не передавали. tfCount, если обьяснить проще глобальная и доступна из любой нашей функции.
2. Можно tf тоже обьявить вне функции чтобы сделать его доступной откуда угодно. Или передать в качестве аргумента (на примере tfCount):

Код AS3:

function xmlLoadComplete(event:Event):void {
        var tfCount:int; // tfCount локальная
        var newsPaper:XML = new XML(event.target.data);
        var newsCount:int =  newsPaper.@count; //8 новостей в XML файле
        tfCount = newsCount;
        someMethod(tfCount); // передаём tfCount
}
 
function someMethod(count:int):void {  // принимаем tfCount как count
        trace(count); // смотрим значение
        var tf:Array = new Array(); //массив текстовых полей
}

Вообще, то что мы сейчас обсуждаем уже давно не используется. Изучайте ООП, там всё делается гораздо проще.

Ynks 15.10.2009 11:58

Еще раз спасибо. То, что я узнал гораздно облегчит мою деятельность :) Удобно.

Цитата:

Вообще, то что мы сейчас обсуждаем уже давно не используется. Изучайте ООП, там всё делается гораздо проще.
Упс, а я думал, что как раз ООП и занимаюсь :) Видать, это не то, что я думаю.
alecsisk, если это реализовать гораздо проще — можешь показать тут маленькй примерчик такого же, что делал я только эм... в ООП? :)

Felicast 15.10.2009 12:23

Цитата:

Упс, а я думал, что как раз ООП и занимаюсь Видать, это не то, что я думаю.
вы пишете в кадрах - это не ООП.

Ynks 15.10.2009 12:28

Цитата:

вы пишете в кадрах - это не ООП.
Понял. Тогда в двух словах не объяснишь на примере ООП. Ок, спасибо.

Felicast 15.10.2009 13:08

Цитата:

Тогда в двух словах не объяснишь на примере ООП.
ты взорвал мой мозг этим выражением. явно напрашивается вопросительная интонация. но вконце ".". да еще и
Цитата:

Ок, спасибо.
а для того, чтобы мне что-нибудь объяснить, мне нужно знать формулировку задачи

Ynks 15.10.2009 13:13

Цитата:

а для того, чтобы мне что-нибудь объяснить, мне нужно знать формулировку задачи
Ты не так понял :) Скорее всего ты там увидел какую-то иронию. Нет. Я не просил объяснять. И не намекал, что мол ладно... спасибо. Нет. Прсто поблагодарил за объяснение, что имеется в виду под ООП. Проще на вещи смотри :)
Флудим...

alecsisk 15.10.2009 14:29

Вложений: 1
Ставь сразу FD (FlashDevelop), если хочешь чему-нибудь научиться. Если не хочешь, то укажи во Flash класс документа(document class) Main.as из папки src.

Ynks 15.10.2009 21:00

alecsisk, за вложение спасибо!
На счет FD подумаю, просто я больше дизайнер, нежели программист. Поэтому решаю задачи кодинга по мере их поступления и строго по надобности.


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

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