as2编程中,我们通常要处理一些异步加载的数据,有点类似ajax中的callback,即我们不知道何时数据才会返回,并且只有当数据返回时,执行我们定义的操作。
    在flash6及以前,我们会常常碰到从外部加载一张图片或一段文本,但对于数据何时加载完成/成功,需要通过特殊的方法完成,比如在文本末尾加上特殊的标记,再使用循环检测,当读取到此标记时,认为数据加载完成/成功。

当然这些问题,在as2.0中,已经不存在了,不管加载图片还是外部文本,一般均有onLoadComplete,onLoadProgress,OnComplete等事件来侦听加载过程或完成动作。

今天要说的,是我们如何在自定义的Class中,自定义自己的事件。比如,我们有自己的一个类,里面封装了使用Remoting从数据库读取一些数据的操作,当数据读取完成时,Remoting的ResultEvent或FaultEvent会被执行。那么这时候,我们如何通过类的事件的方式,再把此结果返回给实例化此类的脚本段呢,这样以使代码看起来更优美,更OO,更准确。

下面,以一个例子来说明自定义事件的使用,演示此示例,需要Flash8+Remoting+.Net FrameWork+IIS,请确保您具有这些先决条件。

一、在IIS中创建虚拟目录YaoGame,设置.net版本为1.1或2.0均可;

二、将Flash Remoting For .net安装到此虚拟目录,或者此目录中有文件:
bin\flashgateway.dll
bin\frconfig.txt
gateway.aspx
web.config
GetData.aspx

(这几个文件,您可以从本文后边下载,直接复制即可,做过Remoting开发的朋友,自然会知道其用处。)

注意Web.config

    <httpModules>
        <add name="GatewayController" type="FlashGateway.Controller.GatewayController,flashgateway" />
    </httpModules>

GetData.aspx内容如下:

<%@ Page Language="c#" Debug="true" %>

<%@ Register TagPrefix="Macromedia" Namespace="FlashGateway" Assembly="flashgateway" %>
<%@ Import Namespace="System.Data" %>

<Macromedia:Flash ID="Flash1" runat="Server" />

<script language="C#" runat="server">
    void Page_Load(Object sender, EventArgs e)
    {
        //=========================================================
        //Author:     Joseph.Yao(http://yao.cnblogs.com)
        //Create Date:2007-7-18 22:21:27
        //=========================================================

if (Flash1.Params.Count > 0)
        {
            if (Flash1.Params[0] == null)
            {
                Flash1.Result = "Hello World.";
            }
            else
            {
                Flash1.Result = "Hello " + Flash1.Params[0].ToString() + ".";
            }
        }
    }
</script>

三、创建一个TestClass 类,内容如下:

import mx.remoting.Service;
import mx.remoting.PendingCall;
import mx.remoting.RecordSet;
import mx.rpc.RelayResponder;
import mx.rpc.ResultEvent;
import mx.rpc.FaultEvent;
import mx.remoting.debug.NetDebug;
//NetDebug.initialize();
import mx.services.Log;
/**
*
* @Author:Joseph.Yao
* @Version:xx.x.x
* @Create Date:2007-07-18
* @Description:as2.0中自定义事件Demo。
*
**/
class TestClass {
    var gatewayPath:String;
    var nickName;
    //构造函数
    function TestClass() {
        //初始化网关地址
        gatewayPath = "http://localhost/YaoGame/gateway.aspx";
    }
    function RemoteData(resultFun:String, faultFun:String) {
        //
        //通过Remoting读取数据,但无法估计多久能返回
        //
        //注意这里的YaoGame应该与虚拟目录一致
        //这三行是Remoting从.net程序加载数据,调用是的http://localhost/YaoGame/GetData.aspx
        var myResponder = new RelayResponder(this, resultFun, faultFun);
        //记录日志:var service:Service = new Service(gatewayPath, new Log(), "YaoGame", null, myResponder);
        var service:Service = new Service(gatewayPath, null, "YaoGame", null, myResponder);
        var pc:PendingCall = service.GetData(this.nickName);
    }
    //Remoting成功返回数据时,此方法执行
    function Remote_Result(evt:ResultEvent):Void {
        //
        //{此处可对加载的数据(evt.result)处理}
        //
        //当加载成功时,发出事件消息,success值为true
        Complete(true, String(evt.result));
    }
    //Remoting返回数据出错时,此方法执行
    function Remote_Fault(evt:FaultEvent):Void {
        trace("加载数据失败:"+evt.fault.faultstring);
        //当加载失败时,也发出事件消息,但success值为false,
        Complete(false, "Load Data Error.");
    }
    //某个费时的操作,无法预知多久可以完成操作,比如从数据库读取数据
    function DoSomething(nickName:String) {
        this.nickName = nickName;
        RemoteData("Remote_Result", "Remote_Fault");
    }
    //通过自定义事件,将成功消息和数据"广播"出去
    function Complete(success:Boolean, msg:String) {
        obj.OnComplete(success, msg);
    }
    //
    //======================事件==========================
    //
    private var obj;
    //当某费时操作完成时发生的事件,其实是一个as2.0类的属性,只是属性传递的是一个function类型对象;
    public function set OnComplete(fun:Object):Void {
        //注意这里的new,如果您是把当前类“链接”到库中的mc上,则这里要稍微注意,不用new有可能会出现你不想要的效果。
        //最好的方式是每次事件“委托”的时候,都实例化一个obj出来;
        obj = new Object();
        obj.OnComplete = fun;
    }
}

