Агент “Мерлин”

На досуге решил прочитать последний учебник по программированию. Ничто не делается просто так и на чтение учебника были причины. Но причины для нас сейчас не важны, важны последствия.
Учебник оказался хорош - активизировал умственную деятельность. Читая главу про 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

Метки:



Комментариев: 5

  1. nenavision пишет:

    Прикольно. Незнаю зачем все это :) при прикольно :)

  2. apanko пишет:

    Ну слава богу, оценили. А то начал волноваться :-)

    PS куда это применить еще не придумал.

  3. LORD_XP пишет:

    класс
    мелоч а приятная

  4. Денис пишет:

    Можешь выложить сам файл? Ссылку? Буду благодарен. )))

  5. apanko пишет:

    Ссылка на файл в предпоследнем абзаце

Оставьте свой отзыв!