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

Oli Short 12.12.2009 17:27

Проблема с созданием класса, не возвращает значение
 
Здравствуйте. Почитал мануал по созданию класса. Пишу простой класс.

vkomandeClass.as
Код AS3:

package vkomande.files
{
        import flash.display.*;
        import flash.events.*;
          import flash.net.*;
 
        public class vkomandeClass
    {
 
                public var getUrl:String;
        public var resultData:String;
 
        public function vkomandeClass()
        {
 
        }
 
        public function getXML()
        {
                var xmlLoader:URLLoader = new URLLoader(new URLRequest("http://vkomande/md5.php?"+getUrl));
        xmlLoader.addEventListener(Event.COMPLETE, viewXML);
        }
 
                public function viewXML(e:Event):void
                {
                var returnData:String = e.target.data;
                resultData = returnData;
                }
 
    }
}

на главной фрейма
Код AS3:

import vkomande.files.vkomandeClass
 
 
var vkm:vkomandeClass = new vkomandeClass();
vkm.getUrl = 'a=1&b=2&c=3';
vkm.getXML();
trace(vkm.resultData);

хочу просто возвращать значение исполняемого php файла. значение всегда null. Подскажите пожалуйста в чем моя ошибка. Спасибо!

Xero201 12.12.2009 17:49

trace(vkm.resultData); - выполнится не дожидаясь события Event.COMPLETE
Можно сделать например так:
в классе vkomandeClass:
Код AS3:

public static const GET_RESULT:String = "getResult";
//..
public function viewXML(e:Event):void
{
var returnData:String = e.target.data;
resultData = returnData;
dispatchEvent(new Event(GET_RESULT));
}

а в главном:
Код AS3:

var vkm:vkomandeClass = new vkomandeClass();
vkm.addEventListener(vkomandeClass.GET_RESULT, viewResult);
function veiwResult(e:Event){
trace(vkm.resultData);
//или trace(e.target.resultData);
}


Oli Short 12.12.2009 18:02

Исправил
Код AS3:

package vkomande.files
{
        import flash.display.*;
        import flash.events.*;
          import flash.net.*;
 
        public class vkomandeClass
    {
 
                public var getUrl:String;
        public var resultData:String;
                public static const resultXML:String = 'vasys';
 
 
        public function vkomandeClass()
        {
 
        }
 
        public function getXML()
        {
                var xmlLoader:URLLoader = new URLLoader(new URLRequest("http://vkomande/md5.php?"+getUrl));
        xmlLoader.addEventListener(Event.COMPLETE, viewXML);
        }
 
                public function viewXML(e:Event):void
                {
                var returnData = e.target.data;
                resultData = returnData;
 
        dispatchEvent(new Event(resultXML));
                }
 
    }
}

Код AS3:

import vkomande.files.vkomandeClass
 
 
var vkm:vkomandeClass = new vkomandeClass();
vkm.getUrl = 'a=1&b=2&c=3';
 
vkm.addEventListener(vkomandeClass.resultXML, viewResult);
 
function viewResult(e:Event){
trace(vkm.resultData);
}

ругается на
Цитата:

Call to a possibly undefined method dispatchEvent.
Код AS3:

dispatchEvent(new Event(resultXML));


Xero201 12.12.2009 18:25

dispatchEvent - это способ самостоятельно вызвать какое-нибудь событие. Но чтобы это сработало, класс vkomandeClass (кстати, классы обычно называют с большой буквы для всеобщего удобства) должен быть расширен от EventDispatcher
(вообще когда чего-то не находит, очень легко выяснить причину с помощью встроенного хэлпа)

Oli Short 12.12.2009 18:27

Код AS3:

должен быть расширен от EventDispatcher

не понял предложение, что значит расширен?

Xero201 12.12.2009 18:42

