KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q305471: HOWTO: Use IMPLEMENTS with Microsoft Agent and Visual FoxPro

Article: Q305471
Product(s): Microsoft FoxPro
Version(s): 7.0
Operating System(s): 
Keyword(s): kbAutomation kbvfp kbGrpDSFox kbDSupport kbvfp700
Last Modified: 05-SEP-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual FoxPro for Windows, version 7.0 
-------------------------------------------------------------------------------

SUMMARY
=======

Microsoft Visual FoxPro (VFP) 7.0 introduces the IMPLEMENTS and EVENTHANDLER
keywords. These additions to the language allow you to handle events that are
raised in a Component Object Model (COM) object's interface. This article
demonstrates some of the events that the Microsoft Agent version 2.0 control can
raise, and how VFP can work with them.

MORE INFORMATION
================

Agent is preinstalled on Microsoft Windows 2000, Microsoft Windows Me, and
Microsoft Windows XP. To download Agent for other platforms, and to obtain
additional characters (such as the Genie that is referenced in the code below),
see the following Microsoft Web site:

  http://www.microsoft.com/products/msagent/
  (http://www.microsoft.com/products/msagent/)

The new Object Browser in VFP 7.0 allows you to view the properties, events, and
methods of COM objects, as well as constants and enumerations, classes, and
interfaces. IMPLEMENTS works with the interfaces that the Object Browser
displays.

The following steps create a class that you can use with EVENTHANDLER. At the end
is the end result of these steps, plus modifications in the Show, Hide,
RequestStart, RequestComplete, IdleStart, IdleComplete, Move, BalloonShow, and
BalloonHide methods. You will need to paste this code in your class.

1. On the Tools menu, click Object Browser.

2. Click the Open Type Library button in the upper left corner of the user
  interface.

3. If this is the first time you are running the Object Browser, wait for the
  list of COM libraries to be built.

4. Select Microsoft Agent Control 2.0 and click OK.

5. Expand AgentObjects, then expand Interfaces.

6. In the command window, type "MODIFY COMMAND impAgent" (without the quotation
  marks).

7. In the Object Browser, drag _AgentEvents to the impAgent window.

8. Review the following code, and make the specified changes to the methods in
  the class definition that you just created.

  DEFINE CLASS myClass AS SESSION OLEPUBLIC

     IMPLEMENTS _AgentEvents IN "c:\winnt\msagent\agentctl.dll"

     PROCEDURE _AgentEvents_ActivateInput(CharacterID AS STRING) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_DeactivateInput(CharacterID AS STRING) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_Click(CharacterID AS STRING, Button AS INTEGER, ;
        Shift AS INTEGER, x AS INTEGER, y AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_DblClick(CharacterID AS STRING, Button AS INTEGER, ;
        Shift AS INTEGER, x AS INTEGER, y AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_DragStart(CharacterID AS STRING, Button AS INTEGER, ;
        Shift AS INTEGER, x AS INTEGER, y AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_DragComplete(CharacterID AS STRING, ;
        Button AS INTEGER, Shift AS INTEGER, x AS INTEGER, y AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_Show(CharacterID AS STRING, Cause AS INTEGER) AS VOID
        ACTIVATE SCREEN
        ? "Showing " + ALLTRIM(CharacterID)
        IF Cause = 2   && User clicked on taskbar icon
           ?? " because you said so."
        ENDIF
     ENDPROC

     PROCEDURE _AgentEvents_Hide(CharacterID AS STRING, Cause AS INTEGER) AS VOID
        ACTIVATE SCREEN
        ? "Hiding " + ALLTRIM(CharacterID)
        IF Cause = 1 OR Cause = 7   && User clicked on taskbar icon or character
           ?? " because you said so."
        ENDIF
     ENDPROC

     PROCEDURE _AgentEvents_RequestStart(Request AS VARIANT) AS VOID
        ACTIVATE SCREEN
        ? "Agent is starting request."
     ENDPROC

     PROCEDURE _AgentEvents_RequestComplete(Request AS VARIANT) AS VOID
        ACTIVATE SCREEN
        ? "Agent has finished request."
     ENDPROC

     PROCEDURE _AgentEvents_Restart() AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_Shutdown() AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_Bookmark(BookmarkID AS NUMBER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_Command(UserInput AS VARIANT) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_IdleStart(CharacterID AS STRING) AS VOID
        WAIT WINDOW "Hey, I'm getting bored here!" NOWAIT
     ENDPROC

     PROCEDURE _AgentEvents_IdleComplete(CharacterID AS STRING) AS VOID
        WAIT WINDOW "Ah, that's better...." NOWAIT
     ENDPROC

     PROCEDURE _AgentEvents_Move(CharacterID AS STRING, x AS INTEGER, ;
        y AS INTEGER, Cause AS INTEGER) AS VOID
        IF Cause = 1   && User moved
           WAIT WINDOW "Hey, I liked it where I was!" NOWAIT
        ENDIF
        IF Cause = 2   && Application moved
           WAIT WINDOW "Yes, boss." NOWAIT
        ENDIF
     ENDPROC

     PROCEDURE _AgentEvents_Size(CharacterID AS STRING, Width AS INTEGER, ;
        Height AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_BalloonShow(CharacterID AS STRING) AS VOID
        ACTIVATE SCREEN
        ? ALLTRIM(CharacterID) + " is talking"
     ENDPROC

     PROCEDURE _AgentEvents_BalloonHide(CharacterID AS STRING) AS VOID
        ACTIVATE SCREEN
        ? ALLTRIM(CharacterID) + " is not talking anymore"
     ENDPROC

     PROCEDURE _AgentEvents_HelpComplete(CharacterID AS STRING, Name AS STRING, ;
        Cause AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_ListenStart(CharacterID AS STRING) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_ListenComplete(CharacterID AS STRING, ;
        Cause AS INTEGER) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_DefaultCharacterChange(GUID AS STRING) AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_AgentPropertyChange() AS VOID
        * Add user code here.
     ENDPROC

     PROCEDURE _AgentEvents_ActiveClientChange(CharacterID AS STRING, ;
        Active AS LOGICAL) AS VOID
        * Add user code here.
     ENDPROC

  ENDDEFINE

9. Create a form to fire the events.

NOTE: Make sure that the Genie character has been installed on your computer
before you attempt to run this form.

  PUBLIC oFrmAgent

  oFrmAgent = NEWOBJECT("frmAgent")
  oFrmAgent.Show()
  RETURN

  DEFINE CLASS frmAgent AS FORM

     Height = 134
     Width = 276
     AutoCenter = .T.
     Caption = "Agent Control Form"
     Name = "frmAgent"
     oEvents1 = .NULL.
     oRequest1 = .NULL.
     oRequest2 = .NULL.

     ADD OBJECT cmdSpeak AS commandbutton WITH ;
        Top = 24, ;
        Left = 96, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "Speak", ;
        Name = "cmdSpeak"

     ADD OBJECT cmdMove AS commandbutton WITH ;
        Top = 72, ;
        Left = 96, ;
        Height = 27, ;
        Width = 84, ;
        Caption = "Move", ;
        Name = "cmdMove"

     PROCEDURE INIT
        CLEAR

        WITH ThisForm
           *!* Add the Agent control to the form.
           .AddObject("oleAgent1", "OleControl", "Agent.Control")

           *!* Create the implementing class, and assign it to a form variable.
           .oEvents1 = NEWOBJECT("myClass", "impAgent.prg")

           *!* Associate the Agent control with the implementing class.
           EVENTHANDLER(.oleAgent1.Object, .oEvents1)

           *!* Load and display the characters.
           WITH .oleAgent1.Object
              .Characters.Load("Merlin", "Merlin.acs")
              .Characters("Merlin").MoveTo(10, 10)

              .Characters.Load("Genie", "Genie.acs")
              .Characters("Genie").MoveTo(100, 100)

              .Characters("Merlin").Show()
              .Characters("Genie").Show()
           ENDWITH
        ENDWITH
     ENDPROC

     PROCEDURE QueryUnload
        WITH ThisForm.oleAgent1.Object
           ThisForm.oRequest1 = .Characters("Merlin").Hide()
           ThisForm.oRequest2 = .Characters("Genie").Hide()
           DO WHILE ThisForm.oRequest1.Status != 0 AND ;
                 ThisForm.oRequest2.Status != 0
              DOEVENTS
           ENDDO

           *!* The following line is required to keep the variables in
           *!* scope until the event handler finishes. After this method
           *!* completes, the form closes, and the oRequest variables
           *!* disappear.
           WAIT WINDOW "" TIMEOUT 1  

           .Characters.Unload("Merlin")
           .Characters.Unload("Genie")
        ENDWITH
     ENDPROC

     PROCEDURE cmdSpeak.Click
        *!* The request object must remain in scope for the Agent events
        *!* to fire.
        WITH ThisForm
           .oRequest1 = .oleAgent1.Characters("Merlin").Speak("To be, " + ;
              "or not to be: that is the question.")
        ENDwith
     ENDPROC

     PROCEDURE cmdMove.Click
        ThisForm.oleAgent1.Characters("Merlin").MoveTo(300, 300)
     ENDPROC
  ENDDEFINE

After you run this form, try working with the agents by clicking both the agents
and the form buttons. You can also try getting an object reference from the
command line (oFrmAgent.oleAgent.Object) and controlling the characters
directly, and putting code in impAgent to handle the other events that occur.

REFERENCES
==========

For additional information on Visual FoxPro and Agent, click the article number
below to view the article in the Microsoft Knowledge Base:

  Q191950 HOWTO: Control Microsoft Agent with Visual FoxPro

For more information about Agent, see the following Web site:

  http://www.msagentring.org/

For more information, see the following article:

  Neklioudov, Nick. "Talk to Me!" FoxPro Advisor, August 2001.

Additional query words:

======================================================================
Keywords          : kbAutomation kbvfp kbGrpDSFox kbDSupport kbvfp700 
Technology        : kbVFPsearch kbAudDeveloper kbVFP700
Version           : :7.0
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.