Microsoft Agent. Часть II | Программирование на Delphi и не только

Реклама на сайте

мультимарочный сканер
Здесь аренда маленькой земли с оформлением.

Почитайте!

Нас читают

Статьи о программировании и не только

Mail.Ru

Rambler's Top100

Programming Blogs - BlogCatalog Blog Directory

Microsoft Agent. Часть II

03.12.2007 от Иван Ширко

Страница: 1 2 3 4

  AnEnum: IEnumVariant;
  flag: Cardinal;
  V: OleVariant;
begin
  //получаем интерфейс анимаций агента
  AnEnum := (Character.AnimationNames.Enum) as IEnumVariant;
  //Сбрасываем указатель списка на начало
  AnEnum.Reset;
  //перебираем все анимации и добавляем их в наш список
  repeat
    AnEnum.Next(1, V, flag);
    if (VarToStr(V) <> '') then
      st.Add(V);
  until (flag = 0);
end;Давайте проверим работоспособность данной процедуры. Добавьте на форму кнопку Button1 и список ListBox1. Дайте заголовок кнопке «Список анимаций» и запишите процедуру обработки её нажатия:procedure TForm1.Button1Click(Sender: TObject);
begin
  GetAgentAnim(ListBox1.Items);
end;
Данная процедура записывает список анимаций загруженного персонажа в компонент ListBox1. А теперь сделаем так, чтобы при двойном щелчке мышкой по ListBox’у Джин проигрывал выбранную анимацию:

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  Request := Character.Play(ListBox1.Items[ListBox1.ItemIndex]);
end;

Теперь посмотрим, зачем нам переменная Request (её мы объявили как глобальную). Именно она служит для синхронизации действий персонажа (либо персонажей, если их несколько). Интерфейс IAgentCtlRequest имеет одно очень полезное свойство – Status. В зависимости от состояния запроса, который в данный момент выполняет персонаж, это свойство принимает следующие значения:

Status | Пояснения
  0             Запрос успешно выполнен
  1             Запрос «провалился»
  2             Запрос не выполняется, т.к. ждёт завершения обработки других запросов
  3             Запрос прерван
  4             Запрос обрабатывается

На основе этой таблички легко написать процедуру, которая будет дожидаться выполнения всех запросов к персонажу, а затем вернёт программе управление:

procedure WaitFor(Request:IAgentCtlRequest);
begin
  repeat
    Application.ProcessMessages;
    Status := Request.Status;
  until (Request.Status <> 2) and (Request.Status <> 4);
end;

Для примера добавьте на форму кнопку «Пример WaitFor»:

procedure TForm1.Button3Click(Sender: TObject);
begin
  //Джин произносит фразу
  Request := Character.Speak('Доброе утро', EmptyParam);
  {waitfor(Request);}
  //Показываем сообщение
  ShowMessage('Всё');
end;

Страница: 1 2 3 4

Рубрики: Delphi, MsAgent |

Комментарии (2)

  1. Алексей Родионов пишет:

    Просто превосходно!

  2. Попугай пишет:

    Конкретно и понятно.

Оставить комментарий

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.