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

发布时间:2016-12-11 6:41:51 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"【原创】浅谈SmartFlash与Delphi交互研究",主要涉及到【原创】浅谈SmartFlash与Delphi交互研究方面的内容,对于【原创】浅谈SmartFlash与Delphi交互研究感兴趣的同学可以参考一下。

一直以为,做桌面程序,和Flash沾边关系不大。直到客户要求想用Flash WebGIS替代传统的OCX(VC++)的,才匆匆去研究Flash一番。1、SmartFlash主动与delphi交互是通过OnHandleFSCommand(ASender: TObject; const command, args: WideString)事件交互,比较简单。简单的示例:procedure TForm1.sfFlashPlayer1HandleFSCommand(ASender: TObject;const command, args: WideString);beginif (command = 'website') and (args = 'open')then     begin       ShellExecute(0, 'open', 'http://www.almdev.com', nil, nil, SW_SHOWNORMAL);     endelseif (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) + "</property>";}return s+"</array>";}function __flash__argumentsToXML(obj,index) {var s = "<arguments>";for (var i=index; i<obj.length; i++) {    s += __flash__toXML(obj);}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字符串,主体的参数是以下格式constcstInvoke='<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如图表示                                                                    评论这张                                                                              转发至微博                  

上一篇:学车考试技巧(图解)
下一篇:RO的JSON例子!

相关文章

相关评论