Что такое маплеты?

Маплет – это специальный программный объект интерфейса. Неформальному разъяснению, углублению и расширению этого понятия фактически посвящена вся тема “Программирование маплетов”. И хотя в данном разделе о маплетах приводятся  лишь начальные сведения, опора на них в дальнейшем поможет освоить это понятие до такой степени, чтобы уметь создавать эффективные приложения на языке Maple с простым и ясным интерфейсом.

Интерфейс и маплеты

        В системе Maple интерфейс пользователя с программами и данными реализуется с помощью конкретных команд, выполняемых непосредственно из документов. Кроме того, имеется особый механизм создания и использования для интерфейса программных объектов, называемых маплетами. Такие объекты, являющиеся специальными системными Maple-программами, по определенным правилам могут вкладываться друг в друга, порождая новые маплеты. Если активизация маплета приводит к открытию того или иного диалогового окна, то говорят, что этот маплет визуальный (Button, FileDialog, ColorDialog, …). Бывают и невизуальные маплеты (Image, Group, Action, Font, …). Они формируют различные свойства других объектов маплетов или задают определенные действия, но сами не могут быть выведены в виде отдельных видимых объектов.

        Маплеты прокладывают мостик от процедурного программирования к объектно-ориентированному программированию. При активизации маплет выводит одно или несколько окон (панелей, форм), на которых располагаются те или иные объекты: кнопки, поля ввода, списки, таблицы и другие элементы управления, с помощью которых система осуществляет интерфейс с пользователем и получает от него данные, необходимые для проведения последующих вычислений. Все маплеты системы Maple сосредоточены в пакете расширения Maplets с командой (процедурой) Display, запускающей их на выполнение, и подпакетами Elements, Examples, Tools и Utilities. Из них наиболее значим пакет Elements, который содержит внушительный и тщательно продуманный набор типовых объектов (элементов, компонентов, команд) для конструирования маплетов сколь угодно сложной природы. Для пользователя пакет Elements является простым и удобным конструктором, из элементов которого и “собираются” требуемые маплеты, например, иерархические меню-бары, контекстные меню и панели инструментов.

        В дальнейшем визуальные объекты, выводимые маплет-приложениями в виде одного или нескольких модальных окон с различными элементами на них, также будем называть маплетами. Обычно маплет располагается в одном окне. Модальность окна означает, что приостанавливаются проводимые вычисления и блокируется восприятие системой всех действий, производимых с клавиатуры или мышью, если они не связаны с данным окном. Возобновляются вычисления лишь при закрытии этого окна.

        При разработке приложений часто используются диалоги весьма конкретной направленности. Например, разнообразные панели для ввода выражений, уравнений и данных иной природы; панели предупреждения и предостережения о чем-либо; панели подтверждения конкретных фактов; панели выбора альтернатив, панели установки цвета, панели открытия файлов и т. п. И вполне естественным является наличие в Maple заранее спроектированных разработчиками подобных маплет-диалогов и простых средств их активизации. Пользователь может определять свойства существующих элементов в окнах таких диалогов, но не может добавлять к ним собственные или удалять существующие элементы. Отсюда и другое название подобных диалогов – предопределенные диалоговые панели.

Код маплета и его визуализация 

   Отрытие пакета Maplets и его подпакетов

        Команда with(Maplets) открывает пакет Maplets. В нем имеется команда Display – визуализации маплетов и несколько подпакетов. При открытом пакете Maplets команду Display можно использовать в короткой форме записи, то есть в виде Display(…). При неоткрытом пакете Maplets допускается только полная форма записи этой команды. Выглядит она так: Maplets[Display](...).

        Команда with(Maplets[Elements]) открывает подпакет Elements пакета Maplets. Визуальные объекты, выводимые командами этого пакета, называются также элементами.

        Команда with(Maplets[Examples]) открывает подпакет Examples пакета Maplets.

        Команда with(Maplets[Tools]) открывает подпакет Tools пакета Maplets.

        Команда with(Maplets[Utilities]) открывает подпакет Utilities пакета Maplets.

Создание кода маплета и его визуализация

        Команда Maplet(li) по списку li создает некоторый Maple-код, который визуализируется командой Display в виде маплета. Его можно также присвоить какой-либо переменной (x := Maplet(li)) и лишь затем выводить в виде маплета (Display(x)). Расположение объектов в окнах маплетов по умолчанию реализуется в соответствии с концепцией вложенных списков. Ее суть легко понять из приведенных ниже примеров 1. Размеры окон маплета подбираются автоматически в соответствии с размерами размещаемых в них объектов. Однако их можно изменять с помощью мыши технологией Drag and Drop (тащи и бросай). С левой и правой стороны строки заголовка маплета присутствуют соответственно кнопка раскрытия системного меню и кнопка Close (´) закрытия окна (см. рис. 1). По умолчанию заголовок маплета – Maplet, но командой Window его можно изменить.

 

Рис. 1.  Пример маплета с раскрытым системным бар-меню

        Команда Maplet(Window(title = name, li)) выполняется так же, но здесь опция title = name значением name задает пользовательский заголовок маплета, где name – строка или литерал без пробелов. Указанная опция может быть записана и в виде name, то есть без ключевого слова title.

        Примеры 1. Здесь выводятся маплеты с условными объектами на них в виде отдельных символов. По ним демонстрируется различные типы автоматической компоновки элементов в окне в зависимости от вида вложенного списка-аргумента. Эти маплеты не содержат специальных кнопок их закрытия. Однако делать это можно и при том разными способами: кнопкой Close строки заголовка (´), горячим ключом {Alt+F4} или выбором Close меню маплета. При таких закрытиях маплетов в документ Maple-сессии возвращается NULL-выражение. В последнем из примеров демонстрируется задание заголовка маплета.

> 

with(Maplets): with(Maplets[Elements]):

{Shift+¿}

 

Display(Maplet([a, b, c]));

{¿}

> 

Display(Maplet([[a, b, c]]));

{¿}

> 

Display(Maplet([[a, x, y], [b], [c, z]]));

{¿}

> 

Display(Maplet([[a, x, y], [b], [c, [z, u]]]));

{¿}

> 

Display(Maplet(Window("Symbols", [a, b, c])));

{¿}

Запуск маплета на выполнение

        Команда (процедура) Display(name) расположена в пакете Maplets. По ней визуализируется маплет с именем name. В этом случае говорят, что маплет запускается на выполнение. При закрытии маплета в документ Maple-сессии возвращается NULL-выражение, строка, список строк или строка и список строк с информацией о состоянии объектов маплета. Управляет этим выводом команда Shutdown из пакета Elements, которая описана ниже.

        Переменная lastmaplet. Всякий раз при выполнении команды Display в системную глобальную переменную заносится код соответствующего ей маплета. Доступ к этой переменной может быть использован для отладки маплета или его повторного запуска (Display(lastmaplet)).  

        Пример 2. Здесь приведены два варианта вывода одного маплета. В первом случае для использования команды Display(mt) пакет Maplets открывается командой with(Maplets). Во втором случае эта команда используется непосредственно в форме Maplets[Display](mt).

> 

                                           # вариант 1

{Shift+¿}

 

with(Maplets): with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(["This is a maplet"]):

{Shift+¿}

 

Display(mt);

{¿}

> 

restart :                                # вариант 2

{Shift+¿}

 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(["This is a maplet"]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}      

        Замечание. Запуск маплетов возможен в режимах Standart Worksheet (стандартный документ) и Сlassic Worksheet (классический документ). Первый режим обеспечивает полнофункциональный интерфейс, но в нем могут быть проблемы, связанные с отображением символов ANSI, в том числе и русских букв.  Второй режим имеет некоторые ограничения на используемый интерфейс, однако в нем отсутствуют описанные выше проблемы. Кроме того,  оформление строк заголовков маплетов в этих режимах проводится неодинаково.

Закрытие маплета и возвращаемые значения

Здесь мы в общих чертах познакомимся лишь с командой закрытия маплета Shutdown, без понимания которой трудно вести дальнейшее изложение.

