万里云
路人甲
路人甲
  • 注册日期2005-01-14
  • 发帖数114
  • QQ
  • 铜币414枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2344回复:9

engine中调用icommand的问题?

楼主#
更多 发布于:2005-03-13 19:48
<P>在engine中不使用toolbarcontrol添加工具</P>
<P>在程序中调用icommand的时候出现错误,大家帮忙看一下</P>
<P>Dim pCommand As ICommand
Set pCommand = New ControlsMapzoomtolastextentbackcommand
pCommand.OnCreate (MapControl1.Object)
If pCommand.Enabled = True Then
Set MapControl1.CurrentTool = pCommand
End If</P>
<P>运行到Set MapControl1.CurrentTool = pCommand时会出现</P>
<P>类型不匹配的错误</P>
<P>调用tool的时候不会发生这个错误</P>
<P>为什么?那位知道指点下</P>
喜欢0 评分0
女口果人尔能看日月白这段言舌,那言兑日月人尔白勺目艮目青有严重白勺散光 
waterblue
路人甲
路人甲
  • 注册日期2004-09-02
  • 发帖数72
  • QQ
  • 铜币387枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2005-03-14 16:52
<P><FONT color=#ff0000><B>公用模块:</B></FONT></P>
<P>Option Explicit
Public m_pCmdCln As Collection
Public Sub BuildCommand(pName As String)</P>
<P>   Dim pCommand As esriSystemUI.ICommand
'   Dim pToolCommand As ICommand</P>
<P>   Set pCommand = m_pCmdCln.Item(pName)
  
    pCommand.OnClick
    
    If (TypeOf pCommand Is esriSystemUI.ITool) Then
       Set FrmMain.Map1.CurrentTool = pCommand
    End If
    
End Sub</P>
<P>
Private Sub AddCommand(pCmd As esriSystemUI.ICommand)</P>
<P>
   ' Dim pMap As IMap
    'Set pMap = FrmMain.Map1.Map
    pCmd.OnCreate FrmMain.Map1
    If pCmd Is Nothing Then Exit Sub
    m_pCmdCln.Add pCmd, pCmd.Name
    
End Sub</P>
<P>
Public Sub BuildCommandCollection()
'文件
  
    AddCommand New ZoomIn
    AddCommand New SelectFeature
    AddCommand New NearestSelect
    AddCommand New MoveSelFeature
    AddCommand New DelSelect
    AddCommand New RotateSelect
    AddCommand New EditVertex
    
    
End Sub</P>
<P><FONT color=#ee0000><B>窗体初始化:</B></FONT></P>
<P>        Set m_pCmdCln = New Collection
        Call BuildCommandCollection</P>
<P><FONT color=#ff0000>调用</FONT>:(比如activebar)</P>
<P><b><FONT color=#f73809>        
    Case "gotobacktoprevious"
        BuildCommand "ZoomBack"
    
    Case "gotonextextent"
        BuildCommand "ZoomNext"</FONT></b></P>
<P><FONT color=#f73809><B>hook,类模块</B></FONT></P>
<P>Option Explicit</P>
<P>Private m_pMyMapCtrl As esriMapControl.MapControl</P>
<P>' Constant used by the Error handler function - DO NOT REMOVE
Const c_ModuleFileName = "clsHook.cls"</P>
<P>Public Property Let hook(ByVal NewHook As Object)</P>
<P>On Error GoTo ErrorHandler</P>
<P>  If TypeOf NewHook Is esriMapControl.MapControl Then ' Map Control
    Set m_pMyMapCtrl = NewHook</P>
<P>
  Else ' None
    Set m_pMyMapCtrl = Nothing

  End If
  Exit Property
ErrorHandler:
'  HandleError False, "Let Hook " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1</P>
<P>End Property</P>
<P>Public Property Get hook() As Object</P>
<P>On Error GoTo ErrorHandler</P>
<P>  If Not m_pMyMapCtrl Is Nothing Then ' Map Control
    Set hook = m_pMyMapCtrl
  Else
    Set hook = Nothing
  End If
  
  Exit Property
ErrorHandler:
  HandleError False, "Get Hook " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1</P>
<P>End Property</P>
<P>Public Property Get FocusMap() As IMap</P>
<P>On Error GoTo ErrorHandler</P>
<P>
  If Not m_pMyMapCtrl Is Nothing Then 'Map Control
    Set FocusMap = m_pMyMapCtrl.Map
    
  Else
    Set FocusMap = Nothing ' None
  End If
  
  Exit Property
ErrorHandler:
'  HandleError False, "Get FocusMap " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1</P>
<P>End Property</P>
<P>
Public Property Get ActiveView() As IActiveView
  
On Error GoTo ErrorHandler
    
  If Not m_pMyMapCtrl Is Nothing Then 'Map Control
    Set ActiveView = m_pMyMapCtrl.Map
  Else
    Set ActiveView = Nothing ' None
  End If
  
  Exit Property
