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.