Hare.ru @ Коллективный разум / Hare.ru @ Дикое место

Архив hare.ru 
Мысли, конвертированные в текст

Полезные технологии


Все статьи раздела

Агенты среди нас. Замена стандартных функций

Алексей Бажитов (апрель 2002)

Наши персонажи на текущем этапе не более чем забавная мулечка, в некоторой степени, способная заменить функцию Сообщить(). Как заставить их работать с большей отдачей? В этой части я попытаюсь рассказать, как заменить предупреждения, ввод значений, выбор из списков и т.п.

Технология MSAgent самостоятельно не умеет делать подобных вещей, но в Cети можно найти разработки, расширяющие ее возможности. Больше всего мне понравился ActiveX-компонент BalloonDialog© (http://www.sommytech.com.ar).

Прямая ссылка для скачивания Trial-версии: http://www.sommytech.com.ar/downloads/balloondialog/BlnDialog.exe (весит 2.5 Мб).

Увы, он не бесплатный, регистрация обходится в 8.95$. В поставке есть подробный help по програмированию с использованием этого компонента.

Именно об использовании BalloonDialog© совместно с Microsoft Agent'ом пойдет речь в данной статье.

Создаем объект BalloonDialog (еще раз напомню, что использовать его лучше только в симбиозе с Microsoft Agent'ом):

Агент = CreateObject("Agent.Control.2");
Агент.Connected = 1;
Агент.Characters.Load("Merlin", "merlin.acs");
Персонаж = Агент.Characters("Merlin");
Персонаж.Show();
Баллон = CreateObject("BlnDialog.Balloon");
Баллон.ResetProperties();

Последняя строчка этого куска кода сбрасывает все установки свойств BalloonDialog'а в значения по умолчанию, и является необходимой при его первоначальной загрузке – иначе будет выдаваться сообщение об ошибке при каждом вызове диалога.

Для начала заменим скучное стандартное Предупреждение:

Баллон.MsgBalloon("Ку-Ку!",,,Персонаж);

Метод MsgBalloon рисует рядом с персонажем диалог-ballon, ждет, пока пользователь нажмет кнопку, и возвращает целое число – номер, соответствующий нажатой кнопке. Первый параметр метода – строка сообщения, второй – целое число, определяющее набор кнопок диалога и тип отображаемой на поле диалога иконки, третий – строка заголовка диалога, четвертый – MSAgent Character (объект, определенный выше). Используя этот последний параметр окно диалога автоматически позиционируется на экране в зависимости от положения персонажа.

Кроме того, при перетаскивании персонажа пользователем диалог-ballon перемещается вместе c ним. Если необходимо заменить стандартный balloon MSAgent'а, cделать это можно следующим образом:

Персонаж.Balloon.Visible=0;
Персонаж.Speak("Всем привет!");
Баллон.MsgBalloon("Всем привет!",,,Персонаж);
Персонаж.Balloon.Visible=1;

или покороче:

Персонаж.Speak("\Map=""Всем привет!""=""""\");
Баллон.MsgBalloon("Всем привет!",,,Персонаж);

С помощью этого метода можно заменить и стандартную функцию встроенного языка Вопрос:

Стр = "Это пример диалога с вопросом.";
Заголовок = "Заголовок диалога";
Ответ = Баллон.MsgBalloon(Стр,36,Заголовок,Персонаж);
Если Ответ = 6 Тогда
Сообщить("Вы выбрали ""Да""");
Иначе
Сообщить("Вы выбрали ""Нет""");
КонецЕсли;

Расшифруем "магическое" число – 36 в приведенном выше коде, возможные значения второго параметра делятся на две группы, набор кнопок:

0 – отображается только кнопка "ОК";
1 – отображаются "ОК" и "Cancel" кнопки;
2 – отображаются "Abort", "Retry", и "Ignore" кнопки;
3 – отображаются "Yes", "No", и "Cancel" кнопки;
4 – отображаются "Yes" и "No" кнопки;
5 – отображаются "Retry" и "Cancel" кнопки;

и тип иконки диалога:

16 – отображается иконка "Ошибка";
32 – отображается иконка "Вопрос";
48 – отображается иконка "Предупреждение";
64 – отображается иконка "Информация";
80 – отображается произвольная иконка, определяемая свойствами IconPicture или URLIconPicture.

Окончательное значение параметра – сумма значений по одному из каждой группы.

Возвращаемое методом значение:

1 – если пользователь нажал кнопку "ОК";
2 – если пользователь нажал кнопку "Cancel";
3 – если пользователь нажал кнопку "Abort";
4 – если пользователь нажал кнопку "Retry";
5 – если пользователь нажал кнопку "Ignore";
6 – если пользователь нажал кнопку "Yes";
7 – если пользователь нажал кнопку "No";

Будет гораздо удобней использовать и параметр, и возвращаемое значение, если предопределить соответствующие коллекции констант, как, к примеру, в VB (помните: vbYesNo + vbQuestion). Именно так сделано в примере к данной статье.

Однако нашим пользователям не понравится давить на "англоязычные" кнопки, перевести их поможет свойство ButtonsCaptions.

Баллон.ButtonsCaptions = "&ОК;О&тмена;П&рервать;&Повторить;&Игнорировать;&Да;&Нет";

А еще, с его помощью, можно произвольно менять надписи на кнопках:

Баллон.ButtonsCaptions = "&ОК;&Отмена;Н&а фиг!;Н&е фиг!;П&о фиг!;&Да;&Нет";
Ответ = Баллон.MsgBalloon(Стр,2+48,Заголовок,Персонаж);
Если Ответ = 3 Тогда
Сообщить("Вы выбрали ""На фиг!""");
ИначеЕсли Ответ = 4 Тогда
Сообщить("Вы выбрали ""Не фиг!""");
Иначе
Сообщить("Вы выбрали ""По фиг!""");
КонецЕсли;
Баллон.ButtonsCaptions = "&ОК;&Отмена;П&рервать;&Повторить;&Игнорировать;&Да;&Нет";

После всякого переименовывания кнопок не забывайте восстанавливать стандартные надписи, иначе на следующий вопрос пользователю будет трудно выбрать правильный ответ. Может, кто-то не знает, что символ "&" в заголовке кнопки ставится перед будущим "псевдо-горячим" или подчеркнутым символом для отработки комбинации Alt + подчеркнутая буква.

Следует соблюдать количество и последовательность заголовков кнопок в этой строке. Значение для набора кнопок и возвращаемое значение методом MsgBalloon определяются исходя из этой последовательности, несмотря на реальные заголовки кнопок.

Следующий метод заслуживающий особого внимания – InputBalloon(), отображает на экране диалог с окошком ввода текста, ждет пока пользователь введет текст и по клику на кнопке возвращает введенную строку.

Имя = Баллон.InputBalloon("Введите ваше имя.","Имя пользователя","Вася Пупкин",Персонаж);
Баллон.MsgBalloon("Здравствуй, " + Имя + ".",,,Персонаж);

Первый параметр – строка сообщения, второй – строка заголовка диалога, третий – строка текста по умолчанию, четвертый – переменная, содержащая объект Character.

Теперь наш агент вполне способен заменить, (а кое в чем и переплюнуть) функции Сообщить(), Предупреждение(), Вопрос() и, по крайней мере, ВвестиСтроку().

К сожалению, MsgBalloon и InputBalloon не предлагают таймаут – время ожидания ответа пользователя, но этот недостаток легко обойти и средствами встроенного языка.

Значительно расширяет возможности использование объекта FormBalloon. С его помощью можно создавать более сложные диалоги, включающие радио-кнопки, окна ввода, любые наборы кнопок, иконки, разделители и пр.

Простые кнопки и радио-кнопки добавляются к диалогу с помощью соответствующих методов Add(), остальные элементы через свойства объекта. Выводится диалог методом ShowFormBalloon():

Баллон.ShowFormBalloon(Персонаж);

Кнопка добавляется так:

Баллон.FormBalloon.Buttons.Add("&Обновить");

а радио-кнопки так:

Баллон.FormBalloon.OptionButtons.Add("&Да");
Баллон.FormBalloon.OptionButtons.Add("&Нет");

Радио-кнопки будут расположены в диалоге в том порядке, в котором они добавлялись методом Add(). В диалоге можно разместить только одну группу радио-кнопок. Щелчок по любой радио-кнопке закрывает диалог, как и по обычной кнопке. Получить, что именно нажал пользователь можно, используя свойства ButtonPressed и OptionPressed. Эти свойства принимают значения номера по коллекции нажатой кнопки или ноль, если кнопка не была нажата.

Вот как, например, можно организовать выбор из перечисления.

Баллон.FormBalloon.Buttons.Add("&Отмена");
П = Перечисление.ТипПлатежа;
Для Х = 1 По П.КоличествоЗначений() Цикл
Баллон.FormBalloon.OptionButtons.Add(Строка(П.ЗначениеПоНомеру(Х)));
КонецЦикла;
Баллон.ShowFormBalloon(Персонаж);
Если Баллон.FormBalloon.ButtonPressed = 1 Тогда
Возврат 0; // отказ от выбора
Иначе
Возврат П.ЗначениеПоНомеру(Баллон.FormBalloon.OptionPressed);
КонецЕсли;

Окошко ввода текста добавляется свойством ТехтВох, если 1 (True) – отображать в диалоге, 0 (False) – не отображать. Используя FormBalloon, его можно сделать многострочным и задать строку "по умолчанию".

Баллон.FormBalloon.TextBox = 1; Баллон.FormBalloon.TBoxLines = 3; // трех-строчный текст Баллон.FormBalloon.TBoxText = "Текст по умолчанию";

Другие свойства: Title – заголовок диалога, Message – основной тект диалога расположенный под заголовком, Comment – строка комментария, располагающаяся внизу диалога над кнопками, SepLine – разделительная линия, отделяющая нижнюю часть диалога.

Разделительная линия в диалоге может быть только одна. Присвоение SepLine значения единицы, включает показ линии, нуля – отключает.

Есть еще пара методов у BalloonDialog'а. А именно метод Suggest(), который выводит картинку "горящая лампочка" над персонажем для привлечения пользователя и метод TipBalloon(), выводящий на экран немодальное окно подсказки. Увы, перехватить клик пользователя по "suggest-лампочке" не получится. Как лучше использовать эти два метода в 1С:Предприятии, я пока не придумал.

О том, как перекрашивать диалог-balloon, как менять цвет и атрибуты текста, как рисовать в нем свои иконки, менять картинки для кнопок и радио-кнопок – смотрите в примере к статье и в файле помощи к BalloonDialog©.

И напоследок полезный совет:

Используйте там, где только это возможно, конструкцию Попытка-Исключение. Перед выводом диалога проверяйте, не скрыт ли персонаж, и в этом случае используйте встроенные функции языка 1С. Количество строк кода при этом удваивается, но "balloon" без персонажа выглядит несколько сюрреалистически.

Кому интересно, можно посмотреть и поэксперементировать с аналогичным OCX'ом от российских разработчиков BalloonMessage (http://www.vbline.narod.ru/balloonmessage/ru/basic.htm), но он тоже не бесплатный – 10$.

И еще одна ссылка на подобный OCX: http://www.textildoss.com.ar/msgballoon/MsgBalloon6.zip – как я понял, это предыдущая версия BalloonDialog. Она бесплатна, но и возможностей у неё маловато.

Партнеры:


Также может быть интересно:

Канал Россия 1 на http://spbtvonline.ru/
   
 Сайт поддерживается за счет партнеров:
:::... Сайт содержит архив двух версий hare.ru Карта сайта