Закрытие маплета и возвращаемые значения

        Команда Shutdown(opts) закрывает текущий маплет. От опций opts зависит, что возвращает маплет в текущий документ Maple-сессии при своем закрытии. Здесь возможны такие случаи:

·       параметр opts не указан. Возвращается NULL-выражение;

·       opts = “text”. Возвращается строка “text”;

·       opts = [псевдоним объекта]. Возвращается список [“значение объекта”] из одной строки;

·       opts = [псевдоним объекта 1, псевдоним объекта 2, …]. Возвращается список строк [“значение объекта 1”, “значение объекта 2”, …];

·       opts = “text”, [псевдоним объекта]. Возвращается последовательность “text”, [“значение объекта”];

·       opts = “text”, [псевдоним объекта 1, псевдоним объекта 2, …]. Возвращается последовательность “text”, [“значение объекта 1”, “значение объекта 2”, …];

        Элемент Shutdown не может содержать других маплет-элементов, но сам может содержаться в них. Например, часто Shutdown является вторым аргументом в Button.

        Примеры 3. В первом примере при любом закрытии маплета возвращается NULL. Во втором и третьем примерах при закрытии маплета кнопкой Close или ключом {Alt+F4} также возвращается NULL. Если же маплет закрывается кнопкой Ok, то возвращается [“false”] или [“true”] в зависимости от того выключен или включен (v) переключатель CheckBox. Параметр CB1 – это псевдоним кнопки CheckBox, который может быть любым литералом без пробелов.

> 

with(Maplets): with(Maplets[Elements]):

{¿}

> 

# пример 1 (возвращается NULL)

{Shift+¿}

 

a := Button("Ok", Shutdown()):

{Shift+¿}

 

Display(Maplet([a]));

{¿}

> 

# пример 2 (возвращается NULL, [“false”] или [“true”])

{Shift+¿}

 

a := ["Switch on ?", CheckBox[CB1]()]:

{Shift+¿}

 

b := Button("Ok", Shutdown([CB1])):

{Shift+¿}

 

Display(Maplet([a, b]));

{¿}

> 

# пример 3 (возвращается NULL, [“false”] или [“true”])

{Shift+¿}

 

a := [CheckBox[CB1](caption = "Switch on ?", value = true)]:

{Shift+¿}

 

b := Button("Ok", Shutdown("bool", [CB1])):

{Shift+¿}

 

Display(Maplet([a, b]));

{¿}

Обозреватель маплетов

        Сформированный документ с одним или несколькими маплетами можно сохранить как обычный Maple-документ с расширением mw и в последующих сессиях продолжать с ним работу. Однако имеется и иная возможность – экспортировать документ в Maplet-приложение, то есть в файл специального формата с расширением maplet. Такие файлы с помощью программы – обозревателя MapletViewer – можно запускать на выполнение прямо из проводника Windows вне документов Maple-системы.

        Maplet-приложение из Maple-документа создается так:

·       File/Export As – в системном бар-меню File зафиксировать выбор Export As;

·       на открывшейся панели Export As в раскрывающемся списке Files of type зафиксировать тип файла – maplet;

·       указать папку, путь (тропу) и имя создаваемого файла;

·       щелкнуть левой кнопкой мыши по кнопке Export.

        Запуск полученного файла из проводника Windows реализуется обычными способами, например, двойным щелчком мыши по имени файла. 

Компоненты управления пакета Elements

Классификация компонентов управления

        К компонентам управления относят те визуальные элементы из пакета Elements, которые при выводе маплета располагаются в его окне (или окнах) и предназначены для управления пользователем процессом вычислений. Именно через эти компоненты и ведется вся работа, связанная с инициированием различных событий, запускающих на выполнение конкретные команды, по которым выполняются требуемые действия. Совокупность компонентов управления условно можно разбить на четыре группы:

·       Кнопки и переключатели:

o       Button – кнопка общего назначения;

o       ToggleButton – двухпозиционный переключатель (тумблер);

o       CheckBox – независимый переключатель (флажок);

o       RadioButton зависимый переключатель (радиокнопка);

·       Текстовые поля и метка:

o       Label метка (бирка, этикетка);

o       TextField однострочное текстовое поле;

o       TextBox многострочное текстовое поле;

·       Списки и таблица:

o       ListBox простой список;

o       DropDownBox раскрывающийся список;

o       ComboBox комбинированный список;

o       Table – информационная таблица и ее элементы (TableHeader, TableRow и TableItem);

·       Обозреватели и иные элементы:

o       Plotter обозреватель графиков;

o       Slider – ползунок (слайдер, полоса прокрутки, скроллинг-бар);

o       MathMLEditor редактор (конвертор) MathML;

o       MathMLViewer обозреватель MathML.

        Именно в этом порядке компоненты (элементы, объекты) управления и описываются ниже. В наиболее типичном случае команды вывода указанных объектов записываются в виде

Object[alias](opts),

где Object – имя объекта, alias – псевдоним объекта, opts – последовательность опций объекта. Необязательный параметр alias является произвольным литералом и используется для ссылок на данный объект. Его можно задавать и в опциях, а для некоторых объектов – только в опциях. Необязательные элементы последовательности opts записываются в виде уравнений “имя опции = значение”, определяют свойства объекта или назначают обработчики событий, то есть совокупности тех действий, которые должны осуществляться при возникновении того или иного события. Некоторые опции разрешается задавать не только в виде уравнений, но и в упрощенном виде одним значением.

         Карта наличия конкретных типовых свойств у объектов управления приведена в таблице 1. В ней не указан ряд специфических (индивидуальных) свойств объектов Plotter и Slider. Пары (объект, свойство) отмечаются в соответствующих клетках этой таблицы знаком “+” или “пусто” в зависимости от того, обладает или нет данный объект указанным свойством.

Таблица 1

Карта наличия типовых опций у объектов управления

 

 

 

 

 

       

           Объекты

 

 

Свойства    

Button

Togglebutton

CheckBox

Radiobutton

Label

TextField

TextBox

ListBox

DropDownBox

Combobox

Table

Plotter

Slider

MathMLEditor

MathMLViewer

1.      

caption

+

+

+

+

+

 

 

 

 

 

 

 

 

 

 

2.      

background

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

3.      

foreground

+

+

+

+

+

+

+

+

+

+

+

 

+

+

+

4.      

height

+

 

 

 

+

 

+

 

+

+

+

+

 

+

+

5.      

width

+

 

 

 

+

+

+

+

+

+

+

+

 

+

+

6.      

font

+

+

+

+

+

+

+

+

+

+

+

 

 

 

 

7.      

halign

+

 

 

 

+

+

 

+

+

+

 

 

 

 

 

8.      

valign

+

 

 

 

+

 

 

+

+

+

 

 

 

 

 

9.      

image

+

+

+

+

+

 

 

 

 

 

 

 

 

 

 

10.  

visible

+

+

+

+

+

+

+

+

+

+

+

+

+

 

 

11.  

enabled

+

+

+

+

+

+

+

+

+

+

 

 

+

 

 

12.  

tooltip

+

+

+

+

+

+

+

+

+

+

+

+

+

 

 

13.  

reference

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

14.  

onclick

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15.  

onchange

 

+

+

 

 

+

+

+

+

+

 

 

+

 

 

16.  

value

 

+

+

+

 

+

+

+

+

+

 

+

+

+

+

17.  

group

 

+

 

+

 

 

 

 

 

 

 

 

 

 

 

18.  

cursor

 

 

 

 

 

+

+

 

 

 

 

 

 

 

 

19.  

editable

 

 

 

 

 

+

+

 

 

+

 

 

 

 

 

20.  

focus

 

 

 

 

 

+

+

 

 

 

 

 

 

+

 

21.  

popupmenu

 

 

 

 

 

+

+

 

 

 

 

 

 

 

 

22.  

wrapped

 

 

 

 

 

 

+

 

 

 

 

 

 

 

 

23.  

fontsize

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

