| Наши персонажи на текущем этапе не более чем забавная мулечка, в некоторой степени, способная заменить функцию Сообщить(). Как заставить их работать с большей отдачей? В этой части я попытаюсь рассказать, как заменить предупреждения, ввод значений, выбор из списков и т.п. Технология 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. Она бесплатна, но и возможностей у неё маловато.
Источник: http://www.mista.ru/articles1c/hare/article.41.html |