Во Flash для решения многих задач существуют уже готовые классы. Например SimpleButton – для создания кнопок, MovieClip – для клипов, TextField для текстовых полей и т.д. Когда нужно сделать похожий по функционалу класс (либо использовать один из них),то велосипед не изобретают, а берут за основу уже готовый и расширяют его (extends) или наследуют, если так привычнее). Делается это вот так:
public class vkomandeClass extends EventDispatcher{

ЗЫ.
скачай какую-нибудь книжку и почитай, будет легче

Oli Short 12.12.2009 18:55

Код AS3:

Делается это вот так:
public class vkomandeClass extends EventDispatcher{

я понял о чем ты. переделал

Код AS3:

package vkomande.files
{
        import flash.display.*;
        import flash.events.*;
          import flash.net.*;
 
        public class vkomandeClass extends EventDispatcher
    {
 
                public var getUrl:String;
 
        public function vkomandeClass()
        {
//getXML();
 
        }
 
        public function getXML():void
        {
                var xmlLoader:URLLoader = new URLLoader(new URLRequest("http://vkomande/md5.php?"+getUrl));
        xmlLoader.addEventListener(Event.COMPLETE, viewXML);
                }
 
                public function viewXML(e:Event):void
                {
                //var returnData = e.target.data;
                //resultData = returnData;
        dispatchEvent(new Event('test'));
                }
 
    }
}

Код AS3:

import vkomande.files.vkomandeClass
 
 
var vkm:vkomandeClass = new vkomandeClass();
//vkm.getUrl = 'a=1&b=2&c=3';
 
vkm.addEventListener("test", test);
 
function test(e:Event) {
trace(e);
}

ошибок не выдает. trace вообще ничего не выводит

ChuwY 12.12.2009 19:22

Но ты же не вызываешь getXML().
Нет события — нет реакции на событие.

Oli Short 12.12.2009 19:37

функцию getXML() поместил в конструктор чтобы в фрейме не вызывать. все равно молчит все. брожу вокруг да около. ошибок не нахожу. делал по примеру

Код AS3:

package vkomande.files
{
        import flash.display.*;
        import flash.events.*;
          import flash.net.*;
 
        public class vkomandeClass extends EventDispatcher
    {
 
                public var getUrl:String;
        public var resultData:String;
 
        public function vkomandeClass()
        {
            var xmlLoader:URLLoader = new URLLoader(new URLRequest("http://vkomande/md5.php?"+getUrl));
        xmlLoader.addEventListener(Event.COMPLETE, viewXML);       
        }
 
        //public function getXML():void
        //{
                //var xmlLoader:URLLoader = new URLLoader(new URLRequest("http://vkomande/md5.php?"+getUrl));
        //xmlLoader.addEventListener(Event.COMPLETE, viewXML);
                //}
 
                public function viewXML(e:Event):void
                {
                var returnData = e.target.data;
                resultData = returnData;
        dispatchEvent(new Event('test'));
                }
 
    }
}

Код AS3:

import vkomande.files.vkomandeClass
 
 
var vkm:vkomandeClass = new vkomandeClass();
vkm.getUrl = 'a=1&b=2&c=3';
 
vkm.addEventListener("test", test);
 
function test(e:Event) {
trace(vkm.resultData);
 
}

Добавлено через 12 минут
разобрался

ChuwY 12.12.2009 20:09

Попробуй так. Работает.

Код AS3:

package classes{
  import flash.display.*;
  import flash.events.*;
  import flash.net.*;
 
  public class VkomandeClass extends EventDispatcher{
    public var getUrl : String;
    public var resultData : String;
    private var xmlLoader:URLLoader
 
    public function VkomandeClass(){
      xmlLoader = new URLLoader(new URLRequest("http://vkomande/md5.php?"+getUrl));
      xmlLoader.addEventListener(Event.COMPLETE, viewXML);       
    }
 
    public function getXML():void{
      var request : URLRequest = new URLRequest("xmlFile.xml")
      var xmlLoader : URLLoader = new URLLoader(request);
          xmlLoader.addEventListener(Event.COMPLETE, viewXML);
      xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, sendErrorMesge);
        }
 
    private  function viewXML(e:Event):void{
          var returnData = e.target.data;
          resultData = returnData;
      dispatchEvent(new Event('loadComplete'));
        }
 
    private function sendErrorMesge(e : IOErrorEvent):void{
          dispatchEvent(new Event('loadFailed'));
        }
 
  }
}

Код AS3:

import classes.VkomandeClass; 
 
var vkm : VkomandeClass = new VkomandeClass();
vkm.getUrl = 'a=1&b=2&c=3';
 
vkm.addEventListener("loadComplete", complMessage);
vkm.addEventListener("loadFailed", failMessage);
vkm.getXML();
 
function complMessage(e : Event) {
  trace("Загрузка успешно завершена");
  trace(vkm.resultData);
}
 
function failMessage(e : Event){
  trace("При загрузке возникли ошибки");
}



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

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