24.  

append

 

 

 

 

 

+

+

 

 

 

 

 

 

 

 

25.  

appendline

 

 

 

 

 

 

+

 

 

 

 

 

 

 

 

26.  

appenditem

 

 

 

 

 

 

 

+

+

+

 

 

 

 

 

27.  

itemlist

 

 

 

 

 

 

 

+

+

+

 

 

 

 

 

        Из таблицы 1 видно, что многие объекты имеют общие свойства. Однако действие опций в конкретных случаях может иметь специфику и поэтому описывать их в общем виде нецелесообразно.

Кнопки и переключатели

        В данном разделе обсуждается синтаксис и семантика следующих четырех объектов:

·       Button – кнопка общего назначения;

·       ToggleButton –двухпозиционный переключатель (тумблер);

·       CheckBox – независимый переключатель (флажок);

·       RadioButton зависимый переключатель (радиокнопка).

Кнопка общего назначения

        Команда Button[alias](opts) создает в окне маплета кнопку Button общего назначения, которая может находиться в двух возможных состояниях: отжатом и вдавленном. В первом случае кнопка имеет вид слегка возвышающегося над формой параллелепипеда с закругленными вершинами, а во втором - этого же параллелепипеда, вдавленного на некоторую глубину в окно. Каждый щелчок левой кнопкой мыши по кнопке Button переводит ее из отжатого состояния во вдавленное состояние. Однако при отпускании кнопки мыши кнопка сразу же переходит в отжатое состояние. В этом смысле можно говорить, что первое состояние кнопки является устойчивым, а второе - нет. Далее, кнопка Button может быть активной (текущей) или неактивной. В первом случае она отмечается дополнительной штриховой границей. Заметим, что, называя объект Button кнопкой общего назначения, мы подчеркиваем возможность ее широкого использования в приложениях. Необязательный параметр alias – псевдоним кнопки, необязательные аргументы opts – последовательность опций, которые в данном случае могут быть такими:

·       caption = cap. Опция caption (заголовок) строкой или литералом cap задает надпись на кнопке. В ней можно определить мнемонический ключ доступа к кнопке, помещая перед любым символом a одиночный знак амперсанда (&a). Тогда в выведенном маплете символ a в надписи окажется подчеркнутым, а нажатие ключа {Alt+a} будет играть такую же роль, как и щелчок левой кнопкой мыши по кнопке. Символ a в ключе нечувствителен к регистру. Сам знак & записывается в надписи словом &&. Допустима сокращенная форма записи опции caption = cap в виде cap;

·       background = bcol. Опция background (фон) значением bcol определяет цвет окантовки кнопки. Параметр bcol можно задавать предопределенными именами (aquamarine, red, …); RGB-схемой: COLOR(RGB, r, g, b), 0 £ r, g, b £ 1; строкой “#rrggbb”, где rr, gg и bb – пары шестнадцатеричных цифр, кодирующие доли красной, зеленой и синей составляющей цвета; 

·       foreground = fcol. Опция foreground (передний план, авансцена) значением fcol определяет цвет текста надписи кнопки. Параметр fсol задается так же, как и соответствующий параметр опции background;

·       font = fo. Опция font (шрифт) значением fo задает имя шрифта, тип жирности и размер символов текста надписи кнопки. Здесь fo Font-объект или его псевдоним. Например, font = Font("helvetica", bold, 14), font = Font("times", italic, 12) или font = FO1. Если foFont-объект (не псевдоним), то допустима сокращенная форма записи опции font = fo в виде fo; 

·       image = im. Опция image (образ) значением im задает рисунок на кнопке, который дополняет текст ее надписи. Рисунок размещается слева от надписи, но может быть выведен и без нее. Здесь im Image-объект или его псевдоним. Например, image = Image("C:\\image. jpg") или image = IM1. Обратите внимание, что отдельные компоненты пути к файлу образа отделяются друг от друга сдвоенным знаком обратного слэша (\\);

·       width = w. Опция width (ширина) значением w задает ширину кнопки в пикселах. По умолчанию ширина устанавливается в соответствии с размерами текста или рисунка (контента) кнопки;

·       height = h. Опция height (высота) значением h задает высоту кнопки в пикселах. По умолчанию высота устанавливается в соответствии с контентом кнопки;

·       halign = hor. Опция halign (horizontal align – горизонтальное выравни­вание) значением hor Î {left, center, right} задает тип горизонтального выравнивания контента кнопки: left – по левому краю, center – по центру, right – по правому краю;

·       valign = ver. Опция valign (vertical align – вертикальное выравнивание) значением ver Î {top, center, bottom} задает тип вертикального выравнивания контента объекта: top – по верхнему краю, center – по центру, bottom – по нижнему краю;

·       tooltip = tip. Опция tooltip строкой или литералом tip задает текст оперативной подсказки, появляющейся при установке курсора в районе кнопки; 

·       visible = bo. Опция visible (видимый) значениями bo Î {true, false} задает режимы видимости кнопки. При bo = true кнопка видима, а при bo = false – невидима;

·       enabled = bo. Опция enabled (позволено) значением bo Î {true, false} делает кнопку доступной или недоступной. То есть, при bo = true кнопка реагирует на щелчки мыши, а при bo = false – нет. При этом в последнем случае очертания кнопки становятся серыми;   

·       onclick = str. Опция onclick (по щелчку) значением str задает действия, которые должны быть реализованы при щелчке левой кнопкой мыши по кнопке. Здесь str Action-элемент, псевдоним Action-элемента или команда. В любом случае str выступает в роли обработчика события “щелчок левой кнопкой мыши по кнопке”;

·       reference = ref. Опция reference (ссылка) строкой или литералом ref задает псевдоним кнопки. Если псевдоним уже задан индексом alias в Button[alias], то он имеет предпочтение перед установкой в reference.

        В таблице 2 знаком “+” указаны допустимые правила использования опций в команде Button: С – опцию можно указывать в Button; N – опцию нужно указывать в Button; S – опцию можно задавать командами SetOption или Set; G – значение опции можно прочитать командой Get.

Таблица 2

Допустимые правила использования опций в команде Button

     

          Опции

 

Правила

caption

background

foreground

font

image

width

height

halign

valign

tooltip

visible

enabled

onclick

reference

С (можно)

+

+

+

+

+

+

+

+

+

+

+

+

+

+

N (нужно)

+

 

 

 

 

 

 

 

 

 

 

 

+

 

S (SetOption)

+

+

+

+

+

 

 

 

 

+

+

+

 

 

G (Get)

+

+

+

+

 

 

 

 

 

+

+

+

 

 

        Пример 4. Здесь в выведенном маплете имеются две кнопки типа Button с надписями Ok и Cancel. Для первой из них установлены опции ширины и высоты в 50 пикселей. При закрытии маплета возвращается: “true” (кнопка Ok), “false” (кнопка Cancel) и NULL (кнопка Close или ключ {Alt+F4}).

 

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["Select one:",

{Shift+¿}

 

      [Button("Ok", height = 50, width = 50, Shutdown(true))],

{Shift+¿}

 

      [Button("Cancel", Shutdown(false))]]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

        Замечание. Код предложенного маплета можно было бы записать в более понятной форме, например, так:

> 

with(Maplets[Elements]):

{Shift+¿}

 

te := "Select one:":

{Shift+¿}

 

bu1 := Button("Ok", height = 50, width = 50, Shutdown(true)):

{Shift+¿}

 

bu2 := Button("Cancel", Shutdown(false)):

{Shift+¿}

 