ErrorHandler:
  HandleError False, "Get ActiveView " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1</P>
<P>End Property</P>
<P>Public Property Get hwnd() As Long</P>
<P>On Error GoTo ErrorHandler</P>
<P>  If Not m_pMyMapCtrl Is Nothing Then 'MapControl
    hwnd = m_pMyMapCtrl.hwnd
  Else
    hwnd = 0 ' None
  End If
  
  Exit Property
ErrorHandler:
'  HandleError False, "Get hWnd " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1</P>
<P>End Property</P>
<P>我都是这样做的,注意activebar初始化,否则用这种方法实例化的按钮,和其他的按钮会有冲突</P>
[此贴子已经被作者于2005-3-15 8:54:35编辑过]
http://www.geostar.com.cn(吉奥 公司) http://www.waterblue.com.cn(水之灵,蓝之静 个人)
举报 回复(0) 喜欢(0)     评分
xxwwdd
路人甲
路人甲
  • 注册日期2003-08-19
  • 发帖数88
  • QQ
  • 铜币230枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2005-03-14 17:49
<P>ControlsMapzoomtolastextentbackcommand只实现</P><P>了ICommand接口,当然Set MapControl1.CurrentTool = pCommand会出错,该为</P><P>Dim pCommand As ICommand
Set pCommand = New ControlsMapzoomtolastextentbackcommand
pCommand.OnCreate (MapControl1.Object)</P><P>pCommand.OnClick()
If typeof pCommand is ITool Then
Set MapControl1.CurrentTool = pCommand
End If</P><P>
 </P>
举报 回复(0) 喜欢(0)     评分
万里云
路人甲
路人甲
  • 注册日期2005-01-14
  • 发帖数114
  • QQ
  • 铜币414枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2005-03-14 20:13
<P>谢谢二位的指点,2楼的代码很长 ,我还没有看完。</P><P>不过我感觉为了避免冲突没有必要这么麻烦的,</P><P>你可以在调用一个按钮之前</P><P>set mapcontrol1.currenttool=nothing </P><P>完全可以避免冲突</P><P>可能还不太理解你用这些代码的思想,回头再细看以下。</P>
女口果人尔能看日月白这段言舌,那言兑日月人尔白勺目艮目青有严重白勺散光 
举报 回复(0) 喜欢(0)     评分
waterblue
路人甲
路人甲
  • 注册日期2004-09-02
  • 发帖数72
  • QQ
  • 铜币387枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2005-03-15 08:53
<P>这是一种工程项目中常见的方式,用类模块实现。添加一个新的按钮,BUild一下,代码编写在类模块中实现就OK了</P><P>避免冲突的意思其中需要注意的而已。</P>
http://www.geostar.com.cn(吉奥 公司) http://www.waterblue.com.cn(水之灵,蓝之静 个人)
举报 回复(0) 喜欢(0)     评分
fltjzit
路人甲
路人甲
  • 注册日期2004-07-26
  • 发帖数34
  • QQ
  • 铜币65枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2005-03-15 12:53
<P>要给MapControl的CurrentTool属性赋值,必须shixianITool接口的类才行</P>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
6楼#
发布于:2005-03-15 17:58
2楼好人!<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
giswind
路人甲
路人甲
  • 注册日期2003-08-06
  • 发帖数16
  • QQ
  • 铜币182枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2005-03-21 08:38
<P>好贴,顶!</P>
举报 回复(0) 喜欢(0)     评分
fnwgz
伴读书童
伴读书童
  • 注册日期2004-09-16
  • 发帖数120
  • QQ
  • 铜币638枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2005-03-25 08:24
<img src="images/post/smile/dvbbs/em01.gif" />
我也许很笨,但是我一直再努力,没有放弃!
举报 回复(0) 喜欢(0)     评分
bluemaple
路人甲
路人甲
  • 注册日期2007-03-14
  • 发帖数12
  • QQ
  • 铜币179枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2007-10-04 10:11
<DIV class=quote><B>以下是引用<I>xxwwdd</I>在2005-3-14 17:49:57的发言:</B><BR>
<P>ControlsMapzoomtolastextentbackcommand只实现</P>
<P>了ICommand接口,当然Set MapControl1.CurrentTool = pCommand会出错,该为</P>
<P>Dim pCommand As ICommand<BR>Set pCommand = New ControlsMapzoomtolastextentbackcommand<BR>pCommand.OnCreate (MapControl1.Object)</P>
<P>pCommand.OnClick()<BR>If typeof pCommand is ITool Then<BR>Set MapControl1.CurrentTool = pCommand<BR>End If</P>
<P><BR></P></DIV>
<br>不错,不错,谢谢<STRONG><EM>xxwwdd了</EM></STRONG>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部