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

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

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

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