Алексей Бажитов апрель 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. Она бесплатна, но и возможностей у неё маловато.
|