mt := Maplet([[te, [bu1], [bu2]]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}      

Здесь до заголовочной строки mt := Maplet(…) сделаны заготовки объектов, располагаемых в окне маплета, в виде дополнительных переменных te, bu1 и bu2. После строки mt := Maplet(…) этого делать нельзя.

        Примеры 5. В выведенном маплете первого примера имеются две независимые кнопки типа ToggleButton с надписями ToggleButton_1 и ToggleButton_2. Первая из них находится во вдавленном состоянии (value = true), а вторая  – в отжатом состоянии (value = false). Переключение состояний кнопок производится независимо друг от друга. Второй пример отличается от первого тем, что в нем кнопки типа ToggleButton составляют группу (BG1) и являются зависимыми, то есть переключение состояния любой кнопки изменяет состояние другой кнопки. Кроме того, здесь на кнопках ToggleButton выведена не только надпись, но и рисунок. В обоих примерах нажатие кнопки Button с надписью Ok возвращает список текущих состояний кнопок ToggleButton.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(["Independent ToggleButtons",

{Shift+¿}

 

   [[ToggleButton[TB1]("TButton_1", value = true)],

{Shift+¿}

 

   [ToggleButton[TB2]("TButton_2", value = false)],

{Shift+¿}

 

   [Button("Ok", height = 27, width = 50,

{Shift+¿}

 

      Shutdown([TB1, TB2]))]]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet(["One group ToggleButtons",

{Shift+¿}

 

   [[ToggleButton[TB1]("TButton_1", value = true,

{Shift+¿}

 

       group = BG1, image = IM1)],

{Shift+¿}

 

    [ToggleButton[TB2]("TButton_2", value = false,

{Shift+¿}

 

       group = BG1, image = IM1)],

{Shift+¿}

 

    [Button("Ok", height = 27, width = 50,

{Shift+¿}

 

       Shutdown([TB1, TB2]))]]],

{Shift+¿}

 

   ButtonGroup[BG1](),

{Shift+¿}

 

   Image[IM1]("E:\\D_1\\Pictures\\icon024.gif")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

        Мы уже отмечали, что делать заготовки объектов, размещаемых в окне маплета можно, но до команды Maplet. Например, последний вариант кода мог бы быть переписан так: 

> 

with(Maplets[Elements]):

{Shift+¿}

 

tb1 := ToggleButton[TB1]("TButton_1", value = true,

{Shift+¿}

 

       group = BG1, image = IM1):

{Shift+¿}

 

tb2 := ToggleButton[TB2]("TButton_2", value = false,

{Shift+¿}

 

       group = BG1, image = IM1):

{Shift+¿}

 

bu := Button("Ok", height = 27, width = 50,

{Shift+¿}

 

       Shutdown([TB1, TB2])):

{Shift+¿}

 

bg := ButtonGroup[BG1]():

{Shift+¿}

 

im := Image[IM1]("E:\\D_1\\Pictures\\icon024.gif"):

{Shift+¿}

 

mt := Maplet(["One group ToggleButtons",

{Shift+¿}

 

   [[tb1], [tb2], [bu]]], bg, im):

{Shift+¿}

 

Maplets[Display](mt);

{¿}      

Независимый переключатель (флажок)

        Команда .  CheckBox[alias](opts) создает независимый двухпозиционный переключатель, называемый флажком, который выводится в виде небольшого белого квадратика с черной границей и, как правило, с надписью. Флажок может находиться в двух состояниях: выключенном – квадратик пустой, и включенном – квадратик содержит символ n. Эти состояния переключаются щелчками левой кнопкой мыши при ее курсоре, находящемся в области флажка. Практически всегда там, где нечто может пребывать в двух состояниях (позициях, режимах), переключения между ними удобно реализовывать флажком. Необязательный параметр alias – псевдоним флажка, необязательные аргументы opts – опции. Поскольку допустимые в данном случае опции имеют тот же смысл, что и для кнопки ToggleButton, ограничимся их кратким описанием:

·       caption = cap. Надпись флажка располагается справа от квадратика;

·       background = bcol. Установка цвета фона флажка;

·       foreground = fcol. Установка цвета надписи флажка;

·       font = fo. Назначение шрифта для надписи флажка; 

·       image = im. Назначение рисунка вместо квадратика флажка;

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости флажка;

·       enabled = bo. Установка режима доступности флажка;   

·       value = bo. При bo = true флажок включен – квадратик имеет галочку, а при bo = false – выключен – квадратик пустой.

        Обозначения в таблице 3 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде CheckBox.

Таблица 3

Допустимые правила использования опций в команде CheckBox

     

          Опции

 

Правила

caption

background

foreground

font

image

tooltip

visible

enabled

value

onchange

reference

C (можно)

+

+

+

+

+

+

+

+

+

+

+

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

+

+

+

+

+

+

 

 

G (Get)

+

+

+

+

+

+

+

+

+

 

 

        Пример 6. В выведенном маплете имеются три независимых переключателя типа CheckBox с заголовками cherry, plum и apple. Первый из переключателей находится в состоянии “включен” (value = true), а два другие – в состоянии “выключен”. Кроме того, имеется кнопка общего назначения Button с надписью Ok. По ней возвращается список текущих состояний переключателей CheckBox. Смена состояний переключателей CheckBox в соответствии с обработчиками событий onchange сопровождается следующими действиями:

·       щелчки по переключателю cherry изменяют текущий заголовок кнопки Button на Exit;

·       щелчки по переключателю apple изменяют текущий заголовок кнопки Button на Ok;

·       щелчок по переключателю plum выводит на поверхность кнопки Button анимационный рисунок книги.

        Обратите внимание на различные синтаксические способы задания опций объектам в команде SetOption.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   [[CheckBox[ChB1](caption = "cherry", value = true,

{Shift+¿}

 

        onchange = SetOption(

{Shift+¿}

 

           target = BT1, `option` = caption, value = "Exit"))],

{Shift+¿}

 

    [CheckBox[ChB2]("plum",

{Shift+¿}

 

        onchange = SetOption(BT1(image) = IM1))],

{Shift+¿}

 

    [CheckBox[ChB3]("apple",

{Shift+¿}

 

        onchange = SetOption(BT1(caption) = "Ok"))]],

{Shift+¿}

 

    [Button[BT1]("Ok", height = 40, width = 100,

{Shift+¿}

 

        Shutdown([ChB1, ChB2, ChB3]))]],

{Shift+¿}

 

    Image[IM1]("E:\\D_1\\Pictures\\turnbook.gif")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Зависимые переключатели (радиокнопки)

        Команда RadioButton[alias](opts) создает двухпозиционный переключатель, называемый радиокнопкой, который выводится в виде небольшого белого кружка с черной границей и, как правило, с надписью. Радиокнопка может находиться в двух состояниях: выключенном – кружок пустой, и включенном – кружок содержит символ ·”. Эти состояния переключаются щелчками левой кнопки мыши при ее курсоре, находящемся в области кнопки. Одиночные радиокнопки используются весьма редко. Чаще они объединяются в связанные группы, в которых включение любой кнопки приводит к выключению остальных кнопок (см. опцию group). Отсюда другое название радиокнопок - зависимые переключатели. Необязательный параметр alias в A – псевдоним радиокнопки, необязательные аргументы opts – опции. Поскольку допустимые в данном случае опции имеют тот же смысл, что и для кнопки ToggleButton, ограничимся их кратким описанием:

·       caption = cap. Задание надписи радиокнопки с возможным мнемоническим ключом доступа. Надпись располагается справа от кружка;

·       background = bcol. Установка цвета фона радиокнопки; 

·       foreground = fcol. Установка цвета надписи радиокнопки;

·       font = fo. Назначение шрифта для надписи радиокнопки; 

·       image = im. Назначение рисунка вместо кружка радиокнопки;

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости радиокнопки;

·       enabled = bo. Установка режима доступности радиокнопки;   

·       value = bo. Задание начального состояния радиокнопки. При bo = true радиокнопка включена, то есть в кружке находится символ “·, а при bo = false – выключена – кружок пуст;

·       group = gr. Включение радиокнопки в группу указанием псевдонима gr объекта ButtonGroup;

·       reference = ref. Назначение псевдонима радиокнопке.

        Обозначения в таблице 4 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде RadioButton.

Таблица 4

Допустимые правила использования опций в команде RadioButton

     

          Опции

 

Правила

caption

background

foreground

font

image

tooltip

visible

enabled

value

group

reference

C (можно)

+

+

+

+

+

+

+

+

+

+

+

N (нужно)

 

 

 

 

 

 

 

 

 

+

 

S (SetOption)

+

+

+

+

+

+

+

+

+

 

 

G (Get)

+

+

+

+

 

+

+

+

+

 

 

        Пример 7. В выведенном маплете имеется группа BG1 из двух радиокнопок с заголовками sand и cement и кнопка общего назначения с заголовком Ok. На последней кнопке выведен рисунок и по ней возвращается список текущих состояний радиокнопок.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   [RadioButton[RB1]("sand", value = true, group = BG1),

{Shift+¿}

 

     RadioButton[RB2]("cement", value = false, group = BG1)],

{Shift+¿}

 

   [Button("Ok", image = IM1, Shutdown([RB1, RB2]))]],

{Shift+¿}

 

   ButtonGroup[BG1](),

{Shift+¿}

 

   Image[IM1]("E:\\D_1\\Pictures\\bullet035.gif")):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Текстовые поля и метка

        Команда Label[alias](opts) создает в окне маплета метку (бирку, этикетку), представляющую собой узкий прямоугольник с одной строкой нередактируемого текста из произвольных символов. Для вывода многострочных информационных нередактируемых текстов следует использовать команду TextBox с опцией editable = false. Метки служат для косметических и информационных целей, украшая окно маплета и поясняя назначение тех или иных его объектов. Необязательный параметр alias в A – псевдоним метки, необязательные аргументы opts – последовательность опций. Допустимые для метки опции имеют тот же смысл, что и для кнопки Button. Поэтому ограничимся их кратким описанием:

·       caption = cap. Задание надписи (текста) метки;

·       background = bcol. Установка цвета фона метки; 

·       foreground = fcol. Установка цвета надписи метки;

·       font = fo. Назначение шрифта для надписи метки; 

·       image = im. Назначение рисунка метке, который может быть дополнением к надписи и появляется слева от нее или выводится без надписи;

·       width = w. Задание ширины метки в пикселах;

·       height = h. Задание высоты метки в пикселах;

·       halign = hor. Установка типа горизонтального выравнивания контента метки: hor Î {left, center, right};

·       valign = ver. Установка типа вертикального выравнивания контента метки: ver Î {left, center, right};

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости метки;

·       enabled = bo. Установка режима доступности метки;   

·       reference = ref. Назначение псевдонима метке;

        Обозначения в таблице 5 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде Label.

 

Таблица 5

Допустимые правила использования опций в команде Label

     

          Опции

 

Правила

caption

background

foreground

font

image

width

height

halign

valign

tooltip

visible

enabled

reference

С (можно)

+

+

+

+

+

+

+

+

+

+

+

+

+

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

+

+

 

 

 

 

+

+

+

 

G (Get)

+

+

+

+

 

 

 

 

 

+

+

+

 

       Однострочное текстовое поле

        Команда TextField[alias](opts) создает в окне маплета поле из одной строки, служащее для ввода и редактирования или вывода текстовой информации. Для ввода многострочных редактируемых текстов следует использовать команду TextBox с опцией editable = true. Необязательный параметр alias в A – псевдоним поля, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       background = bcol. Установка цвета фона поля; 

·       foreground = fcol. Установка цвета текста в поле;

·       font = fo. Назначение шрифта для текста поля; 

·       width = w. Задание ширины текстового поля в символах. По умолчанию w = 20. Если строка вводимого текста шире чем w, то текст постепенно будет “уплывать” за левую кромку поля ввода. Тем не менее, он полностью сохраняется и при необходимости может быть возвращен;

·       halign = hor. Установка типа ввода в текстовое поле. При hor = left  происходит обычный ввод символов от левой границы поля с перемещением курсора вправо. При hor = center ввод символов начинается с центра поля и производится в конец текста, который постоянно центрируется. При hor = right ввод символов происходит в конечную позицию поля и текст “уплывает” влево;

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости текстового поля;

·       enabled = bo. Установка режима доступности текстового поля;   

·       cursor = nu. Опция cursor целым числовым значением nu позиционирует курсор в текстовом поле. Позиции нумеруются слева направо последовательными целыми числами от нуля и далее. Управляющий символ переноса строки \n считается одним знаком. Если nu превосходит длину выведенного текста, то курсор устанавливается сразу после него; 

·       editable = bo. Установка режима разрешения (bo = true) или запрета (bo = false) редактирования содержимого текстового поля;  

·       value = any. Задание параметром any начального значения текстового поля. По умолчанию any = “”, то есть поле пустое.

·       focus = bo. Установка режима разрешения (bo = true) или запрета (bo = false) получать текстовому полю фокус непосредственно из маплета командами SetOptions или Set;

·       popupmenu = pme. Опция popupmenu определяет контекстное всплывающее меню для текстового поля, где pme PopupMenu-объект или его псевдоним. В запущенном на выполнение маплете контекстное меню появляется при нажатии правой кнопки мыши при ее курсоре, находящемся в области поля;

·       onchange = str. Задание обработчика события “изменение состояния текстового поля при потере им фокуса”;

·       reference = ref. Назначение псевдонима текстовому полю;

·       alias(append) = str. Добавление значения строки str в конец содержимого текстового поля по его псевдониму alias.

        Обозначения в таблице 6 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде TextField.

Таблица 6

Допустимые правила использования опций в команде TextField

     

          Опции

 

Правила

background

foreground

font

width

halign

tooltip

visible

enabled

editable

cursor

focus

value

popupmenu

onchange

reference

append

C (можно)

+

+

+

+

+

+

+

+

+

+

 

+

+

+

+

 

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

+

+

+

+

+

+

+

+

+

 

 

 

+

G (Get)

+

+

+

+

+

+

+

+

+

+

 

+

 

 

 

 

        Пример 8. В выведеном маплете имеются следующие объекты: метка Label с надписью “Your name?”, однострочное текстовое поле TextField длиной в 20 символов и две кнопки Button с заголовками Ok и Cancel. Каждому из этих объектов опциями tooltip назначены оперативные контекстные подсказки в виде их имен. По кнопке Ok возвращается текущее содержимое поля TextField.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   [Label("Your name? ",

{Shift+¿}

 

      tooltip = "Label", font = Font("courier", bold, 18)),

{Shift+¿}

 

    TextField[IF1](20, tooltip = "TextField")],

{Shift+¿}

 

   [Button("OK", tooltip = "Button", Shutdown([IF1])),

{Shift+¿}

 

      Button("Cancel", tooltip = "Button", Shutdown())]]):

