Агент “Мерлин”
На досуге решил прочитать последний учебник по программированию. Ничто не делается просто так и на чтение учебника были причины. Но причины для нас сейчас не важны, важны последствия.
Учебник оказался хорош - активизировал умственную деятельность. Читая главу про automation, вспомнил статью про одну интересную технологию. Поддался порыву и успешно технологию испытал. Чем и собираюсь поделиться в этой статье.
А пока смотрим демо-ролик.
В данной статье мы рассмотрим способ внедрения технологии Microsoft Agent в Navision. Основная задача забавного персонажа – общаться с пользователем, например, выводить сообщения об ошибке. Так же веселая скрепка или волшебник, не стесняясь в выражениях, могут пояснить, почему они считают пользователя низшим существом.
Приступим.
Создадим новый отчет со следующими свойствами:
- UseReqForm = Yes
- ProcessingOnly = Yes
В принципе можно обойтись и формой.В отчете объявим следующие переменные типа Automation:
- Agent ‘Microsoft Agent Control 2.0′.Agent
- AgentChar ‘Microsoft Agent Control 2.0′.IAgentCtlCharacter
В триггере onInitReport добавим следующий код:
CREATE(Agent); Agent.Connected:=TRUE; Agent.Characters.Load('merlin','merlin.acs'); //merlin – это идентификатор создаваемого персонажа, может быть любым. //merlin.acs – это сам агент. По умолчанию ищется в папке %WINDIR%\msagent\chars\ //также можно указать web узел на котором обитают иные интересные агенты. AgentChar:=Agent.Characters.Character('merlin'); //Переменная AgentChar ссылается на загруженного персонажа merlin. //Теперь с ним можно делать, все что предусмотрено разработчиками AgentChar.Show(0); //отобразим агента (появится в верхнем, правом углу) //параметр указывает – на необходимость проигрывания соответствующей анимации. AgentChar.MoveTo(500,200,2000); //переместим агента в нужное нам место, //заданное Х и У координатами (500,200), 2000 – это скорость перемещения в миллисекундах //можно указать 0, тогда никакой анимации при перемещении отображаться не будет. AgentChar.Speak('Привет!'); //Заставили агента поздороваться AgentChar.Play('Greet'); //Проиграли подходящую случаю анимацию AgentChar.Play('RestPose'); //Список доступных для каждого персонажа анимацию //представлен здесь http://msdn.microsoft.com/en-us/library/ms695821(VS.85).aspx
Итак, первый этап выполнен. Запустим отчет, волшебник должен появиться в правом углу, перелететь в центр экрана и поздороваться.
Забавно, но не более того.
Теперь попробуем заставить агента реагировать на события. Для этого у переменной Agent установим свойство WithEvents = Yes.
Теперь список стандартных триггеров пополнился событиями Agent Control.
Добавим в некоторые события код:
Agent::DragComplete(CharacterID : Text[1024];Button : Integer;Shift : Integer;x : Integer;y : Integer) AgentChar.Speak('Куда вы меня потащили?'); Agent::DblClick(CharacterID : Text[1024];Button : Integer;Shift : Integer;x : Integer;y : Integer) AgentChar.Speak('Navision - Forever!!!'); AgentChar.Play('Congratulate'); AgentChar.Play('RestPose');
Теперь запустим отчет. Начало такое же, как и прежде, но теперь попробуем перетащить агента мышкой. А теперь выполним двойной щелчок мышью по волшебнику.
Некоторые уже обнаружили всплывающее меню. Меню появляется, если щелкнуть по волшебнику правой кнопкой мыши. Хотелось бы добавить туда несколько команд.
Для этого в конец триггера onInitReport добавим следующий код:
AgentChar.Commands.Add('SampleCommand','Адд-он','',TRUE,TRUE); //SampleCommand – идентификатор создаваемого пункта меню, «Адд-он» - название пункта меню. //Агенты, теоретически, готов воспринимать команду, поданную голосом, //для этого служит третий параметр. Но наш волшебник на это не надрессирован. //Четвертый и пятый параметр – Enabled и Visible соотвественно. AgentChar.Commands.Add('SampleInput','Товары','',TRUE,TRUE); // вторая команда.
Теперь, если щелкнуть по волшебнику правой кнопкой мыши, появится меню с нашими командами. Однако работать они не будут.
Чтобы исправить этот досадный недочет добавим переменную AgentUserInputCtrl ‘Microsoft Agent Control 2.0′.IAgentCtlUserInput.
И добавим код в триггер-событие.
AgentUserInputCtrl:=UserInput; IF AgentUserInputCtrl.Name='SampleCommand' THEN BEGIN AgentChar.Speak('Готовлю адд-он...'); AgentChar.Play('Process'); AgentChar.Play('RestPose'); END; IF AgentUserInputCtrl.Name='SampleInput' THEN BEGIN AgentChar.Hide(0); FORM.RUNMODAL(FORM::"Item List"); AgentChar.Show(0); END; END;
На этом завершим обзор, безусловно, полезной технологии Microsoft Agent.
В приложенном файле находится работающий пример.
Дополнительную информацию можно получить на msdn
Метки: Андрей Панько
18 Июль 2008 в 9:30
Прикольно. Незнаю зачем все это
при прикольно 
18 Июль 2008 в 9:36
Ну слава богу, оценили. А то начал волноваться
PS куда это применить еще не придумал.
28 Июнь 2009 в 8:19
класс
мелоч а приятная
17 Март 2010 в 23:16
Можешь выложить сам файл? Ссылку? Буду благодарен. )))
3 Апрель 2010 в 13:46
Ссылка на файл в предпоследнем абзаце