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

本文详细探讨了如何使用SmartFlash实现与Delphi的交互,包括使用OnHandleFSCommand事件进行简单操作,以及区分TsfFlashPlayer与TsfFlashPlayerAsync的使用场景。此外,介绍了Flash与Web编程的整合,包括在桌面系统中加载Flash的方法,以及如何通过CallFunction接口主动调用Flash接口。最后,提供了将FlashWebGIS集成到现有系统中的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直以为,做桌面程序,和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 ) + "</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字符串,主体的参数是以下格式
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的博客


        
        



        







        
          
            
            评论这张
          
        


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值