ICommand接口的Enabled属性

Posted by 蒋波涛 9 December,2008 Views (7)Comment

在ArcGIS的三种开发方式中,最麻烦的无疑是给ArcGIS写DLL,因为它最难以调试,但写这种东西的好处也很明显,您能充分运用一个完善的框架来实现自己的功能。

最近老革命遇到新问题,最近我也开始写起ArcMap的DLL插件起来,其中有些功能的要求颇为特别,如“该命令只有在数据为SDE类型才能使用”,“只有在ArcMap中存在要素图层才能使用”等等,虽然这些要求很“麻烦”,但对用户而言却是非常实用的,至少可以防止误操作。

当然,这些功能的要求是确定ICommand的Enabled属性,但ICommand接口所有的属性都是只读的,我们该如何动态地设置该属性呢?一查资料,才发现ArcMap框架其实从ICommand对象生成那一刻之后,每0.5秒就监测一次所有插件的Enabled属性情况,该为True为True,该为False为False。如此一来,自然好办多了,下面就是一个必须在SDE库才能使用的ICommand接口的代码:

Private Property Get ICommand_Enabled() As Boolean
    '只有在为SDE库的情况下才可用
    If ICommand_Enabled = False Then
        Set pMxDoc = m_pApp.Document
        Set pMap = pMxDoc.FocusMap
       
        Dim iLayerCount As Integer
        Dim pDataset As IDataset
        Dim pFeatlyr As IFeatureLayer
        Dim pWorkspace As IWorkspace
        For iLayerCount = 0 To pMap.LayerCount - 1
            Set pFeatlyr = pMap.Layer(iLayerCount)
            Set pDataset = pFeatlyr.FeatureClass
            Set pWorkspace = pDataset.Workspace
            Exit For
        Next
        If Not pWorkspace Is Nothing Then
            If pWorkspace.Type = esriRemoteDatabaseWorkspace Then
                ICommand_Enabled = True
            Else
                ICommand_Enabled = False
            End If
        Else
            ICommand_Enabled = False
        End If
    End If
End Property

 

 

 

Related Items

Categories : ArcObjects Tags : ArcGIS  
Comments
2008-12-12 10:12:39

文章很好,很有用,学习了。

Posted by xuzhenghai Gravatar Icon

2008-12-21 15:29:35

你好,我正在读你的插件式的书,也有相同的疑问:
Command插件是带有enabled属性,但是主框架如何实时检测并更新这个属性呢?类似ArcMap中的"清空选择"按钮一样,当地图中图层没有要素被选择的时候,按钮是enabled(灰色的,无法点击)。
请问也是没0.5秒检测一次吗? 如果很多命令的话这样的效率会不会很底呢??比如“清空选择”每检测一次enabled属性需要遍历一次图层才能获取他的Enbled属性。
期待您的回答.

Posted by murphy1314 Gravatar Icon

2008-12-21 21:30:17

不是的,其实从框架对ICommand的解析中你应该可以看到,框架对Enabled属性其实是没有进行处理的,这是需要我们自己完善的部分,我觉得并不难。Haha

Posted by 蒋波涛 Gravatar Icon

2008-12-22 0:03:39

谢谢你的回答,其实我就是想问如何实时的将Icommand.enable属性实时的体现到命令按钮的可用与不可用。能不能给点提示?难道只有0.5秒检测一次?

Posted by murphy1314 Gravatar Icon

2008-12-22 9:20:06

在主框架中搞个定时器Timer对象,每n秒遍历一次所有的ICommand对象,根据插件对象的Enabled属性来设置其UI对象的Enabled属性即可。

Posted by 蒋波涛 Gravatar Icon

2008-12-22 9:57:07

谢谢,只有这么一种方法吗? 每0.5秒检测如果很多命令的话这样的效率会不会很底呢??比如“清空选择”每检测一次Icommand.enabled属性需要遍历一次图层才能获取他的Enbled属性。
-----------------------------------
不会,你的插件数量不会是成千上万。另外,遍历ICommand的Enabled属性与地图操作无关。
由 jbttm 于 2008-12-22 11:01:58 最后编辑

Posted by murphy1314 Gravatar Icon

2009-5-9 9:45:02

值的学习,顶下

Posted by yu Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档