Форум 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=140205)

Anti 23.05.2010 17:19

вытащить значение переменной из функции
 
есть функция в которой определена переменная next:
Код:

public function onGetTime(t:String):void {
          var next:Date = new Date(t);
          var ed:TextField=evendate;
          ed.text+=new Date(t);
          trace('', t);
          trace('', next);
         
  }
var nextsession:Date = ?;

Подскажите как переменной nextsession присвоить значение другой переменной next из функции, т.к. за пределами функции переменная next не определена. :rolleyes:
может не правильно сформулировал вопрос, во флеше я новичек.

HotIceCream 23.05.2010 17:28

ну а почему просто next не сделать глобальной?

Код AS3:

var next:Date;
public function onGetTime(t:String):void {
          next = new Date(t);
          var ed:TextField=evendate;
          ed.text+=new Date(t);
          trace('', t);
          trace('', next);
 
  }
var nextsession:Date = next;


Anti 23.05.2010 17:49

сделал так
Код AS3:

var next:Date;
public function onGetTime(t:String):void {
        next = new Date(t);
        var ed:TextField=evendate;
        ed.text+=new Date(t);
        trace('', t);
        trace('', next);
}
var nextsession:Date = next;

не получилось
Код:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at Timer/frame1()
 May 28 07:00:00 GMT+0000 2010
 Fri May 28 10:00:00 GMT+0300 2010

в общем немного объясню суть, может это можно сделать гораздо проще:
из файла php передается значение переменной:
May 28 07:00:00 GMT+0000 2010 - это дата события в формате UTC
next = new Date(t);// в данном случае берет эту строку и преобразует её с учетом часового пояса пользователя в Fri May 28 10:00:00 GMT+0300 2010

дальше идет код таймера, в котором первой строчкой определялась дата события
var nextsession:Date = new Date(Date.UTC(2010, 04, 28, 7, 0, 0, 0));// если забить руками, то все работает, но мне это не подходит, нужно чтобы переменной nextsession=next

Добавлено через 11 минут
а если еще проще сказать, то мне необходимо данные t:String загнать в глобальную переменную
Код AS3:

var nextsession:Date=new Date(t);

только проблема в том, что переменная t, как и все переменные функции onGetTime действуют только в пределах этой фонкции. Подозреваю что это сделать просто, только ума пока не хватает..

КорДум 23.05.2010 18:43

Сделать функцию возвращающей значение через return. Как вариант.

Anti 23.05.2010 19:04

Можно пример на моем коде? Не совсем допонял.

HotIceCream 23.05.2010 19:06

Инетерсно в какой строчке ошибка... подозреваю что в var nextsession:Date = next;

Код AS3:

var nextsession:Date;
public function onGetTime(t:String):void {
        nextsession = new Date(t);
        var ed:TextField=evendate;
        ed.text+=new Date(t);
        trace('', t);
        trace('', nextsession);
}

а если так?

Anti 23.05.2010 19:10

Цитата:

Сообщение от HotIceCream (Сообщение 910400)
Инетерсно в какой строчке ошибка... подозреваю что в var nextsession:Date = next;

Код AS3:

var nextsession:Date;
public function onGetTime(t:String):void {
        nextsession = new Date(t);
        var ed:TextField=evendate;
        ed.text+=new Date(t);
        trace('', t);
        trace('', nextsession);
}

а если так?

не идет, внутри функции nextsession имеет значение, за пределами null, а необходимо вытащить значение переменной именно из функции. И мне как раз понятно, почему значение 0, потому что значение переменной присвоено внутри функции и за её пределами на эту переменную не распространяется.

HotIceCream 23.05.2010 19:18

нет, не поэтому.
Что вы дальше делаете с nextsession ? Смысл в том, что вы скорее всего обрабатываете nextsession уже дальше еще до того, как вызовется функция onGetTime

КорДум 23.05.2010 19:21

Код AS3:

переменная = функция(передача параметров);
 
функция (передача параметров):ТипВозвращаемогоЗначения {
        что-то делает;
        return локальная переменнаяЭтойФункции;
}

Но это, наверно, не для вашего случая.

Anti 23.05.2010 19:30

Цитата:

Сообщение от HotIceCream (Сообщение 910403)
нет, не поэтому.
Что вы дальше делаете с nextsession ? Смысл в том, что вы скорее всего обрабатываете nextsession уже дальше еще до того, как вызовется функция onGetTime

дальше идет код таймера обратного отсчета, которому нужно значение nextsession - это время события до которого мы считаем. но этот код прописан в кадре таймлайн
Код AS3:

