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,该类提供了两个方法addCallback和call。其中addCallback是添加外部容器可以调用的flash函数,call是直接调用外部容器的函数,而在本文这个容器指的就是Shock wave flash ActiveX控件。下面介绍一下这两个函数的具体使用方法。
(1)function addCallback(functionName :String,closure :Function):void
第一个参数functionName是flash向外部容器注册的函数名;第二个参数closure是flash中定义的具体函数。下面程序清单是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.flash与Shock wave flash ActiveX控件的交互
Delphi与flash之间的交互是通过Shock wave flash ActiveX控件的方法和事件来体现的。Shock wave flash ActiveX控件的事件OnFlashCall对应Action Script 3.0中类ExternalInterface的call方法,Shock wave flash ActiveX控件的方法CallFunction将调用通过Action Script 3.0中类ExternalInterface的addCallback注册的函数。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的帮助文档中的”外部API的XML格式”。
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控件的OnFlashCall的request参数完成解析,通过方法GetFuncName获取Flash调用的函数名,属性Count获取函数的参数个数,属性ParamType[i]获取第i个参数的类型,通过GetNumber、GetString、GetBoolean三个函数分别获取数字型、字符串型和Boolean型的参数值。类TXMLParase定义了类函数EncodeData,EncodeData是运用面向对象的多态性原理,设计了针对integer、real、String和Boolean等元数据类型的XML封装,通过定义函数
function EncodeData(Func:String;args:array of const):WideString;
可以直接通过EncodeData函数对Flash的函数调用进行XML格式封装。
4.运用TXMLParase类实现Delphi与Flash之间的交互
本节在Delphi 2007环境下运用Shock wave flash ActiveX控件和Delphi类TXMLParase来实现数字抽奖。
首先在Flash CS 3.0中新建一个基于Action Script 3.0的Flash文档,在文档的第一帧中添加一个动态文本,并给动态文本命名为”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”;当flag为false时,通过”removeEventListener”函数去掉帧事件函数。在帧事件函数中,通过类”ExternalInterface”的”call”函数调用外部API函数”GetText”给动态文本”mytest”的”text”属性赋值,其中参数100表示从0到100中随机抽取一个数字。
下面的代码是用Delphi 2007编写的如何用Shock wave flash ActiveX控件让flash调用”Run”开始抽奖和结束抽奖,如何随机抽取0到100之间的数字。
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;
上面的代码中,事件函数Button1Click和Button2Click通过Shockwaveflash1.CallFunction调用flash中的Run函数,在TShockwaveFlash控件的”OnFlashCall”事件中通过类TXMLParase的实例来解析字符串参数”request”,通过方法GetFuncName函数和GetNumber、GetString、GetBoolean函数获取flash中通过ExternalInterface.call的函数名和数字、字符串、布尔参数。通过TShockwaveflash控件的一个方法”SetReturnValue”设置ExternalInterface.call的返回值。