大家在使用TerraExplorer Developer开发包进行二次开发的时候,特别是进行WEB开发的时候,经常会遇到这样一个问题,就是在WEB页面(html、aspx或者jsp等)中嵌入TerraExplorer Object对象,即
<OBJECT ID="TE" CLASSID="CLSID:3a4f9191-65a8-11d5-85c1-0001023952c1"></OBJECT>,
然后运行该WEB页面,在页面加载的过程中,会将TerraExplorer View或者TerraExplorer Pro软件运行起来,
一般情况下,只要在当前页面中添加另外一个用于三维场景显示的控件
<OBJECT ID=" TerraExplorer3DWindow" CLASSID="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1" width=500 height=400></OBJECT>
并且需要保证TerraExplorer3DWindow对象先于TE对象被初始化,即可消除前面提到的问题。
但在有些时候,我们开发的系统中可能会嵌入许多WEB页面,而且在这些页面中也都会涉及到对TE接口的调用,这时运行我们的系统,也有可能把TerraExplorer软件运行起来,这是我们不想看到的,其实也可以说这就是一种逻辑错误,而消除这个错误的方法很简单,就是我们必须保证所有对TE接口的调用,都要放在TerraExplorer3DWindow对象加载之后。
但是我们如何保证在复杂的系统中,理清他们之间的先后顺序呢?
这里可以给大家介绍一个实用的解决方法。就是把TE对象放到一个函数里面去初始化,而不是像原来那样直接嵌在页面里。
例如:
function _$SGCreateTEObj()
{
var obj = window.document.getElementById("TE");
if(obj== null)
{
obj = document.createElement('object');
document.body.appendChild(obj);
obj.name = "TE";
obj.id= "TE";
obj.classid= "CLSID:3a4f9191-65a8-11d5-85c1-0001023952c1";
}
return obj;
}
这样,在其他需要调用TE接口的时候,我们只需要重新实例化一下TE对象即可。
var TE=_$SGCreateTEObj();
var IPlane = TE.interface("IPlane5");
这时,大家也许还会有疑问,就是对于TE里面的事件接口_ITerraExplorerEvents5该如何引用呢?
在以前Skyline提供给大家的例子中,我们可以看到用javascript中的写法是
function TE::OnLoadFinished()
{
}
或者用vbscript的写法是
sub TE_OnLoadFinished()
end sub
如果说对于TE的事件接口只能用上述固定的方式来实现的话,那么就又回到了最开始的状态,封装TE函数也就没有什么实际意义了。其实在TE的ITerraExplorer51接口中,我们发现有AttachEvent和DetachEvent两个方法,这样就可以做到我们在需要调用TE的事件接口时Attach,不需要的时候Detach:
function _$SGCreateEvent()
{
var TE=_$SGCreateTEObj();
var ITerraExplorer = TE.interface("ITerraExplorer51");
ITerraExplorer.AttachEvent("OnLButtonDown",_$SGEventOnLButtonDown);
}
function _$SGDelEvent()
{
var TE=_$SGCreateTEObj();
var ITerraExplorer = TE.interface("ITerraExplorer51");
ITerraExplorer.DetachEvent("OnLButtonDown",_$SGEventOnLButtonDown);
}
如此,我们就可以更加灵活地使用TE的事件接口。
希望上述文字能够给大家提供一些帮助或者启发,感谢大家对Skyline的支持。