一直以为,做桌面程序,和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);
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
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如图表示
评论这张

转发至微博
1、SmartFlash主动与delphi交互是通过OnHandleFSCommand(ASender: TObject; const command, args: WideString)事件交互,比较简单。
简单的示例:

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;
如果本地的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
}
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
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><
如果传递字符串参数,有可能会遇到XML保留关键字或字符,会导致XML解析失败。
因此建议使用CDATA来保证字符串出现XML的保留关键字或字符。
CDATA格式:<![CDATA[内容]]>
上诉例子可以改为:
TsfFlashPlayerAsync.CallFunction(0,'<invoke name="SetFocus2Center" returntype="xml"><arguments><string><
Flash Web GIS如图表示
评论这张

转发至微博