{Shift+¿}

 

re := Maplets[Display](mt):

{Shift+¿}

 

if type(re, ['string']) then re[1] end if;

{¿}

        Пример 9. В выведенном маплете имеется однострочное текстовое поле TextField. Для него двумя способами, прямым заданием и ссылкой, определяется контекстное меню с одним выбором. Для любого выражения g(x), введенного в текстовое поле, щелчок мышью по выбору меню “Differentiate on x?” форсирует вычисление производной от g(x) по x. При этом g¢(x) размещается в том же самом поле и актуализируется при щелчке по нему левой кнопкой мыши.

> 

with(Maplets[Elements]):                            # способ 1

{Shift+¿}

 

mt := Maplet(

{Shift+¿}

 

   [TextField[TF1](value = "x*sin(x)", width = 35,

{Shift+¿}

 

      popupmenu = PopupMenu(

{Shift+¿}

 

         MenuItem("Differentiate on x?",

{Shift+¿}

 

            Evaluate(TF1 = 'diff(TF1, x)'))))]):

{Shift+¿}

 

Maplets[Display](mt):

{¿}

> 

mt := Maplet(                                               # способ 2

{Shift+¿}

 

   [TextField[TF1](value = "x*sin(x)", width = 35,

{Shift+¿}

 

        popupmenu = PM1)],

{Shift+¿}

 

   PopupMenu[PM1](MenuItem("Differentiate on x?",

{Shift+¿}

 

        Evaluate(TF1 = 'diff(TF1, x)')))):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Многострочное текстовое поле

        Команда TextBox[alias](opts) создает в окне маплета поле ввода и редактирования или вывода многострочного текста. Необязательный параметр alias в A – псевдоним поля, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       background, foreground, font, tooltip, visible, enabled, editable, value, focus, onchange, reference и popupmenu. Все эти опции имеют тот же самый смысл, что и в TextField;

