Session D-HELPEinbindung von Hilfe mit den Microsoft AgentsNathalie Mengel
|
Komponente |
Installationsdatei |
Beschreibung |
Microsoft Agent Core Components |
\msagent.exe |
Enthält den Agent Server, das ActiveX-Control und das MS Speech Application Programming Interface (SAPI). Muss unbedingt auf dem Zielrechner installiert sein. |
Microsoft Agent Character Files |
\chars\*.exe |
Installiert die Character. Diese werden im Verzeichnis %SystemDir%\MSAgent\Chars\ als *.acs abgelegt. Die Character-Daten werden dynamisch geladen und können so auch z.B. für WebSites nachgeladen werden. |
Lernout & Hauspie® TruVoice Text-To-Speech Engine |
\speech\tv_enua.exe |
Text-To-Speech Engine, die die Sprachausgabe ermöglicht. |
International Text-To-Speech-Engines |
\speech\lhtts***.exe |
Die TTS-Engine für deutsche Sprache wird über die Datei lhttsged.exe installiert. |
Microsoft Agent Language Components |
\intl\agtx****.exe |
Die DLL für deutsche Sprache wird über die Datei agtx0409.exe installiert. |
Speech Control Panel |
\speech\spchcpl.exe |
Installiert sich in der Systemsteuerung. Mit diesem Tool kann man die Sprachausgabe feintunen (z.B. die Sprachgeschwindigkeit der Standardstimmen ändern). |
Microsoft Speech Recognition |
\speech\actcnc.exe |
Spracherkennungs-Engine. Damit kann der Character gesprochene Befehle erkennen. |
Microsoft Agent Character Editor |
\sdk\ace.exe |
Editor zum Erstellen neuer Character. |
Microsoft Office Palette |
\sdk\assistpalet.bmp |
Es wird empfohlen, diese Palette bei der Erstellung neuer Character zu benutzen. |
Microsoft Agent Linguistic Information Sound Editing Tool |
\sdk\liset.exe |
Tool zum Erstellen phonetischer Informationen für WAV-Dateien. Damit wird die Lippen-Synchronisation der Character optimiert. |
Das MS Agent ActiveX Control bietet eine Programmierschnittstelle, die von VFP aus genutzt werden kann. Das Object Model des Agent Controls ist entsprechend folgender Graphik hierarchisch aufgebaut (gepunktete Linien bedeuten, dass davon mehrere Objekte existieren können):
Der MS Agent Server arbeitet in den meisten Fällen asynchron. Dadurch läuft die eigene Anwendung einfach weiter, während der Server noch damit beschäftigt ist, das aufgerufene Kommando auszuführen (z.B. eine Character-Animation abzuspielen). Über Request-Ojekte kann der Status für eine bestimmte Aktion abgefragt werden. Dies ermöglicht das sequentielle Abarbeiten von Aktionen, so dass man Aktionen des MS Agent und des Anwendungsprogramms synchronisieren kann.
Das Agent Control ist die Schnittstelle zum Agent Server. Über das Agent Control kann man auf Events und die meisten anderen Objekte des Microsoft Agent Servers zugreifen (siehe Hierarchie-Grafik). Das Agent Control verfügt auch über eigene Eigenschaften, die angesprochen werden können.
Das Characters Objekt ist eine Collection der geladenen Character Objekte. So kann man in einer Anwendung mehrere Character laden und steuern. Man spricht das einzelne Character Objekt als Item in der Characters Collection an.
Ein Character ist ein Objekt der Characters-Collection. Man lädt einen bestimmten Character (z.B. Peedy) in die Characters Collection. Die einzelnen Characters werden über die Collection angesprochen und verfügen über eigene Methoden und Eigenschaften.
Man kann in der Client-Anwendung eigene Kommandos definieren. Diese werden in der Commands Collection abgelegt. D.h., dass diese Befehle nur aufgerufen werden können, wenn die Client-Anwendung aktiv ist, die diese Befehle definiert hat.
Ein Command Objekt ist ein Item in der Commands Collection. Der Server stellt den Zugriff auf die Command Objekte einer Anwendung zur Verfügung, sobald die Client-Anwendung die aktive Anwendung für Benutzereingaben ist. Um auf ein Command Objekt zuzugreifen, gibt man seinen Namen als Referenz in der Commands Collection an.
Der Benutzer kann ein Command Objekt über das Pop-up-Menü des aktiven Characters oder über das Spracheingabe Fenster aufrufen. Um einen Befehl im Pop-up-Menü sichtbar zu machen, muss die Eigenschaft "Visible" des entsprechenden Command Objekts gesetzt sein. Um im Spracheingabe-Fenster zu erscheinen, müssen die Eigenschaften "VoiceCaption" und "Voice" gesetzt sein.
Wie in einem Comic stellt das Balloon Objekt die vom Character gesprochenen Worte (Methode "Speak") als Sprechblase und die gedachten Worte (Methode "Think") als "Denkblase" dar.
Die AnimationNames Collection enthält eine Liste der Namen für die Animationen, die für einen Character verfügbar sind. Über diese Collection kann man feststellen, welche Animationen von einem bestimmten Character unterstützt werden.
Über das AudioOutput Objekt kann man auf die Audio Eigenschaften des Servers zugreifen. Die Eigenschaften sind für den Client Read-Only, können lediglich vom Benutzer über das Eigenschaftsfenster des Agents geändert werden.
Über das SpeechInput Objekt erhält man Zugriff auf die Spracheingabe Eigenschaften des MS Agent Servers. Die Eigenschaften sind für die Client-Anwendung Read-only , können lediglich vom Benutzer über das MS Agent Eigenschaftsfenster geändert werden. Voraussetzung ist, dass eine Sprachengine installiert und aktiviert ist.
Über das CommandsWindow Objekt erhält man Zugriff auf die Eigenschaften des Spracheingabe-Fenster (Voice Commands Window). Das Spracheingabe-Fenster ist eine gemeinsam genutzte Ressource, über die der Benutzer die Commands sehen kann, die über Spracheingabe aufgerufen werden können. Wenn die Spracherkennung deaktiviert ist, zeigt das Spracheingabe-Fenster den Text "Speech input disabled" an, und zwar in der Sprache des aktiven Characters.
Über das PropertySheet Objekt können einige Eigenschaften des Characters geändert werden.
Der MS Agent Server ist ein COM-Server. Um ihn ansprechen zu können, muss die Client-Anwendung zunächst eine Connection zum Server aufbauen. Dies kann zur Laufzeit programmatisch über die Standard COM Schnittstellen
des MS Agent Servers geschehen. Oder man nutzt einfach das mitgelieferte ActiveX-Control und fügt dieses während des Designs in die Anwendung ein. Sobald man eine Instanz des Controls hat, kann man darüber nicht nur auf die
Eigenschaften des Controls selbst, sondern auch auf die der untergeordneten Objekte zugreifen. Wenn man das ActiveX Control zur Designzeit nutzen möchte, fügt man es zur Form hinzu, z.B. indem man das ActiveX Steuerelement (OleControl) aus der Toolbar für Formular-Steuerelemente auf die Form zieht.
Daraufhin wird der Dialog "Objekt einfügen" angezeigt, in dem man das Microsoft Agent Control 2.0 als Steuerelementtyp auswählt.
Schon kann man über das Eigenschaftsfenster auf Eigenschaften und Events des Agents zugreifen:
Das Control wird zur Laufzeit instantiiert. Dabei wird der Agent Server (agentsvr.exe) in einem separaten Prozess gestartet. Es läuft immer nur eine Instanz des Agent Servers, die von den unterschiedlichen
Client-Anwendungen genutzt wird. Das Agent-Icon auf der Form ist zur Laufzeit nicht sichtbar.
Eine andere Möglichkeit ist, das Control zur Laufzeit zu erzeugen und eine Referenz darauf in einer Variablen zu speichern: Dann muss man allerdings noch eine Connection zum MS Agent Server öffnen: Die Connection wird geschlossen, wenn die Client-Anwendung beendet wird. Der Prozess des Agent Servers wird beendet, wenn keine Connection mehr zu ihm besteht.
Im Code können Methoden des Objekts und seiner untergeordneten Objekte nun folgendermaßen aufgerufen werden: bzw.:
Eigenschaften werden wie folgt gesetzt: bzw.:
Nun kann man nahezu beliebig viele Character in die Characters-Collection laden. Die Daten der Character werden standardmäßig in .ACS-Files im Verzeichnis MSAgent\Chars unter dem Windows-Verzeichnis gespeichert.
Als ersten Parameter gibt man beim Laden den Namen an, unter dem man den Character innerhalb der Collection anspricht. Der zweite Parameter ist der Name des ACS-Files. Wenn sich dieser in einem anderen als dem Standardverzeichnis
befindet, kann man auch den vollqualifizierten Pfad mitgeben:
Wenn auf dem Rechner mehrere Character installiert sind, kann der Benutzer über den Eigenschafts-Dialog des Characters einen Standard-Character auswählen. Man kann einfach den Standard-Character laden, indem man
den Namen der .ACS-Datei weglässt: Man kann zwar grundsätzlich beliebige Namen wählen, mit denen man die Character in der Collection anspricht. Wenn man aber eine Referenz auf den Character in einer Variablen ablegen möchte, um den Character so
direkt ansprechen zu können, dann muss man den Namen des Characters benutzen: Nachdem man das Control instantiiert und mindestens einen Character geladen hat, kann man den Character endlich anzeigen. Dies geschieht über die Methode "Show". Der Character spielt bei seinem Auftritt
seine Show-Animation ab. Verschwinden lassen kann man den Character über die Methode "Hide", was bewirkt, dass der Character seine Hide-Animation spielt und dann verschwindet. Unabhängig davon kann der Benutzer den Character
jederzeit über das Kontextmenü verschwinden lassen. Jeder Character verfügt über eine bestimmte Anzahl von Animationen, die er abspielen kann. Die Animationen sind sprechend benannt, und es gibt eine Anzahl von Animationen, die von jedem Character unterstützt
werden (z.B. die Show-Animation, die automatisch abgespielt wird, wenn der Character erscheint). Die Animationen wurden aber für jeden Character speziell programmiert, so dass unterschiedliche Character unterschiedliche Aktionen ausführen,
wenn die Animation läuft. So fliegt z.B. Peedy ins Bild, während Merlin sich selbst herbeizaubert. Es ist wichtig zu wissen, welche Animationen der Character unterstützt, denn wenn man versucht, eine Animation aufzurufen, die nicht
von dem angesprochenen Character unterstützt wird, dann erzeugt das Control einen OLE-Ausnahmefehler. Eine Beschreibung der Animationen ist für jeden Character in der SDK-Dokumentation vorhanden.
Die Namen der Animationen sind in der AnimationNames-Collection abgelegt. Es empfiehlt sich, diese Collection auszulesen, so dass man prüfen kann, ob eine Animation überhaupt existiert: Man ruft Animationen auf, indem man den Namen der Animation als Parameter an die Methode "Play" des gewünschten Character übergibt: Der Character kann sich selbsttätig auf der Arbeitsoberfläche positionieren. Man braucht nur in der Methode "MoveTo" die Koordinaten anzugeben, dann wird eine Bewegungsanimation gestartet, mit der der
Character sich an die gewünschte Stelle bewegt: Da sämtliche Aktionen über den Agent Server gesteuert asynchron ablaufen, läuft die Client-Anwendung sofort nach dem Aufruf von Animationen oder Methoden der Character weiter. Auch wenn man Aktionen von mehreren
Characters ausführen lässt, werden diese nicht automatisch sequentiell abgespielt. Der Server startet die Animationen zwar nacheinander, aber die Character sind unabhängig voneinander, so dass ein Character nicht darauf wartet, dass
die Animation des anderen Characters fertig ist, bevor er seine Animation ablaufen lässt. Dadurch kommt es zu unerwünschten Überlagerungen. Um diese zu verhindern, erzeugt man beim Aufruf einer Methode ein Request-Objekt, dessen Status
abgefragt oder in den Agent Control Events "RequestStart" und "RequestComplete" analysiert werden kann.
Wenn man ein Request Objekt erzeugt, wird man vom Agent Server automatisch über den Start, bzw. das Ende einer Aktion benachrichtigt. Dies geschieht über die Agent Control Events "RequestStart" und
"RequestComplete". Da die Aktionen des Agent Servers asynchron laufen, muss man beachten, dass das Request-Objekt noch sichtbar ist, wenn das Event feuert. In der Agent Dokumentation wird dringend empfohlen, das Request-Objekt
als globales Objekt zu deklarieren. Allerdings habe ich bis jetzt keine Nachteile feststellen können, wenn man das Request-Objekt als Eigenschaft einer Form deklariert, auf der das Agent Control aggregiert ist.
Im Event RequestComplete() des Agent Controls wird das Request-Objekt abgefragt:
* Das Event feuert bei jedem Request. Deshalb wird hier abgefragt, ob es sich um das gewünschte Objekt handelt. Achtung: das Objekt wird erst erzeugt, wenn der Agent Server den Befehl ausführt! Deshalb muss
unbedingt abgefragt werden, ob goRequest bereits ein Objekt ist!
Wenn man die Aktionen mehrerer Character sequentiell ablaufen lassen möchte, kann man auch die Methode “Wait” des Characters nutzen. Wait wartet darauf, dass ein Request beendet wird. So kann man Aktionen mehrerer
Character sequentiell ablaufen lassen:
Das Request-Objekt verfügt über folgende Stati, die abgefragt werden können:
Status Beschreibung 0 Request erfolgreich abgeschlossen 1 Request fehlerhaft abgeschlossen 2 Request wartet in der Queue auf Ausführung 3 Request unterbrochen 4 Request wird gerade abgearbeitet Die folgenden Methoden können ein Request-Objekt zurückgeben: GestureAt, Get, Hide, Interrupt, Load, MoveTo, Play, Show, Speak, Wait.
Der Character spricht über die Methode „Speak“. Man kann dieser Methode einen beliebigen Text mitgeben. Der Text wird standardmäßig über eine Sprechblase ausgegeben und tatsächlich gesprochen. Dabei werden
die Lippenbewegungen des Characters mit dem gesprochenen Text synchronisiert. Voraussetzung für die erfolgreiche Ausgabe von Text als Sprache ist die korrekte Installation der Text-To-Speak-Engine und der Sprachbibliothek in der gewünschten
Sprache. Die Sprache, in der der Character den Text sprechen soll, wird über seine Eigenschaft „LanguageID“ eingestellt. Die ID für deutsche Aussprache ist 409 hexadezimal. Natürlich kann man den Character auch in
jeder anderen Sprache sprechen lassen, aber die Ergebnisse sind eher zur Erheiterung denn als Information zu gebrauchen, wenn die eingestellte Sprache nicht der des ausgegebenen Textes entspricht. Außerdem kann man über die Eigenschaft „TTSModeID“ bestimmte Stimmen einstellen. Diese ist mit der ModeID der gewünschten Engine zu füllen. Eine Übersicht über die unterschiedlichen Modes gibt es im Dokument
Speechengines.doc bei der Dokumentation zum Agent SDK. Hier zum Beispiel die Stimme einer deutschen Frau: Die Stimme kann über den Sprach-Eigenschaftsdialog verändert werden. Wenn man das Speech Control Panel installiert, wird dies zur Systemsteuerung hinzugefügt:
Abbildung 4: Speech Control Panel
Nun passiert es durchaus, dass die ausgewählte Stimme den Text nicht ganz so ausspricht, wie man es gerne hätte. Vor allem fremdsprachliche Ausdrücke werden brutal mit dem Akzent ausgesprochen, welcher der ausgewählten
Stimme entspricht. Um dies zu verhindern, kann man die phonetische Entsprechung im Text mitgeben. Die Syntax dafür ist: Damit Genie den Satz „Visual FoxPro ist toll“ verständlich von sich geben kann, muss man also die Methode Speak folgendermaßen aufrufen:
oChar.Speak(" \Map="+CHR(34)+"Wischuell FoxProo"+CHR(34)+"="+CHR(34)+ Jede einzelne Client-Anwendung kann pro Character eine eigene Reihe von Befehlen definieren, die als Commands in der Commands-Collection abgelegt werden. Um einen Befehl zur Commands-Collection hinzuzufügen,
benutzt man die Methoden „Add“ oder „Insert“ der Commands-Collection. Dabei wird der Name des Commands, sein Text im Pop-up-Menü und sein Sprachkommando als Parameter übergeben. Für jedes Command kann festgelegt werden, ob es
im Pop-up-Menü des Clients auftauchen soll und ob es über Spracheingabe aufrufbar sein soll. Das kann direkt beim Hinzufügen des Commands zur Collection geschehen oder nachträglich über die Eigenschaften des Commands eingestellt
werden. Die Eigenschaften „Voice“ und „VoiceCaption“ bestimmen, welches Wort gesprochen werden muss, damit das Command erkannt wird, bzw. welcher Text im Spracheingabefenster erscheinen soll. Die Eigenschaften „Caption“ und
„Visible“ des Commands bestimmen, was im Pop-up-Menü als Bezeichnung für dieses Command ausgegeben wird, bzw. ob diese Auswahl überhaupt sichtbar ist.
Syntax des Befehls Add: Das folgende Beispiel fügt ein Command zur Commands-Collection, dem Pop-up-Menü und der Spracherkennung hinzu. Das Command ist standardmäßig aktiv und im Pop-up-Menü sichtbar: Damit der Character die Befehle hören und (hoffentlich) erkennen kann, muss man ihn in den Listen-Mode versetzen. Dies geschieht, indem man die Methode „Listen“ des Characters aufruft und als Parameter
„.T.“ übergibt. Der Listen-Mode kann wieder ausgeschaltet werden, indem man die Methode „Listen“ mit dem Parameter „.F.“ aufruft, allerdings ist der Listen-Mode längstens für etwa 10 Sekunden aktiv. Danach ist der Character
nicht mehr für gesprochene Befehle empfänglich. Aufgrund des hohen Ressourcenverbrauchs wird dringend davon abgeraten, den Listen-Mode öfter oder länger als nötig zu aktivieren. Ein ständig zuhörender Character, wie man es sich so wünschen
könnte, wird also eher das Betriebssystem in die Knie zwingen als von echtem Nutzen zu sein.
oChar.Listen(.T.)
Wenn nun der Character den gesprochenen Befehl erfolgreich erkannt hat, oder wenn der Benutzer einen Befehl aus dem Pop-up-Menü aufgerufen hat, wird das Event „Command“ des Agent Controls ausgelöst. Es erhält
das aufgerufene Command-Objekt als Parameter. Man kann in diesem Event abfragen, welches Command aufgerufen wurde und die entsprechenden Aktionen dafür ausführen. Um die Dienste des Microsoft Agent nutzen zu können, muss der Agent bereits auf dem Zielsystem installiert sein. Man kann den Microsoft Agent kostenfrei mit der eigenen Anwendung ausliefern, muss dafür aber ein
Lizenzabkommen ausfüllen, um von Microsoft eine Distributionslizenz für den Agent zu bekommen. Das Lizenzabkommen ist in der Datei Agentlic.doc in der Dokumentation zum SDK mitgeliefert. Eine Beschreibung des Lizenzierungsvorgangs
findet man im Dokument Licensing.doc.
Man kann dann die selbstinstallierenden Dateien des Agents mit dem eigenen Programm ausliefern. Man sollte die Agent-Dateien nicht in die Installation des Anwendungsprogramms einbinden, sondern statt dessen die
selbstinstallierenden Agent-Programme z.B. nach Installation des Anwendungsprogramms ablaufen lassen. Dies kann im Rahmen der Installationsroutine z.B. als nachgelagerte Aktion erfolgen. Alternative Installationsmöglichkeiten wie das
Kopieren von einzelnen Agent-Dateien werden nicht unterstützt. Die Installation des Microsoft Agent Servers wird nicht auf Windows 2000 und Windows Me Systemen laufen, weil beide bereits den Agent als Teil des Betriebssystems enthalten.
Um den Agent Server erfolgreich installieren zu können, muss außerdem sichergestellt sein, dass das Zielsystem bereits eine aktuelle Version der Microsoft Visual C++ Runtime (Msvcrt.dll), das Microsoft
Registrierungs Tool (Regsvr32.dll) und die Microsoft COM-DLLs enthält. Am einfachsten ist dies zu erreichen, in dem man auf dem Zielsystem den Microsoft Internet Explorer 3.02 oder folgende installiert. Alternativ kann man auch die beiden
ersten Komponenten separat installieren, sie sind Teil von Microsoft Visual C++. Die benötigten COM-DLLs können als Teil des Microsoft DCOM Updates installiert werden, welches auf der Microsoft Web Site erhältlich ist. Weitere
Informationen auch zur Lizenzierung können ebenfalls auf der Microsoft Web Site eingesehen werden.
Die Sprachkomponenten und Character-Daten werden ebenso über selbstinstallierende Programme installiert. Dabei werden die ACS-Dateien der Character automatisch in das Verzeichnis Agent\Chars unter dem Betriebssystemverzeichnis
installiert.
Wäre es nicht schön, wenn man den Agent wie einen Office-Assistenten agieren lassen könnte? Nicht etwa, dass die meisten Programmierer die hüpfende Büroklammer auch nur ansatzweise erträglich fänden, aber
viele Benutzer haben sich daran gewöhnt, Suchbegriffe in eine Textbox auf der Sprechblase des Assistenten eingeben zu können. Leider sind die Möglichkeiten der Microsoft Agents dahingehend ziemlich limitiert. Nun gibt es eine ganze
Reihe ambitionierter VB-Programmierer, die den Agent in ihr Herz geschlossen haben. Darunter ist Esteban Hugo Somma, der das ActiveX-Control MsgBalloon geschrieben hat. Die Nutzung und Distribution des Controls ist nicht lizenzierungsbedürftig.
Man kann das Control z.B. in die Form einbinden, auf der sich das MS Agent Control befindet. Wenn man den MsgBalloon aufruft, sucht er den Agent, zeigt die gewünschte Message an und gibt den eingegebenen Text zurück. Im Beispiel unten
wurde das MsgBalloon-Control als Objekt „oleBalloon“ auf die Form aggregiert: Weitere Informationen zum MsgBalloon gibt es beim Autor des Controls unter:
http://www.textildoss.com.ar/msgballoon/MsgBalloon.htm
Unter den Foundation Classes von VFP 7.0 befindet sich auch ein MS Agent Wrapper. Dieser und die dazu bereitgestellten Beispiellösungen können als Informationsquelle für eigene Agent-Programmierung oder direkt
genutzt werden.
Das MS Agent SDK ist in kompletter Form auf der Konferenz-CD vorhanden. Wichtigste Informationsquelle ist die Dokumentation zum MS Agent SDK. Diese ist bei Microsoft Press
in gedruckter Form, bzw. im SDK als Word-Dokumente vorhanden.
Die Vielzahl der Dokumente ist allerdings zunächst erschlagend, wenn man in das Doku-Verzeichnis schaut. Das wichtigste Dokument ist m.E. ProgAgentControl.doc, das sich mit
der Programmierung des Agent Controls und der dazugehörigen Objekte beschäftigt. Man sollte allerdings das Objekt-Modell des Agents verstanden und ständig vor Augen haben, um in diesem Dokument erfolgreich navigieren zu können. Das
Dokument hat etwa 115 Seiten und ist nach dem Objekt-Modell aufgebaut. Am einfachsten geht die Navigation, wenn man sich das Dokument in Online-Layout Ansicht anzeigen lässt und dann auf der Inhaltsleiste das gewünschte Objekt auswählt.
Wichtig sind auch die Dokumentationen zu den Character-Animationen. Die Character verfügen über einen teilweise gleichen, teilweise unterschiedlichen Satz von Animationen.
Wenn man versucht, eine Animation für einen Character aufzurufen, die es nicht gibt, dann gibt es eine Fehlermeldung vom Agent-Control. Die Dokumentation zu den Animationen befindet sich in den Dateien <Charactername>AnimationList.doc.
Zur Lizenzierung gibt es im Dokument Licensing.doc Informationen. Das Lizenzabkommen selbst ist im Dokument Agentlic.doc. Weitere Infos sind dazu auch unter:
http://www.microsoft.com/sitebuilder/workshop/imedia/agent/licensing.asp
Die Foundation Classes und Samples in VFP 7.0 sind sehr schön zum abgucken, schließlich sind es fast die einzigen VFP-Beispiele, die mir bisher untergekommen sind. Die Klassen befinden unter: ...VFP7\FFC, Beispiele gibt es unter: ...
VFP7\SAMPLES\SOLUTION\FFC.
Die in der Session gezeigten Beispiele sind natürlich auch auf der Konferenz-CD vorhanden. An dieser Stelle vielen Dank an Bernard Wong von Microsoft, dessen Beispiele und Session ich als Anregung nutzen konnte.
Eine sehr rege und kundige NewsGroup findet man unter news:microsoft.public.msagent. Dort kommunizieren hauptsächlich
VB-Programmierer, aber die Agent-Probleme sind ja größtenteils sprachunabhängig.
Ein lockerer Zusammenschluß von MS Agent Designern und Programmierern findet sich im www unter: www.agent-launchpad.co.uk/links/webring.html.
Von dieser Seite aus kann man sich auf weitere WebSites leiten lassen, die MS Agent nutzen.
Last not least: Die Microsoft Agent WebSite: http://www.microsoft.com/msagent. Dort gibt es das gesamte SDK zum herunterladen und alle möglichen Informationen und Werbetexte.
Abbildung 2: Das ActiveX Control zur Form hinzufügen
Abbildung 3: Das ActiveX Control im Form-Designer
PUBLIC oAgent
oAgent = CREATEOBJECT("Agent.Control.2")
oAgent.Connected = .T.
thisform.Olecontrol1[<.Objekt>].<Methode>(<Parameterliste>)
oAgent[<.Objekt>].<Methode>(<Parameterliste>)
thisform.Olecontrol1[<.Objekt>].<Eigenschaft> = <Wert>
oAgent[<.Objekt>].<Eigenschaft> = <Wert>
Character laden
oAgent.Characters.Load("Genie", "genie.acs")
oAgent.Characters.Load("NennMichWieDuWillst")
oAgent.Characters.Load("Genie", "genie.acs")
oChar = oAgent.Characters("Genie")
oChar.<Methode>()
Character anzeigen und verschwinden lassen
oChar = thisform.Olecontrol1.Characters("Genie")
oChar.Show()
oChar.Hide()
Animationen
LOCAL lnAnimationen, laAnimationen[1], lcAnimationName
lnAnimationen = 1
FOR EACH lcAnimationName in oChar.AnimationNames
DIMENSION laAnimations[lnAnimationen]
laAnimations[lnAnimationen] = lcAnimationName
lnAnimationen = lnAnimationen + 1
NEXT
oChar.Play("Greet")
oChar.Play("Announce")
oChar.Play("Write")
Positionierung
oChar.MoveTo(640, 480)
Agents programmieren: Weitere Schritte
Das Request-Objekt
Beispiel für RequestComplete():
Im Form.Init() wird der Character geladen:
PUBLIC goRequest
goRequest = goAgent.Characters.Load("genie", "genie.acs")
PROCEDURE RequestComplete
*** ActiveX-Steuerelementereignis ***
LPARAMETERS request
WAIT WIND "Die Character-Daten wurden geladen!"
ENDIF
Beispiel für den sequentiellen Ablauf von Aktionen mehrerer Agents:
...
oGenie= goAgent.Characters("Genie")
oMerlin= goAgent.Characters("Merlin")
oGenieReq= oGenie.Speak("Was ist ein Strohballen in einem Manta?")
oMerlin.Wait(oGenieReq)
oMerlinReq = oMerlin.Speak("Weiß ich nicht. Erzähl es mir.")
oGenie.Wait(oMerlinReq)
oGenieReq= oGenie.Speak("Na, Extended Memory natürlich!")
Beispiel für die Status-Abfrage:
IF TYPE("goRequest") == "O"
DO CASE
CASE request.status = 0
WAIT WIND "Die Aktion wurde erfolgreich ausgeführ."
CASE request.status = 1
WAIT WIND "Es ist ein Fehler aufgetreten."
...
ENDCASE
ENDIF
Sprachausgabe
oChar.Speak("Hallo, ich bin Genie")
oChar.LanguageID = 0x407
oChar.TTSModeID = "{3A1FB760-A92B-11D1-B17B-0020AFED142E}"
\Map = "<phonetisch>" = "<Text>" \
"Visual FoxPro"+CHR(34)+"\ ist toll")
Das Command-Objekt
agent.Characters("<ID>").Commands.Add <Name> |,<Caption>| |,<Voice>|
|,<Enabled>| |,<Visible>|
oChar.Commands.Add("CharOpt" , "&Erweiterte Optionen", "options")
PROCEDURE Command
LPARAMETERS toCommand
DO CASE
CASE toCommand.Name == „CharOpt“
this.PropertySheet.Visible = .T. && Eigenschaftsdialog anzeigen
CASE toCommand.Name == „ChgChar“
this.ShowDefaultCharacterProperties() && Character auswählen
CASE toCommand.Name == „UsrDef“
...
OTHERWISE
...
ENDCASE
Distribution
Bonus: InputBox
LOCAL lcResult
oChar.Balloon.Visible = .F.
lcResult = thisform.oleBalloon.InputBalloon( ;
"Bitte geben Sie etwas ein:", "Eingabe über InputBox", , oChar)
IF !EMPTY(lcResult)
MESSAGEBOX(lcResult)
ENDIF
Visual FoxPro 7.0
Wo gibt es Informationen über Agents?
dFPUG c/o ISYS GmbH Frankfurter Str. 21 b
D-61476 Kronberg |
per Fax an: +49-6173-950903 s |
© Texte, Grafiken und Inhalt: ISYS GmbH |