var now:Date = new Date();
// Conditional to snap to frame 3 if it is xmas or past xmas
if (now >= nextsession) {
        gotoAndStop(3);
}
// Set the difference between the two date and times in milliseconds
var timeDiff:Number = nextsession.getTime() - now.getTime();
//Convert the timeDiff(which is in milliseconds) into regular seconds-minutes-hours-days       
//The Math.floor is the closest rounded integer that is less than or equal to the decimal number
var milliseconds:Number = Math.floor(timeDiff / 001);
var seconds:Number = Math.floor(milliseconds / 1000);
var minutes:Number = Math.floor(seconds / 60);
var hours:Number = Math.floor(minutes / 60);
var days:Number = Math.floor(hours / 24);       
// Set the remainder of the division vars above
hours %= 24;
minutes %= 60;
seconds %= 60;
milliseconds %= 1000;
// String all vars together for display
var timeRemaining:String = "Days= " + days + "    Hours= " + hours + "    Minutes= " + minutes + "    Seconds= " + seconds +"      milliseconds= " + milliseconds;
var ms:String ="" + milliseconds;
var s:String ="" + seconds;
var m:String ="" + minutes;
var h:String ="" + hours;
var d:String ="" + days;
// Display everything in their dynamic text fileds
msString.text = ms;
sString.text = s;
mString.text = m;
hString.text = h;
dString.text = d;
timeString.text = timeRemaining;
now_txt.text = "now: " + now;
xmas_txt.text = "Xmas = " + nextsession;

а сама функция в классе Timer:
Код AS3:

package {
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        import flash.display.MovieClip;       
        import Amf; //--подключаем наш класс для взаимодействия
        import flash.display.Loader;
    import flash.events.*;
    import flash.net.URLRequest;
 
 
 
        public class Timer extends MovieClip {
 
                public var amf:Amf; //--обьявим переменную класса Amf для взаимодействия
                public function Timer() {
                        amf= new Amf();
                        amf.toamf("timer.getevent.getevent",onGetEvent);
                        //-- timer.getevent.getevent - сначало имя папки в которой скрипт php, дальше имя php скрипта, дальше имя вызываемой функции
                        amf.toamf("timer.getevent.gettime",onGetTime);
                        //-- вторым параметром - функция в которую вернется ответ сервера
                        amf.toamf("timer.getevent.getversioninfo",onGetVersion);
                }
 
                public function onGetEvent(a:Object):void {
                        //var uint=0;
                        //var dx:uint=0;
 
                        for each (var val:Array in a.serverInfo.initialData) {  //--в переменную val будет загонятся очередной значение из массива a, принцип: val=a[0]; val=a[1]; и тд
                                var tf:TextField=newtext;
                                var gp:TextField=gpname;
                                var en:TextField=eventname;
                                //tf.autoSize=TextFieldAutoSize.LEFT;
                                tf.text='дата '+ val[0]+' '; //--запишем дату и пробел
                                tf.text+=val[1]+' '; //--допишем заголовок и новую строку
                                tf.text+=val[2]+'\n';
                                tf.text+=val[3]+' ';
                                tf.text+=val[4];
                                gp.text+=val[1];
                                en.text+=val[2];
 
 
                                // загрузка изображения
                                var imageLoader:Loader = new Loader();
                                var theURL:String = "images/gp/"+ val[5] +".jpg";
                                var imageRequest = new URLRequest(theURL);
                            imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                            imageLoader.load(imageRequest);
                                function onComplete(evt:Event) {
                        addChildAt(imageLoader.content,0);
 
                            }
                                addChild(tf);
                                addChild(gp);
                        }                       
                }
 
                                var next1:Date=new Date(2010, 04, 28, 7, 0, 0, 0);
                                public function onGetTime(t:String):void {
                                  next1 = new Date(t);
                                  var ed:TextField=evendate;
                                  ed.text+=new Date(t);
                                  trace('', t);
                                  trace('', next1);
                                return t;
                                  }
                                //var nextsession = next1;
                var nextsession:Date = new Date(Date.UTC(2010, 04, 28, 7, 0, 0, 0));                               
                //--пример получения простого значения из php
                function onGetVersion(s:String):void { //--из php нам отдается простая строка, значит и в параметрах функции мы укажем строку
                        trace('Версия php сервиса:', s);
                }
 
        }
 
}

вот так, как сейчас работает, потому, что я прямо вписал цифрами дату события var nextsession:Date = new Date(Date.UTC(2010, 04, 28, 7, 0, 0, 0));, но проблема в том, что дата не всегда будет одинакова, поэтому тут должна быть переменная, которая получает данные внутри функции onGetTime.

Добавлено через 5 минут
Цитата:

Сообщение от КорДум (Сообщение 910406)
Код AS3:

переменная = функция(передача параметров);
 
функция (передача параметров):ТипВозвращаемогоЗначения {
        что-то делает;
        return локальная переменнаяЭтойФункции;
}

Но это, наверно, не для вашего случая.

да тяжелый у меня случай, все что надо от скрипта получил, и текстовые поля и изображение, а вот переменную для даты события никак.

Добавлено через 6 минут
Из функции никак нельзя объявить переменную, чтоб она действовала во всем клипе?


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

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