Delphi与Flash之间互调函数

来源:互联网 发布:新天龙八部辅助软件 编辑:程序博客网 时间:2024/05/29 18:32

Delphi是一种基于Object Pascal语言的可视化开发环境,而flash Adobe公司专门为制作动画而开发的,目前的flash中可以使用脚本语言Action Script 3.0进行编程控制flash动画。Action Script 3.0脚本语言处理数据的能力远远低于Delphi,而Delphi处理图像和动画的能力不如Flash,本文将介绍Delphi如何通过Shock wave flash ActiveX 控件与flash进行交互。

 

1.flash与外部环境交互的基础

Flash脚本语言Action Script 3.0以前的版本不提供函数与外部容器进行交互,因此本文将介绍Action Script 3.0提供的类ExternalInterface,该类提供了两个方法addCallbackcall。其中addCallback是添加外部容器可以调用的flash函数,call是直接调用外部容器的函数,而在本文这个容器指的就是Shock wave flash ActiveX控件。下面介绍一下这两个函数的具体使用方法。

(1)function addCallback(functionName :String,closure :Function):void

第一个参数functionNameflash向外部容器注册的函数名;第二个参数closureflash中定义的具体函数。下面程序清单是addCallback函数的例子。

程序清单一:

function add(i :int, j:int):int
{
    return i + j;
}
ExternalInterface.addCallback(”GetTotal”, add);

程序清单一中add函数是flash中定义的具体函数,而GetTotal是外部容器调用的函数名。

(2)function call(functionName:String, … arguments):*

第一个参数是调用外部函数的名称,第二个参数是个变参,可以不传递或传递多个参数。程序清单二显示了没有参数和有参数的调用。

程序清单二:

ExternalInterface.call(”GetData”);
ExternalInterface.call(”Multy”, 5, 3);

程序清单二中第一条语句调用的是没有参数的函数,第二条语句是调用两个参数的函数。

 

2.flashShock wave flash ActiveX控件的交互

Delphiflash之间的交互是通过Shock wave flash ActiveX控件的方法和事件来体现的。Shock wave flash ActiveX控件的事件OnFlashCall对应Action Script 3.0中类ExternalInterfacecall方法,Shock wave flash ActiveX控件的方法CallFunction将调用通过Action Script 3.0中类ExternalInterfaceaddCallback注册的函数。Shock wave flash ActiveX控件的事件OnFlashCall函数的定义如下:

procedure  OnFlashCall(Sender:TObject;request:WideString);

这个事件处理函数的request参数是个XML格式的字符串。

Shock wave flash ActiveX控件的方法CallFunction的定义如下:

function  CallFunction(request:WideString):WideString;

这个函数的参数request和返回值都是XML格式的字符串。Action Script 3.0如何构造XML字符串请参照Flash CS 3.0的帮助文档中的外部APIXML格式

3.Delphi中实现解析和封装函数和数据XML的类

本节将提供Delphi实现的类TXMLParse,该类能够解析Shock wave flash ActiveX控件的事件OnFlashCall函数的request参数,也能够将函数以及参数封装成Flash能够理解的XML格式的字符串。TXMLParase通过有参数的构造函数来解析XML字符串,通过类函数EncodeData封装数据或函数调用。EncodeData函数通过多态实现了封装不同数据类型和封装函数调用的功能。类TXMLParase的定义如下:

TParamType = (PTNone, PTNumber, PTBoolean, PTString);

  TXMLParase = class

  private

    FXML : IXMLDocument; 

    FArgments : IXMLNode; //参数节点

    function GetParamCount : integer;

    function GetParamType(i : integer) : TParamType;

  public

    constructor Create(xml : WideString); overload;

    destructor Destroy; override;   

    function GetNumber(i : integer) : real;

    function GetString(i : integer) : String;

    function GetBoolean(i : integer) : Boolean;

    function GetFuncName : String;

    class function EncodeData(Data:integer):WideString; overload;

    class function EncodeData(Data:real):WideString; overload;

    class function EncodeData(Data:String):WideString; overload;

    class function EncodeData(Data:boolean):WideString; overload;

    class function EncodeData(args:array of const):Widestring; overload;

    class function EncodeData(Func:String;args:array of const) : WideString; overload;    

    property Count : integer read GetParamCount;

    property ParamType[i : integer] : TParamType read GetParamType;

  end;

