Es war im Frühjahr 2005, vor etwas weniger als zwei Jahren. David arbeitete an der COM-Schnittstelle für APL2 und ich durfte sie hier und da testen. Parallel arbeitete ich an einem Vortrag für die kommende Tagung der GSE APL2-Arbeitsgruppe. Irgendwie schien es nahe liegend, in den Vortrag helfend die MS Agents einzubeziehen.
Die Idee war nicht neu: Im Mai 1999 hatte ich mir von Merlin und Konsorten einige Erklärungen zu dem damals neuen APL2-Runtime Feature (das es inzwischen so auch nicht mehr gibt) abnehmen lassen. Zur Programmierung der Agents bot sich damals VBA unter Powerpoint an, obwohl ich auch APL+Win hätte nehmen können - APL2 dagegen nicht.
Ich versuchte vor zwei Jahren also, die Szenarien, die ich 1999 in VBA entwickelt hatte, mit APL2 und der neuen COM-Funktion nachzubauen. Das klappte erwartungsgemäß auch ohne prinzipielle Probleme. Nur zwei Dinge konnte ich nicht wie gewünscht umsetzten:
"Bookmarks" waren nicht umsetzbar, "Housekeeping" erst nach Ende einer Szene nur händisch oder durch Setzen von ⎕DL. Der Grund für beides war die damals fehlende Unterstützung für COM-Events.
Und die gibt es inzwischen - seit Service Level 7 - und damit konnte ich mir nun beide Wünsche erfüllen.
Zum Ersten das automatische Aufräumen der APL2-COM-Umgebung nach Beenden einer Szene, oben "Housekeeping" genannt. Gemeint sind damit Aufgaben wie (siehe APL2 User's Guide, S.204f)
REQUEST←COM ’METHOD’ MERLIN ’Hide’
COM ’RELEASE’ REQUEST
⍝ Release merlin
COM ’RELEASE’ MERLIN
⍝ Unload merlin
0 0⍴COM ’METHOD’ AGENT ’Characters.Unload’ ’Merlin’
⍝ Release the agent
COM ’RELEASE’ AGENT
Damit diese Zeilen nicht ausgeführt werden, bevor die Agenten alle vorher angeforderten Tätigkeiten ausgeführt haben, hat David in in seinem "COM Microsoft Agent Example" im User's Guide das Click-Ereignis zu Hilfe genommen. Die entsprechenden Zeilen wurden in meiner VBA-Implementierung beim Schließen eines Dummy-Dialogs bzw. der Präsentation aktiviert.
Für meine Szenarien soll dies allerdings ohne jeglichen manuellen Eingriff geschehen. Nach kurzer Suche in der Liste der verfügbaren Events für das "Agent.Control"-Objekt (COM 'QUERY' 'EVENTS' handle) gab ich dem Ereignis "RequestComplete" gute Chancen, meine Anforderung erfüllen zu können.
Dazu deklariere ich einen "Handler" für das Event:
SET_HANDLERS AC(1 2⍴'RequestComplete' 'REQUESTCOMPLETE')
In einer "Warteschleife" wie im Beispiel des User's Guide wird dann auf die Beendigung der letzte Anweisung für einen Agenten abgewartet:
LAST_REQUEST←METHOD GENIE 'Hide'
LOOP:
(ET MSG RES←1 COM 'WAIT' ¯1
→(RES[2 7]≡'RequestComplete'(,LAST_REQUEST))/END
→LOOP
END:
Hier können dann die Aufräumarbeiten begonnen werden.
"Bookmarks" und die weiteren Events können ganz analog eingebunden werde. Damit steht mir nun auch mit APL2 der ganze Welt der MS Agents offen.
Handelt es sich bei den Microsoft Agents tatsächlich um eine ausgereifte Technologie? Es soll wohl eine "Technologie" sein, aber auch nicht mehr: "This is because Microsoft Agent, by itself, is really just a software technology rather than a complete
Aufgenommen: Jan 14, 21:10