天天看點

Delphi與Flash之間互調函數

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