ICommand接口的Enabled属性
在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
Comments
你好,我正在读你的插件式的书,也有相同的疑问:
Command插件是带有enabled属性,但是主框架如何实时检测并更新这个属性呢?类似ArcMap中的"清空选择"按钮一样,当地图中图层没有要素被选择的时候,按钮是enabled(灰色的,无法点击)。
请问也是没0.5秒检测一次吗? 如果很多命令的话这样的效率会不会很底呢??比如“清空选择”每检测一次enabled属性需要遍历一次图层才能获取他的Enbled属性。
期待您的回答.
不是的,其实从框架对ICommand的解析中你应该可以看到,框架对Enabled属性其实是没有进行处理的,这是需要我们自己完善的部分,我觉得并不难。![]()
谢谢你的回答,其实我就是想问如何实时的将Icommand.enable属性实时的体现到命令按钮的可用与不可用。能不能给点提示?难道只有0.5秒检测一次?
在主框架中搞个定时器Timer对象,每n秒遍历一次所有的ICommand对象,根据插件对象的Enabled属性来设置其UI对象的Enabled属性即可。
谢谢,只有这么一种方法吗? 每0.5秒检测如果很多命令的话这样的效率会不会很底呢??比如“清空选择”每检测一次Icommand.enabled属性需要遍历一次图层才能获取他的Enbled属性。
-----------------------------------
不会,你的插件数量不会是成千上万。另外,遍历ICommand的Enabled属性与地图操作无关。
由 jbttm 于 2008-12-22 11:01:58 最后编辑
值的学习,顶下
Leave a comment
Or, take a look at Archives and Categories
文章很好,很有用,学习了。