• 如何解决调试WEB页面时自动运行TerraExplorer软件的问题


     

    大家在使用TerraExplorer Developer开发包进行二次开发的时候,特别是进行WEB开发的时候,经常会遇到这样一个问题,就是在WEB页面(htmlaspx或者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函数也就没有什么实际意义了。其实在TEITerraExplorer51接口中,我们发现有AttachEventDetachEvent两个方法,这样就可以做到我们在需要调用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的支持。

  • 相关阅读:
    Gson通过借助TypeToken类来解决这个问题
    学习心得
    java反射机制及Method.invoke方法(转载)
    IntentService源码分析
    android中一个app中的activity启动另外一个aar包中的activity
    android 动态加载
    eclispe的快捷键
    android sqlite数据库升级
    [C++] any number to binary (Bit manipulation)
    [C++] Sign and magnitude,Ones' complement and Two's complement
  • 原文地址:https://www.cnblogs.com/yitianhe/p/1722896.html
Copyright © 2020-2023  润新知