Главная » Статьи » "1С" Предприятие

Скачивать материалы с сайта, могут только зарегистрированные пользователи.
Для регистрации заполните два поля ниже!

Через минуту Вы получите "Гостевой доступ"




Агенты среди нас. Замена стандартных функций
Алексей Бажитов   апрель 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С" Предприятие | Добавил: c1 (2009 Январь 09)
Просмотров: 1313 | Теги: Агенты среди нас. Замена стандартны | Рейтинг: 0.0/0

Выразить благодарность - Поделиться с друзьями!

 

Здесь все о технической стороне 1С!

 

Узнай, как правильно администрировать 1С Предприятие
Регистрируйся на бесплатный 7-ми дневный курс сейчас:

Ваш E-Mail в безопасности



Всего комментариев: 0
avatar