四、创建一个CustomEventDemo.fla,以测试此类,在此fla时间轴第一帧中加入使用此类的代码:

var tc = new TestClass();
//这里是给类实例的OnComplete事件指定一个事件执行过程,即当数据完成时,此函数内的脚本被执行,并且数据被返回;
tc.OnComplete = function(success:Boolean, msg:String) {
    //success是数据加载是否成功,msg是返回的数据.
    trace(success);
    trace(msg);
};
tc.DoSomething("Joseph.yao");
//执行成功后,返回:
//true
//Hello Joseph.yao.

最后运行CustomEventDemo.fla文件看测试结果。

五、以上代码中对自定义事件的使用已做了较详细说明了,加黑加粗部分是关键的几处代码。其实这个示例的自定义事件,同时只能挂接一个事件,即所谓单播,如果要实现事件的多播,则稍微要复杂一些,可以通过维护一个事件列表来做,希望有机会和大家探讨。
还有注意测试此示例时,注意Flash的安全策略问题,应该在http://localhost/根下有一个crossdomain.xml文件来授权可来访的域,否则看不到结果就郁闷了。

本文示例源码完整下载(33K):/Files/yao/as2CustomEventDemo.rar

转载于:https://www.cnblogs.com/yao/archive/2007/07/18/823174.html

[Flash开发笔记] 如何在as2.0中使用自定义类事件相关推荐

  1. Unity+C#开发笔记(七)| unity中继承MonoBehaviour类的脚本里的函数怎么调用 | ╭(●`∀´●)╯╰(●’◡’●)╮

    继上文,有个蠢货单例模式只是用来引用,突然遇到了一个继承了MonoBehaviour的类,然后unity跟你讲:不!你不可以在我这里这么用! 啊这--吓得我当场百度... ************** ...

  2. [Flash开发笔记] 关于Flash中的ASO文件

    今天发生这样一件"奇怪"的事情: 因为某种原因,我将系统日期改早了一个月时间,之后我编译过一次Flash程序(Flash程序中有很多的as2.0的类). 后来我将系统时间改回正常时 ...

  3. Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)...

    在Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据一)中,解释了如何把Crystal Report整合到Sharepoint ...

  4. Unity+C#开发笔记(六)| unity中单例模式的使用 | ╭(●`∀´●)╯╰(●’◡’●)╮

    首先单例模式是做什么用的呢?对于我一个萌新来说,目前我用到的就是方便别的类调用!,所以在不继承MonoBehavior的类,我都喜欢加个单例模式方便调用(我知道好像正确原因不是这个0.0但主要是妹看懂 ...

  5. Flash Actionscript 2.0中的函数与事件 之 函数类(Function Class)

    Flash Actionscript 2.0中的函数与事件  之  函数类(Function Class) 作者:LeeFJ 函数是什么,在面向对象里面通常称为方法(Method),但是在AS2.0里 ...

  6. 避免在 ASP.NET Core 3.0 中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...

  7. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  8. 如何在VB6.0里动态使用具有事件的对象

    代码如下: 'DLL内cTest内代码 Option Explicit '动态使用具有事件的对象 ' 'BY 嗷嗷叫的老马 'http://www.m5home.com Public Event KK ...

  9. ASP.NET2.0中的ClientScriptManager 类用法—如何添加客户端事件!

    在ASP.NET2.0中,ClientScriptManager 类通过键 String 和 Type 唯一地标识脚本.具有相同的键和类型的脚本被视为重复脚本.因此,我们可以使用脚本类型来避免混淆可能 ...

最新文章

  1. EXE文件中的程序的加载过程 SA是什么呢?PSP是什么?
  2. “电商+金融”融合发展 开辟金融创新新路径
  3. 在字符串中查找指定的字符串--strstr
  4. 前端基础之CSS_2
  5. java VM argument_java vm args
  6. linux vi 复制一个单词_vi或vim的快速操作技巧你知道吗?
  7. sysctl修改内核参数
  8. c++ primer plus中文版_如何成为一名厉害的C/C++程序员?
  9. 远程桌面控制VC源码剖析
  10. 使用可靠多播与OPENDDS进行数据分发
  11. nodejs 安装教程
  12. Alta发布高速MIL-STD-1553 ARINC429模块-USB3.0
  13. 最新图解 FileZilla Server + FlashFXP 快速傻瓜式搭建FTP服务 1
  14. linux ubuntu 安装odb,Ubuntu 使用C++ ORM框架--ODB
  15. 使用高德开放平台显示指定的坐标点和线
  16. vue项目获取视频封面展示在页面上
  17. 做后端开发需要学什么?标梵看到了一条小白的发展之路
  18. 基于Visual Studio2010开发office2010办公自动化应用(12)自定义VisioAddIn插件
  19. 用SQL语句创建数据库和表
  20. 大数据研究的若干科学问题——徐宗本

热门文章

  1. 将一个一维数组转化为二进制表示矩阵。例如_算法之矩阵最大区域问题
  2. calipso是什么意思_眰恦是什么意思?
  3. 微信小程序如何搭建本地环境开发
  4. 《深入理解计算机系统》第七章——链接知识点总结
  5. React 开发环境搭建
  6. 设置应用图标badge(徽章)
  7. 在linux环境下重启oracle数据库,解决密码过期的问题
  8. 简述 clearfix 的原理
  9. 中矿大新生赛 A 求解位数和【字符串】
  10. CentOS6.8 编译安装LNMP