·       width = w. Задание ширины текстового поля в символах. По умолчанию w = 20. Если вводится слово, которое целиком не умещается в текущей строке, то оно размещается в поле в соответствии с установками опции wrapped;

·       wrapped = bo. Задание режима переноса целых слов. При bo = true  слова, не умещающиеся в текущей строке, автоматически переносятся на следующую строку, а при bo = false этого не происходит. В последнем случае организуется скроллинг, то есть появляется горизонтальная полоса прокрутки, и количество символов во вводимой строке может оказаться больше ширины поля w. Если длина слова более w символов, то при bo = true оно переносится на следующие строки частями по w символов; 

·       height = h. Задание высоты текстового поля в строках. По умолчанию h = 1. Это не ограничивает количество вводимых строк текста. При заполнении h строк появляется скроллинг – вертикальная полоса прокрутки, и ввод может быть продолжен. Опции height и width можно задавать диапазоном их значений в виде h..w;

·       cursor = nu. Позиционирование курсора в текстовом поле; 

·       alias(append) = str. Добавление строкового значения str в конец содержимого текстового поля по его псевдониму alias;

·       alias(appendline) = str. Добавление строкового значения str вместе с управляющим символом переноса строки в конец содержимого текстового поля по его псевдониму alias;

        Обозначения в таблице 7 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде TextBox.

Таблица 7

Допустимые правила использования опций в команде TextBox

     

          Опции

 

Правила

background

foreground

font

width

height

tooltip

visible

enabled

editable

wrapped

cursor

focus

value

popupmenu

onchange

reference

append

appendline

C (можно)

+

+

+

+

+

+

+

+

+

+

+

 

+

+

+

+

 

 

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

+

+

+

+

+

+

+

+

+

+

 

 

 

+

+

G (Get)

+

+

+

+

+

+

+

+

+

+

+

 

+

 

 

 

 

 

        Пример 10. В выведенном маплете имеется пустое многострочное текстовое поле TextBox с установленным в нем курсором (focus = true) и кнопка общего назначения с надписью Ok и рисунком. По кнопке Ok возвращается текущее содержимое поля TextBox.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["Text ? ",  TextBox[IB1](2..40, focus = true)],

{Shift+¿}

 

   [Button("Ok", image = IM1, Shutdown([IB1]))]],

{Shift+¿}

 

   Image[IM1]("E:\\D_1\\Pictures\\bullet036.gif")):

{Shift+¿}

 

Re := Maplets[Display](mt):

{Shift+¿}

 

`if`(type(re, [string]), re[1], NULL);

{¿}

Списки и таблица

Простой список

        Команда ListBox[alias](opts, li) из элементов аргумента li создает объект, называемый простым списком, или просто списком. Здесь li может быть списком строк, списком литералов без пробелов или последовательностью Item-элементов. Простой список появляется в окне маплета в виде прямоугольного окна, в каждой строке которого находится один элемент li. Выбрать конкретный элемент можно щелчком левой кнопки мыши по нему. При этом любые ранее выбранные элементы высвобождаются. Выбрать несколько элементов можно, выбрав один из них и при нажатой клавише Ctrl выбрать остальные требуемые элементы. Выбрать несколько последовательных элементов можно, выбрав один из граничных элементов и при нажатой клавише Shift выбрать другой граничный элемент. При этом выбранными окажутся и все элементы, расположенные между ними. При закрытии маплета по ListBox[alias](opts, li) возвращается список из одной строки, составленной из выбранных элементов списка, разделенных запятыми. Необязательный параметр alias в ListBox[alias](opts, li) – псевдоним списка, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       background = bcol. Установка цвета фона списка; 

·       foreground = fcol. Установка цвета текста элементов списка;

·       font = fo. Назначение шрифта для текста элементов списка; 

·       width = w. Задание ширины списка в пикселах. Высота поля выбирается автоматически в соответствии с количеством элементов списка. Поэтому список не должен быть большим;

·       halign = hor. Установка типа горизонтального выравнивания элементов списка: hor Î {left, center, right};

·       valign = ver. Установка типа вертикального выравнивания элементов списка: ver Î {left, center, right};

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости списка;

·       enabled = bo. Установка режима доступности списка;   

·       value = any. Задание параметром any элемента списка, который должен быть выбран при запуске маплета. По умолчанию any = “”, то есть, выбранных элементов нет;

·       onchange = str. Задание обработчика события “изменение состояния списка”;

·       reference = ref. Назначение псевдонима списку;

·       alias(appenditem) = str. Добавление элемента, равного значению str, в конец списка по его псевдониму alias во время выполнения;

·       alias(itemlist) = [item1, item2, …, itemn]. Переписывание существующиего списка с псевдонимом alias во время выполнения. Новый список составляется из элементов itemk (k = 1, 2, …, n) в порядке их следования. Опция itemlist может быть задана в команде Evaluate.

        Обозначения в таблице 8 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде ListBox.

Таблица 8

Допустимые правила использования опций в команде ListBox

     

          Опции

 

Правила

background

foreground

font

width

halign

valign

tooltip

visible

enabled

value

onchange

reference

appenditem

itemlist

С (можно)

+

+

+

+

+

+

+

+

+

+

+

+

 

 

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

 

 

 

+

+

+

+

 

 

+

+

G (Get)

+

+

+

 

 

 

+

+

+

+

 

 

 

+

        Пример 11. В выведенном маплете имеется простой список и кнопка общего назначения с надписью Ok, по которой возвращается выбранный элемент списка.

> 

with(Maplets): with(Maplets[Elements]):

{Shift+¿}

 

li := ["apple", "plum", "pear", "cherry", "apricot"]:

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["Pick a fruit:  ", ListBox[LB1](li)],

{Shift+¿}

 

   [Button("OK", Shutdown([LB1])),

{Shift+¿}

 

      Button("Cancel", Shutdown())]]):

{Shift+¿}

 

re := Display(mt):

{Shift+¿}

 

if type(re, [string]) then re[1] end if;

{¿}

        Замечание. Если в возвращаемых выборах списка имеются запятые, то они заменяются последовательностью знаков ,. Преобразование к более естественной форме записи результата можно осуществить с помощью команды ListBoxSplit.

Раскрывающийся список

        Команда DropDownBox[alias](opts, li) создает раскрывающийся список из элементов, определяемых аргументом li. Здесь li может быть списком строк, списком литералов без пробелов или последовательностью Item-элементов. Список появляется в окне маплета в виде однострочного прямоугольного окна обзора, в которое выводится только один текущий элемент. Щелчком левой кнопкой мыши на кнопке “” список можно разворачивать и сворачивать. Любой выбранный в списке элемент появляется также и в окне обзора, выделяется цветом и становится текущим. Сам список при этом автоматически сворачивается. При закрытии маплета по A возвращается список из одной строки, представляющей собой текущий элемент раскрывающегося списка. Таким образом, множественный выбор в данном случае недопустим. Заметим, что раскрывающийся список аналогичен группе радиокнопок, где также реализуется выбор ровно одного элемента группы. Однако во многих случаях раскрывающийся список из-за его компактности оказывается предпочтительнее и простых списков, и группы радиокнопок.

        Необязательный параметр alias является псевдонимом списка DropDownBox. В DropDownBox допустимы все опции opts, которые могут быть в ListBox. Их синтаксис и семантика также совпадают. Кроме того, можно указать дополнительную опцию height = h, по которой фиксируется высота начальной строки списка в пикселах. По умолчанию она устанавливается в соответствии с контентом списка.

        Обозначения в таблице 8 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде DropDownBox.

Таблица 8

