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

news/2024/7/5 3:02:53
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


http://lihuaxi.xjx100.cn/news/257924.html

相关文章

CentOS搭建msmtp+mutt实现邮件发送

1&#xff1a;搭建配置msmtp下载msmtp包&#xff1a;官方地址&#xff1a;http://msmtp.sourceforge.net/download.html编译&#xff0c;安装(官方下载的包为tar.xz格式):#xz -d msmtp-1.6.3.tar.xz #tar -xvf msmtp-1.6.3.tar #cd msmtp-1.6.3 #./configure --prefix /opt/app…

开源困境:Log4j2 维护者发声:没有工资,还要挨骂!!

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典文 | 罗奇奇出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;基于 Java 的日志记录工具 Apache Log4j2 近日出现了一个高危漏洞&#xff0c;攻击者可以利用其 JNDI 注入漏洞远程执行代码&#xff0…

bzoj1079: [SCOI2008]着色方案(DP)

1079: [SCOI2008]着色方案 题目&#xff1a;传送门 题解&#xff1a; DP刚神多年前讲过的一道神题。 二话不说&#xff0c;上来就是一个六维数组&#xff1a;F[i][a][b][c][d][e]//表示上一次涂的颜色是还剩下i次可用的&#xff0c;a~e表示不同次数的颜色种数。 次数一样的颜色…

Datawhale厦门大学分享记录!

Datawhale线下 作者&#xff1a;李明夷&#xff0c;厦门大学 WISER CLUB2021 年 5 月 16 日下午&#xff0c;Datawhale 团队受邀来到厦门大学&#xff0c;同 WISER CLUB 在经济楼 N402 共同举办学习、竞赛及工作经验分享会&#xff0c;吸引了校内各学院的同学参加。本次活动由 …

Zookeeper源码分析:Follower角色初始化

参考资料 <<从PAXOS到ZOOKEEPER分布式一致性原理与实践>> zookeeper-3.0.0Follower角色初始化 本文主要简述一下Follower角色初始化的流程&#xff0c;并概述一下主要的操作。 Follower角色初始化流程 case FOLLOWING:try {LOG.info("FOLLOWING");se…

ECCV22 最新54篇论文分方向整理|包含Transformer、图像处理、人脸等(附下载)...

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文首发极市平台公众号&#xff0c;转载请获得授权并标明出处。导读 最近一周&#xff0c;ECCV2022陆续放出了更多和GAN&#xff0c;Transformers相关的论文&#xff0c;为…

使用深度学习阅读和分类扫描文档

作者|小白来源|小白学视觉收集数据首先&#xff0c;我们要做的第一件事是创建一个简单的数据集&#xff0c;这样我们就可以测试我们工作流程的每一部分。理想情况下&#xff0c;我们的数据集将包含各种易读性和时间段的扫描文档&#xff0c;以及每个文档所属的高级主题。我找不…

Matlab与线性代数 -- 寻找矩阵的非零元素

本微信图文详细介绍了Matlab中find函数的用法。