通过类TXMLParase的构造函数就可以实现对Shock wave flash ActiveX控件的OnFlashCallrequest参数完成解析,通过方法GetFuncName获取Flash调用的函数名,属性Count获取函数的参数个数,属性ParamType[i]获取第i个参数的类型,通过GetNumberGetStringGetBoolean三个函数分别获取数字型、字符串型和Boolean型的参数值。类TXMLParase定义了类函数EncodeDataEncodeData是运用面向对象的多态性原理,设计了针对integerrealStringBoolean等元数据类型的XML封装,通过定义函数

function EncodeData(Func:String;args:array of const):WideString;

可以直接通过EncodeData函数对Flash的函数调用进行XML格式封装。

 

4.运用TXMLParase类实现DelphiFlash之间的交互

本节在Delphi 2007环境下运用Shock wave flash ActiveX控件和DelphiTXMLParase来实现数字抽奖。

首先在Flash CS 3.0中新建一个基于Action Script 3.0Flash文档,在文档的第一帧中添加一个动态文本,并给动态文本命名为”mytest”,在第一帧中添加动作源码:

function Run(flag:Boolean):void

{

if (flag)

   addEventListener(Event.ENTER_FRAME, onEnterFrame);

else

 removeEventListener(Event.ENTER_FRAME,onEnterFrame);

}

ExternalInterface.addCallback(”Running”, Run);

function onEnterFrame(event:Event):void

{

   mytest.text = ExternalInterface.call(”GetText”, 100);

}

其中函数”Run”是具有一个Boolean型形参flag的函数,当flag的值为true时,就通过”addEventListener”函数添加帧事件函数”onEnterFrame”;当flagfalse时,通过”removeEventListener”函数去掉帧事件函数。在帧事件函数中,通过类”ExternalInterface””call”函数调用外部API函数”GetText”给动态文本”mytest””text”属性赋值,其中参数100表示从0100中随机抽取一个数字。

下面的代码是用Delphi 2007编写的如何用Shock wave flash ActiveX控件让flash调用”Run”开始抽奖和结束抽奖,如何随机抽取0100之间的数字。

procedure TForm1.Button1Click(Sender : TObject);

var

  S : WideString;

begin

   S := TXMLParase.EncodeData(’Running’,[true]);

   Shockwaveflash1.CallFunction(S);

end;

procedure TForm1.Button2Click(Sender : TObject);

var

  S : WideString;

begin

  S := TXMLParase.EncodeData(’Running’, [false]);

  Shockwaveflash1.CallFunction(S);

end;

procedure TForm1.Shockwaveflash1FlashCall(Sender :TObject;

const request :WideString);

var

  XML : TXMLParase;

begin

  try

XML := TXMLParase.Create(request);

if (XML.GetFuncName = ’GetText’) then

begin

  Shockwaveflash1.SetReturnValue(TXMLParase.

EncodeData(Random(Floor(XML.GetNumber(0)))));

end;

  finally

FreeAndNil(XML);

  End;

end;

上面的代码中,事件函数Button1ClickButton2Click通过Shockwaveflash1.CallFunction调用flash中的Run函数,在TShockwaveFlash控件的OnFlashCall事件中通过类TXMLParase的实例来解析字符串参数”request”,通过方法GetFuncName函数和GetNumberGetStringGetBoolean函数获取flash中通过ExternalInterface.call的函数名和数字、字符串、布尔参数。通过TShockwaveflash控件的一个方法”SetReturnValue”设置ExternalInterface.call的返回值。