0

FoxProで何かをしてから何年も経ちますが、作業が必要なレガシーシステムがあります。さて、FoxProからMapPointやExcelなどのCOMベースのアプリケーションを呼び出すことができます。私は前にそれをしました。ただし、関数またはオブジェクトメソッドをイベントコールバックとして渡すにはどうすればよいですか?それも可能ですか?(オンラインで何も見つからないか、追跡できたFoxProの本が見つかりません)

以下は、MapPointのドキュメントから抜粋したVB6の例です。たまたまOnConnection()それ自体がコールバックです。ただし、への呼び出しはmoaApp.AddCommand()、コールバック関数()への参照をメニューコールバックとしてSayHello()MapPoint( )に渡します。moApp質問にとって重要というわけではありませんが、おそらくSave、Quit、およびMenuコールバックイベントをトラップする必要があります。

Dim moaApp As MapPoint.Application
Public Sub SayHello()
MsgBox "Hello"
End Sub

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As
AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
On Error GoTo error_handler

Set moaApp = Application

'Add this command to the menu (HOW DO I DO THIS IN FOXPRO?)
moaApp.AddCommand "Saying Hello", "SayHello", Me

Exit Sub

error_handler:

MsgBox Err.Description

End Sub
4

1 に答える 1

0

@Alan Bからのリードのおかげで、私はそれをうまく機能させることができました...

イベントは、必要なイベントインターフェイスを実装するCOMクラスを作成することによってキャッチされます。空の実装でもかまいませんが、インターフェイスのすべてのイベントを実装する必要があります。

例えば

&& Create an event handler
oHandler = CREATEOBJECT("MapPointEventHandler") 

&& Connect our _ApplicationEvents implementation
EVENTHANDLER( oMyMapPointApp, oHandler)


&& Here is our event handler

DEFINE CLASS MapPointEventHHandler AS Session OLEPUBLIC 
IMPLEMENTS _ApplicationEvents IN "MapPoint.Application"

 && Call back when MapPoint Quits

   PROCEDURE _ApplicationEvents_Quit()  
      MESSAGEBOX("QuitHandler called")
   ENDPROC

   && Event indicates MapPoint is about to close
   PROCEDURE _ApplicationEvents_BeforeClose( bcancel as logical) AS VOID
      MESSAGEBOX("before close called")
   ENDPROC

   && These events are not used here, but must be defined for COM/class compatibility
   PROCEDURE _ApplicationEvents_BeforeSave( SaveAsUI AS logical @, bcancel as logical) AS VOID
      *? PROGRAM()
   ENDPROC
   PROCEDURE _ApplicationEvents_New() AS VOID
      *? PROGRAM()
   ENDPROC
   PROCEDURE _ApplicationEvents_Open() AS VOID
      *? PROGRAM()
   ENDPROC    

ENDDEFINE

メソッドを渡すこともできますが(メニュー項目など)、これらを同じクラスに渡すことはできません。実装するイベントハンドラインターフェイスごとに1つのクラスを実装し、メニューコールバックを処理するために個別のクラスを実装する必要があります。

メニュー項目の例を次に示します。

&& Create a menu handler
oMyMenu = CREATEOBJECT("MapPointMenuHandler") 

&& Add our Tools menu entries and hook them up
oMyMapPointApp.AddCommand("Custom Menu Item", "MyMenuCallBack", oMyMenu)


&& This class implements the Tools menu callbacks
&& *** NOTE: MessageBox will appear UNDER MapPoint

DEFINE CLASS MapPointMenuHandler AS Session OLEPUBLIC 

   PROCEDURE MyMenuCallback()
      MESSAGEBOX("Main Menu callback")
   ENDPROC  

ENDDEFINE  
于 2012-08-22T17:07:57.933 に答える