Допустимые правила использования опций в командах

DropDownBox и ComboBox

     

          Опции

 

Правила

background

foreground

font

width

height

halign

valign

tooltip

visible

enabled

value

onchange

reference

appenditem

itemlist

C (можно)

+

+

+

+

+

+

+

+

+

+

+

+

+

 

 

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

 

 

 

 

+

+

+

+

 

 

+

+

G (Get)

+

+

+

 

 

 

 

+

+

+

+

 

 

 

+

        Пример 12. Здесь рассмотрен раскрывающийся список с тем же самым набором элементов, что и в предыдущем примере.

> 

with(Maplets[Elements]):

{Shift+¿}

 

li := ["apple", "plum", "pear", "cherry", "apricot"]:

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["Pick a fruit:  ", DropDownBox[DDB1](li, value = plum)],

{Shift+¿}

 

   [Button("Ok", Shutdown([DDB1])),

{Shift+¿}

 

      Button("Cancel", Shutdown())]]):

{Shift+¿}

 

re := Maplets[Display](mt):

{Shift+¿}

 

if type(re, [string]) then re[1] end if;

{¿}

Комбинированный список

        Команда ComboBox[alias](opts, li) создает так называемый комбинированный список. От раскрывающегося списка он отличается тем, что в данном случае вместо строки обзора имеется однострочное поле ввода. Правила работы с ним устанавливаются опцией editable = bo, где bo Î {true, false}. При bo = true в поле можно ввести любое требуемое значение или сформировать его выбором элемента из раскрывающегося списка. При bo = false значение для поля можно выбрать только из списка. Остальные опции объектов ComboBox и DropDownBox совпадают (см. табл. 8). Параметры alias и li в ComboBox имеют тот же смысл, что и в DropDownBox.

        Пример 13. Здесь возвращена строка, введенная в поле ввода комбинированного списка и не присутствующая среди его элементов.  

> 

with(Maplets[Elements]):

{Shift+¿}

 

li := ["apple", "plum", "pear", "cherry", "apricot"]:

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["Pick a fruit:  ", ComboBox[CB1](li, value = plum)],

{Shift+¿}

 

   [Button("Ok", Shutdown([CB1])),

{Shift+¿}

 

      Button("Cancel", Shutdown())]]):

{Shift+¿}

 

re := Maplets[Display](mt):

{Shift+¿}

 

if type(re, [string]) then re[1] end if;

{¿}

Выборы в списках

         В предыдущих трех пунктах описано формирование списков типа ListBox, DropDownBox и ComboBox с выборами, задаваемыми списком. Команда Item(opt) позволяют задавать выборы еще в одном варианте синтаксиса – в виде последовательности объектов Item с единственно возможной опцией value = va. Опцию можно записывать коротко в виде ее правой части va без ключевого слова value.

Информационная таблица

        Команда Table[alias](opts, li, lili) создает и выводит объект, называемый информационной таблицей, которая представляет собой оболочку с размещенными в ней всеми или частью элементов списка списков lili = [[a11, a12, …, a1,q1], [a21, a22, …, a2,q2], …, [ap1, ap2, …, ap,qp]]. Строками таблицы являются последовательности элементов или их начальные части соответствующих внутренних списков lili. Необязательный аргумент li = [h1, h2, …, hn] является списком элементов, используемых в качестве заголовков столбцов таблицы. При n £ q = min(q1, q2, …, qp) в формировании строк таблицы участвуют только первые n элементов каждого внутреннего списка lili. При n > q таблица не выводится. Элементы списков li и lili могут быть любыми Maple-выражениями. Заголовки столбцов таблицы индицируются лишь в том случае, когда таблица формируется с использованием команд BoxCell или GridCell с опцией vscroll = as_needed (вертикальная прокрутка, если необходима). В противном случае их не видно. Порядок следования в A аргументов li и lili роли не играет. Необязательный параметр alias в A – псевдоним таблицы, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       background = bcol. Установка цвета фона таблицы; 

·       foreground = fcol. Установка цвета текста в таблице;

·       font = fo. Назначение шрифта для текста в таблице; 

·       width = w. Задание ширины таблицы в пикселах;

·       height = h. Задание высоты таблицы в пикселах. Опции height и width можно задавать диапазоном их значений в виде h..w;

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости таблицы;

·       reference = ref. Назначение псевдонима таблице.

        Обозначения в таблице 9 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде Table.

Таблица 9

Допустимые правила использования опций в команде Table

     

          Опции

 

Правила

background

foreground

font

width

height

visible

tooltip

reference

C (можно)

+

+

+

+

+

+

+

+

N (нужно)

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

+

+

+

+

 

G (Get)

+

+

 

+

+

+

 

 

        Пример 14.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

  BoxCell(Table([A, B, C, D],

{Shift+¿}

 

    [[1, `end`, 3, a], [4, [5, 8], qwerty, b],

{Shift+¿}

 

    [7, "talk", sin(x)+5, c]]), vscroll = as_needed),

{Shift+¿}

 

  Button("OK", Shutdown())]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Элементы таблицы

        В предыдущем пункте описано формирование маплета типа информационной таблицы с использованием списка заголовков и списка списков элементов. Команды TableHeader (заголовок таблицы), TableRow (строка таблицы) и TableItem (элемент таблицы) позволяют строить таблицы еще в одном варианте синтаксиса. Аргументы elem в TableHeader  и TableRow – это последовательности элементов типа TableItem. Аргумент opt в TableItem – единственно возможная опция caption = ca, задающая соответствующий элемент таблицы строковым значением или литералом ca. Понять правила использования команд можно на следующем примере.

        Пример 15.

 >

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   BoxCell(as_needed,

{Shift+¿}

 

      Table(

{Shift+¿}

 

         TableHeader(TableItem(A), TableItem(B)),

{Shift+¿}

 

         TableRow(TableItem(a1), TableItem(b1)),

{Shift+¿}

 

         TableRow(TableItem(a2), TableItem(b2)))),

{Shift+¿}

 

   Button("Ok", Shutdown())]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

 

 

 

Обозреватели и иные элементы

       Обозреватель графиков

        Команда Plotter[alias](opts) создает обозреватель (построитель, плоттер) двумерных и трехмерных графиков. В нем можно проигрывать анимацию. Необязательный параметр alias – псевдоним обозревателя, необязательные аргументы opts – опции, которые в данном случае могут быть такими:

·       background = bcol. Установка цвета фона обозревателя; 

·       width = w. Задание ширины обозревателя в пикселах. По умолчанию
w
= 400;

·       height = h. Задание высоты обозревателя в пикселах. По умолчанию
h
= 400;

·       tooltip = str. Определение текста оперативной подсказки; 

·       visible = bo. Установка режима видимости обозревателя;

·       value = st. Задание значением st графической структуры, по которой в обозревателе выводится график. Такие структуры возвращаются графическими командами plot, plot3d, … или непосредственно создаются командами PLOT и PLOT3D;

·       reference = ref. Назначение псевдонима обозревателю;

·       play = bo. Опция play (проигрывать) значением bo = true запускает анимацию на выполнение от начала или продолжает ее после паузы;

·       `stop` = bo. Опция stop значением bo = true останавливает выполнение анимации;

·       pause = bo. Опция pause (пауза) значением bo = true задает временную приостановку анимации;

·       delay = d. Опция delay (задержка) значением d задает величину задержки в миллисекундах между выводом двух последовательных кадров анимации. По умолчанию d = 100;

·       frame_backwards = bo. Опция frame_backwards (кадр назад) значением bo = true реализует переход к предыдущему кадру. Для первого кадра предыдущим является последний кадр;

·       frame_forward = bo. Опция frame_ forward (кадр вперед) значением
bo = true реализует переход к последующему кадру. Для последнего кадра последующим является первый кадр;

·       continuous = bo. Опция continuous (непрерывно) значением bo Î {true, false} задает характер проигрывания анимации в обозревателе. При bo = false анимация проигрывается ровно один раз от первого кадра и до последнего. При bo = true этот же процесс организуется циклически до прерывания его пользователем;

