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的傳回值。