\t\t【原创】浅谈SmartFlash与Delphi交互研究

一直以为,做桌面程序,和Flash沾边关系不大。直到客户要求想用Flash WebGIS替代传统的OCX(VC++)的,才匆匆去研究Flash一番。

1、SmartFlash主动与delphi交互是通过OnHandleFSCommand(ASender: TObject; const command, args: WideString)事件交互,比较简单。

简单的示例:

  【原创】浅谈SmartFlash与Delphi交互研究 - yyimen - yyimen的博客

procedure TForm1.sfFlashPlayer1HandleFSCommand(ASender: TObject;
const command, args: WideString);

begin

if (command = 'website') and (args = 'open')
then
    begin
      ShellExecute(0, 'open', 'http://www.almdev.com', nil, nil, SW_SHOWNORMAL);
    end
else
if (command = 'closeabout')
then
    begin
      if FLoadFromStore
      then
        sfFlashPlayer1.FlashIndex := StoreIndex
      else
        sfFlashPlayer1.LoadMovie(0, OpenDialog.FileName);
    end;

end;

2、TsfFlashPlayer与TsfFlashPlayerAsync与区别。

如果本地的SWF文件,使用TsfFlashPlayer为佳。

如果是基于URL的SWF文件,使用TsfFlashPlayerAsync。

调用LoadMovie方法即可装载SWF文件。

3、Flash与Web编程浑然统一体,比如在JS中这样调用。

function thisMovie(movieName)
     {
         if (navigator.appName.indexOf("Microsoft") != -1)
         {
             return window[movieName];
         }
         else
         {
             return document[movieName];
         }
     }

然后根据接口调用其方法:

      // 设置中心点
thisMovie("WebGis").SetMapCenter(114.022521,22.535788);

4、在桌面系统上,当然你可以通过Webbrowser来装载Flash,然后编写JS来调用。但是感觉被Webbrowser裹着一层,效率不是很高。Flash也提供了OCX的方法接口,如果想在Delphi主动调用Flash接口,可通过CallFunction接口来调用Flash里的编程接口。

CallFunction的参数是一个字符串,根据XML字符串方式传入参数,Flash再将XML参数序列化成具体的参数类型。

经参考Flash SDK,XML参数字符串格式如下:

function __flash__arrayToXML(obj) {

var s = "<array>";

for (var i=0; i<obj.length; i++) {

   s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";

}

return s+"</array>";

}

function __flash__argumentsToXML(obj,index) {

var s = "<arguments>";

for (var i=index; i<obj.length; i++) {

   s += __flash__toXML(obj[i]);

}

return s+"</arguments>";

}

function __flash__objectToXML(obj) {

var s = "<object>";

for (var prop in obj) {

   s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";

}

return s+"</object>";

}

function __flash__escapeXML(s) {

return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");

}

function __flash__toXML(value) {

    var type = typeof(value);

if (type == "string") {

   return "<string>" + __flash__escapeXML(value) + "</string>";

} else if (type == "undefined") {

         return "<undefined/>";

} else if (type == "number") {

         return "<number>" + value + "</number>";

} else if (value == null) {

         return "<null/>";

} else if (type == "boolean") {

         return value ? "<true/>" : "<false/>";

} else if (value instanceof Date) {

         return "<date>" + value.getTime() + "</date>";

    } else if (value instanceof Array) {

        return __flash__arrayToXML(value);

    } else if (type == "object") {

        return __flash__objectToXML(value);

    } else {

      return "<null/>"; //???

}

}

function __flash__addCallback(instance, name) {

   instance[name] = function () {

     return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));

   }

}

function __flash__removeCallback(instance, name) {

   instance[name] = null;

}

转换成XML字符串,主体的参数是以下格式

const
cstInvoke='<invoke name="%s" returntype="xml"><arguments>%s</arguments></invoke>';

其中,具体的参数如下:

a、字符串以string表示

b、数值以number表示

c、Boolean类型比较特殊,直接传递自闭合的 <true/> 或 <false/>

d、日期类型以date表示、

e、未定义以undefined表示

f、空值以自闭和的 <null/> 表示

举例如下:传递字符串和Boolean类型参数

TsfFlashPlayerAsync.CallFunction(0,'<invoke name="SetFocus2Center" returntype="xml"><arguments><string>商家名称</string><true/></arguments></invoke>')

如果传递字符串参数,有可能会遇到XML保留关键字或字符,会导致XML解析失败。

因此建议使用CDATA来保证字符串出现XML的保留关键字或字符。

CDATA格式:<![CDATA[内容]]>

上诉例子可以改为:

TsfFlashPlayerAsync.CallFunction(0,'<invoke name="SetFocus2Center" returntype="xml"><arguments><string><![CDATA[商家名称]]></string><true/></arguments></invoke>')

Flash Web GIS如图表示

  【原创】浅谈SmartFlash与Delphi交互研究 - yyimen - yyimen的博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值