·       to_end = bo. Опция to_end значением bo = true выводит последний анимационный кадр. Если последний кадр является текущим, то выводится первый кадр;

·       to_start = bo. Опция to_start значением bo = true выводит первый анимационный кадр.

        Обозначения в таблице 10 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде Plotter.

Таблица 10

Допустимые правила использования опций в команде Plotter

     

          Опции

 

Правила

background

width

height

tooltip

visible

value

reference

play

stop

pause

delay

frame_back..

frame_forw..

continuous

to_start

to_end

C (можно)

+

+

+

+

+

+

+

+

 

 

+

 

 

+

 

 

N (нужно)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S (SetOption)

+

+

+

+

+

+

 

+

+

+

+

+

+

+

+

+

G (Get)

+

+

 

+

+

 

 

 

 

 

+

 

 

+

 

 

        Пример 16. В данном примере демонстрируется действие команды Plotter. Создается построитель 2D-графиков для выражений от x в диапазоне a..b со следующими объектами: однострочное текстовое поле TF1 для ввода выражений, однострочное текстовое поле TF2 для ввода a, однострочное текстовое поле TF3 для ввода b, плоттер PL1 и две кнопки Plot и Ok общего назначения. По кнопке Plot в плоттере PL1 выводится график выражения из текстового поля TF1 в диапазоне a..b. По кнопке Ok вычисления прекращаются, и возвращается список с текущими значениями полей TF1, TF2 и TF3. Результат вычислений показан при вводе в TF1 выражения x*sin(x)+cos(3*x).

 

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   [["A function of  x ?",

{Shift+¿}

 

      TextField[TF1](width = 25, value = sin(x))],

{Shift+¿}

 

    ["a ?", TextField[TF2](width = 3, value = 0)],

{Shift+¿}

 

    ["b ?", TextField[TF3](width = 3, value = 10)]],

{Shift+¿}

 

   Plotter[PL1](width = 400, height = 80),

{Shift+¿}

 

   [Button("Plot", Evaluate(PL1 =

{Shift+¿}

 

       'plot(TF1, x = TF2..TF3, thickness = 2, color = black)')),

{Shift+¿}

 

    Button("Ok", Shutdown([TF1, TF2, TF3]))]]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}

Редактор (конвертор) MathML

        Команда MathMLEditor(opts) открывает окно специального редактора-конвертора, в которое можно вводить математические выражения в обычной форме записи и затем получать соответствующие им коды на языке MathML. Этот язык является дополнением к расширяемому языку XML (Extensible Markup Language), предназначенному для создания WWW-страниц. Ввод выражений в редакторе MathML осуществляется так. При щелчке правой кнопкой мыши в области окна MathML появляется контекстная панель заголовков палитр. На рисунке 2 заголовки для удобства ссылок на них пронумерованы натуральными числами. Соответствующие палитры, в порядке их следования, имеют следующие названия: размещение (Layout Palette), скобки (Fence Palette), тригонометрия (Trigonometry Palette), вычисления (Calculus Palette), операторы (Operator Palette), отношения (Relation Palette), множества (Set Theory Palette), логика (Logic Palette), малые греческие буквы (Lower Case Greek Symbol Palette), прописные греческие буквы (Upper Case Greek Symbol Palette). Раскрытие любой палитры реализуется наведением курсора на ее заголовок. Три палитры на рисунке 2 показаны в раскрытом виде.

 

1

2

3

4

5

6

7

8

9

10

 

 

Рис. 2. Контекстная панель заголовков палитр с раскрытыми палитрами 1, 4 и 7

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

        Некоторые часто используемые шаблоны можно вводить горячими ключами: {Ctrl+P} – ввод шаблона степени (выражения вида ab  можно вводить и в форме a^b); {Ctrl+Q} – ввод шаблона корня квадратного; {Ctrl+F} – ввод шаблона дроби.

        Необязательные аргументы opts в A – это опции, которые в данном случае могут быть такими:

·       background = bcol. Установка цвета фона окна редактора; 

·       foreground = fcol. Установка цвета текста в окне редактора;

·       width = w. Задание ширины окна редактора в пикселах. По умолчанию w = 300;

·       height = h. Задание высоты окна редактора в пикселах. По умолчанию h = 100;

·       reference = ref. Назначение псевдонима редактору. Индексом в Math­MLEditor псевдоним задавать нельзя;

·       value = nu. Опция value значением nu задает начальное выражение для редактора. В команде A параметр nu должен быть записан в одной из форм
nu = a или nu = MathML[Export](a), где a – выражение в синтаксисе Maple (‘a+b^3’, ‘int(cos(x), x)’, …);

·       focus = bo. Опция focus значением bo разрешает (bo = true) или запрещает (bo = false) редактору получать фокус непосредственно из маплета от SetOptions или Set.

        Обозначения в таблице 12 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде MathMLEditor.

Таблица 12

Допустимые правила использования опций в команде MathMLEditor

     

          Опции

 

Правила

background

foreground

width

height

reference

value

focus

C (можно)

+

+

+

+

+

+

 

N (нужно)

 

 

 

 

 

 

 

S (SetOption)

+

+

 

 

 

+

+

G (Get)

+

+

+

+

 

+

 

        Команда MathML[Import](“MathML_text”) по коду MathML_text, написанному на языке MathML, выводит в редактор соответствующее ему выражение в естественной математической форме записи.

        Команда MathML[Export](“Maple_text”) по выражению Maple_text, написанному на языке Maple, выводит в редактор соответствующее ему выражение в естественной математической форме записи.

        Пример 18.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["An expression ?", Button("Done", Shutdown([ME1]))],

{Shift+¿}

 

   MathMLEditor(height = 50, reference = ME1)]):

{Shift+¿}

 

re := Maplets[Display](mt);

{Shift+¿}

 

MathML[Import](re[1]);

{¿}

Обозреватель MathML

        Команда MathMLViewer(opts) открывает окно специального обозревателя выражений. Опция value = nu параметром nu задает выражение, записанное в одной из форм nu = a или nu = MathML[Export](a), где a – выражение в синтаксисе Maple (‘a+b^3’, ‘int(cos(x), x)’, …). Команда A выводит это выражение в обычной математической форме записи.

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

·       background = bcol. Установка цвета фона окна обозревателя; 

·       foreground = fcol. Установка цвета текста в окне обозревателя;

·       fontsize = nu. Установка размера используемого шрифта в точках. По умолчанию nu = 18;

·       width = w. Задание ширины окна обозревателя в пикселах. По умолчанию w = 300;

·       height = h. Задание высоты окна обозревателя в пикселах. По умолчанию h = 100. Опции height и width можно определить диапазоном их значений в виде h..w;

·       reference = ref. Назначение псевдонима обозревателю. Индексом в MathMLViewer псевдоним задавать нельзя;

·       value = nu. Опция value параметром nu задает выражение, которое должно быть записано в одной из форм nu = a или nu = MathML[Export](a), где a – выражение в синтаксисе Maple. В обозревателе выражение появляется в обычной математической форме записи.

        Обозначения в таблице 13 те же, что и в таблице 2, а знаком “+” в ней указаны допустимые правила использования опций в команде MathMLVie­wer.

Таблица 13

Допустимые правила использования опций в команде MathMLViewer

     

          Опции

 

Правила

background

foreground

width

height

fontsize

reference

value

C (можно)

+

+

+

+

+

+

+

N (нужно)

 

 

 

 

 

 

 

S (SetOption)

+

+

 

 

 

 

+

G (Get)

+

+

+

+

 

 

+

        Пример 19.

> 

with(Maplets[Elements]):

{Shift+¿}

 

mt := Maplet([

{Shift+¿}

 

   ["The solution is:", [Button("Ok", Shutdown())]],

{Shift+¿}

 

   MathMLViewer(50..300, value = int(x^3*exp(x+1), x))]):

{Shift+¿}

 

Maplets[Display](mt);

{¿}