阅读:2624回复:9
engine中调用icommand的问题?
<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> |
|
|
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编辑过]
|
|
|
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> |
|
3楼#
发布于:2005-03-14 20:13
<P>谢谢二位的指点,2楼的代码很长 ,我还没有看完。</P><P>不过我感觉为了避免冲突没有必要这么麻烦的,</P><P>你可以在调用一个按钮之前</P><P>set mapcontrol1.currenttool=nothing </P><P>完全可以避免冲突</P><P>可能还不太理解你用这些代码的思想,回头再细看以下。</P>
|
|
|
4楼#
发布于:2005-03-15 08:53
<P>这是一种工程项目中常见的方式,用类模块实现。添加一个新的按钮,BUild一下,代码编写在类模块中实现就OK了</P><P>避免冲突的意思其中需要注意的而已。</P>
|
|
|
5楼#
发布于:2005-03-15 12:53
<P>要给MapControl的CurrentTool属性赋值,必须shixianITool接口的类才行</P>
|
|
6楼#
发布于:2005-03-15 17:58
2楼好人!<img src="images/post/smile/dvbbs/em01.gif" />
|
|
|
7楼#
发布于:2005-03-21 08:38
<P>好贴,顶!</P>
|
|
8楼#
发布于:2005-03-25 08:24
<img src="images/post/smile/dvbbs/em01.gif" />
|
|
|
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> |
|