FastScript

Библиотека для выполнения скриптов Delphi 2010-XE8, C++Builder 2010-XE8, Embarcadero RAD Studio 11 и Lazarus

FastScript — библиотека для выполнения скриптов. Она будет полезна разработчикам, желающим добавить возможности исполнения скриптовых программ в свои проекты. Delphi 2010-XE8, C++Builder 2010-XE8, Embarcadero RAD Studio 11 и Lazarus

Особенности и преимущества FastScript

Нестандартные вычисления
С помощью скриптов можно обрабатывать данные, а также выполнять расчет стандартных показателей и фильтров.
Поддержка событий
FastScript поддерживает обработку событий в скрипте. В отличие от обработчиков событий в Delphi, в скрипте обработчики не являются методами объекта.
Доступ к любому объекту вашего приложения
Используются стандартные библиотеки для доступа к базовым классам, контролам, формам и БД. FastScript имеет легко расширяемую архитектуру.
Исходный код
Эта библиотека включает в себя полные исходные коды. Максимальное удобство для компаний, желающих адаптировать код под свои нужды.
Мультиязычная архитектура
Вы можете использовать множество языков PascalScript, C++Script, JScript, BasicScript, либо добавлять любые другие процедурно-ориентированные языки в XML-формате.
Доступная документация
Воспользуйтесь нашей документацией, бесплатными видео-уроками и многочисленными статьям для каждого сценария использования нашего продукта в ваших проектах, чтобы добиться значимых результатов в кратчайшие сроки.
Максимальная гибкость и мощность

Максимальная гибкость и мощность

В FastScript поддерживается возможность одновременного использования нескольких языков (PascalScript, C++Script, JScript и BasicScript).

Наша библиотека не использует Microsoft Scripting Host, а потому может использоваться как в Windows, Linux, так и в Mac OS.

FastScript объединяет в себе кросс-платформенность, быстрое выполнение кода, компактность, богатый выбор возможностей и великолепную масштабируемость.

Большие возможности

Большие возможности

FastScript имеет стандартный языковой набор: переменные, константы, процедуры, функции (с возможностью вложенности) с переменными, постоянными, и параметрами по умолчанию, все стандартные операторы и объявления (включая case, try/finally/except, with).

А также библиотека работает с множеством: типов данных (целые, дробные, логические, символьные, строковые, многомерные массивы, множество, универсальный тип), классов (с методами, событиями, свойствами, индексами и свойствами по умолчанию).

Поддерживает OLE и имеет компактный вес 80-150 Кб в зависимости от используемых модулей.

Варианты поставок

Особенности
от 129 890 ₽
от 89 890 ₽
от 49 890 ₽
от 39 890 ₽
Ядро FastReport
Компоненты VCL
Компоненты FMX
Компоненты Lazarus
Возможности OLAP
Агрегатные OLAP функции
Поддержка баз данных
Возможности отчётов
Объекты отчета
Штрих-коды
Диаграммы
Печать
Экспорт в различные форматы
Исходные коды
Конвертеры из других шаблонов
Транспорты (Transports)
Плагин FastConverter .FP3

Совместим ли FastScript с многопоточностью?

Да, совместим без использования fsGlobalUnit. Подробное описание можно найти на 47-й странице руководства.

Ultimate VCL

Этот набор компонентов входит в состав Ultimate решения, с помощью которого вы сможете создавать свои бизнес-проекты на всех привычных платформах VCL, Lazarus и FMX. Дополнительно в набор входит FastScript для быстрой обработки скриптов любой сложности, а также визуальный построитель SQL-запросов к базам данных FastQueryBuilder. Помимо этого вам будут доступны клиент-серверные инструменты отчетности на VCL и Lazarus.

Связанные статьи

20 ноября 2024

Локализация и смена языков в FastReport VCL

В современном мире большое значение имеет возможность поставки своего программного обеспечения заказчикам по всему миру. Поэтому FastReport VCL поддерживает около 40 самых распространённых языков мира для локализации пользовательского интерфейса. В FastReport VCL начиная с версии 2023.2 был значительно улучшен механизм локализации – теперь для перевода FastReport на другие языки – больше не требуется перекомпиляция. Пакет локализации имеется во всех комплектах поставки FastReport VCL. Локализация осуществляется «на лету», путем выбора необходимого языка в Дизайнере отчетов в меню «Вид – Язык». Более того вы можете управлять языком интерфейса FastReport VCL прямо из кода!     Проверка и установка пакетов локализации Для корректной работы локализации необходимо, чтобы в IDE были установлены пакеты локализации (frxLanguageXXX) и пакет контроллера локализации (frLocalization). В операционной системе Windows для IDE Delphi и Lazarus пакеты локализации устанавливаются автоматически. Если меню локализации недоступно, то необходимо проверить установлены ли эти пакеты в IDE. В Delphi вы увидите следующее окно: Меню локализации в Lazarus выглядит следующим образом: Если какие-то из пакетов переводов не требуются, то их можно удалить из среды разработки.     Работа с TfrLocalizationController и выбор языка Как уже упоминалось выше, смена языка FastReport в дизайнере отчетов осуществляется очень просто. Перейдите в меню «Вид – Языки» и выберите нужный язык.  Для подключения локализации FastReport к программе необходимо воспользоваться компонентом TfrLocalizationController. Достаточно положить его на главную форму приложения. Далее, для Delphi необходимо щелкнуть по компоненту правой кнопкой мыши, затем в выпавшем меню выбрать язык, поддержку которого FastReport нужно добавить в вашу программу: После этого необходимо у компонента TfrLocalizationController выбрать язык, который будет загружен по умолчанию при старте приложения. Можно также добавить в uses главной формы модуль, содержащий необходимую локализацию. Следует отметить, что по умолчанию в FastReport VCL используется английский язык, поэтому если вам нужен только он, ничего делать не нужно. Для подключения локализации в Lazarus необходимо в проект добавить языковой пакет, а затем добавить модуль для этого языка.     Смена языка из кода В некоторых ситуациях может потребоваться управлять локализацией FastReport VCL из кода программы. Это делается следующим образом:  frLocalizationController.Language := ‘German’; Данный код устанавливает немецкий язык. Не забудьте, что ваша программа должна быть скомпилирована с языковым пакетом, на который вам надо переключиться. Узнать с какими пакетами языков скомпилирована программа можно с помощью кода ниже. Для этого необходимо подключить модуль Types, положить на форму компоненты TButton и TMemo, а в обработчике Buttom.OnClick написать: procedure TForm1.Button1Click(Sender: TObject);var D:TStringDynArray;        I: Integer;begin  Memo1.Lines.Add('Default Lang: '+TfrAvailableLanguagesController.GetDefaultLanguageName);  Memo1.Lines.Add('Current Lng: '+frLocalizationController1.Language);  Memo1.Lines.Add('Suppotred languages:');  D:=TfrAvailableLanguagesController.GetLanguages;  for I:=Low(D) to High(D) do begin    Memo1.Lines.Add(D[I]);  End;end;  Обратите внимание, что английский язык не включен в список поддерживаемых языков, но он всегда доступен по умолчанию.     Редактирование локализации через Localizer Вызвать редактор Локализации можно следующим образом: в IDE Delphi меню «Tools… - Localization Editor…» в Lazarus меню «Сервис - Localization Editor…» Вы можете вызывать «Редактор локализации» из своей программы с помощью кода ниже. Однако данный способ доступен не во всех версиях.   frLocalizationController1.ShowLocalizationEditor; Назначение элементов управления в редакторе локализации: открыть файл *.xml с переводом сохранить файл *.xml с переводом сохранить файл перевода с заданным именем отменить последнее действие выполнить отмененное действие задать язык перевода отфильтровать записи по маске очистить фильтр показывать только переведенные записи показывать только непереведенные записи «Редактор локализации» позволяет построчно переводить ресурсы FastReport VCL на различные языки. По центу редактора расположена сетка с переводимыми значениями.  Первая колонка – идентификатор элемента, который подлежит переводу. Это всегда строка несмотря на то, что в отдельных строках располагаются и числа, так как используется их строковое представление.  Вторая колонка – оригинальное значение элемента на английском языке.  Третья колонка – переведенное значение элемента для другого языка. Перейдём к принципу работы редактора локализации. При загрузке редактор проверяет какие локализации доступны приложению, в которое он встроен. Затем редактор заполняет список доступных языков (комбобокс для ввода языка перевода). Текущая установленная локализация является активной для редактирования. Вы можете выбрать и отредактировать перевод для любого из доступных языков и сохранить его в XML файл. Если у вас уже имеется XML файл с переводами, то его можно загрузить для редактирования. В редакторе локализации можно переключаться между режимами отображения. Например, показать только те элементы, у которых перевод совпадает с оригиналом на английском языке. Либо наоборот оставить только элементы, перевод которых отличается от английской версии. Но следует учитывать, что не все элементы нужно переводить.  К записям в сетке можно применить фильтр. Элемент сетки отображается только если значение фильтра содержится в любой колонке. Также вы можете отсортировать сетку в прямом и в обратном алфавитном порядке, щелкнув на заголовок любой колонки. Если вы изменили файл перевода, то его можно подключить в программу вместо стандартного. Для этого в операторе uses вам необходимо подключить модуль frResources используя следующий код:   frStringResources.LoadFromFile('mylanguage.xml'); Мы рекомендуем после редактирования файлов перезагрузить ваше приложение для корректного отображения всех переведенных ресурсов. Также следует учесть, что загруженный перевод сразу становится активным, но работает до первого переключения языка. Далее при переключении на этот же язык повторно, локализация берется из подключенных к программе ресурсов. Помимо этого, мы можете самостоятельно скомпилировать ресурс с файлом перевода. Поместите его в каталог с соответствующим модулем языка и используйте в программе. Чтобы этот перевод появился в IDE запустите установщик и выберете режим Recompile. Или просто перекомпилируйте пакет нужного вам языка. В Lazarus после этого вам потребуется пересобрать IDE, в Delphi – перезагрузить среду. Если вы хотите, чтобы ваш перевод не терялся после каждого обновления, то вы можете отправить файл локализации нам на support@fastreport.ru. Мы проверим полученный файл и добавим его в инсталлятор.
Читать
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Наши продукты постоянно развиваются, непрерывно добавляется новый функционал и улучается качество программного кода. В этой статье рассмотрим новые возможности редактор отчетов и не рассмотренные в руководстве пользователя.   Инспектор объектов Добавлена возможность помещать отдельные свойства в «Избранное». Для этого сфокусируйте курсор на инспекторе объектов и нажмите на клавишу CTRL. Рядом с именами свойств появятся чекбоксы, выберите необходимые вам свойства и добавьте их в список избранного. Удалять свойства можно таким же способом во вкладке «Избранное». События поместить в избранное нельзя. Теперь рядом со вкладками инспектора объектов расположено окно ввода для быстрого поиска свойств. Окно поиска может быть не видно, если у инспектора объектов малая ширина. При вводе данных в это окно инспектор начинает показывать только те свойства, которые содержат введенную строку. Инспектор выделяет значения свойств жирным стилем если те отличаются от значений по умолчанию. Это позволяет быстро находить свойства объекта, которые были изменены в процессе редактирования.  Примечание: не у всех свойств имеются значения по умолчанию, поэтому не все свойства могут быть подсвечены.      Дерево отчета В дерево отчетов также добавлен поиск компонентов по имени. Чтобы появилась строка поиска, то внутри дерева необходимо нажать на значок >>, расположенный справа внизу. Помимо этого, в дереве отчета можно выделять несколько элементов с использованием клавиши CTRL.  Дополнительно можно вызвать меню редактирования с помощью правой кнопки мыши – оно аналогично меню, которое вызывается при щелчке по компоненту. При выделении нескольких компонентов можно отредактировать их все одновременно. Например, скрыть их все с помощью свойства Visible, или, например удалить.     Дерево данных Интересной возможностью дерева данных является перетаскивание полей на рабочее поле дизайнера со вкладки «Поля БД». Если вы сделали активными кнопки «вставлять поле» или «вставлять заголовок» (кнопки F и C на изображении выше), то на рабочем поле дизайнера создастся frxMemoView либо с текстом заголовка из поля данных, либо привязанный к данным. В том случае, когда будут нажаты обе кнопки, то сгенерируются два TfrxMemoView - и с заголовком поля и привязанный к данным. Если данные берутся из TfrxDataSet, то в редакторе этого компонента (в самой IDE Delphi) можно настроить тип компонента, который создаётся при перетаскивании. Группы полей также можно перетаскивать. При этом, если вместе с полями выбрать и датасет, то создастся бэнд с данными полями. Если перетаскивается поле данных, то имя компонента составляется из имени датасета и имени поля данных. Помимо этого, можно перетащить поле данных и на существующий компонент. Тогда этот компонент привяжется к перетаскиваемому полю данных (предыдущее значение будет потеряно). Поле данных также можно перетащить в любое строковое свойство инспектора объектов. В дереве данных ещё есть 2 вкладки: «Функции» и «Классы», на которых отображаются все доступные в отчете классы и функции. Их также можно перетаскивать в дизайнер отчета.   Рабочее поле дизайнера Рабочее поле дизайнера обладает рядом интересных возможностей, облегчающих жизнь разработчика. На большинстве контролов, если у них есть обработчики событий, то в верхнем левом углу появляется маленький красный треугольник. Если на привязанном к датасету бэнде находится TfrxMemoView, то при наведении на него мышкой у него справа появляется треугольник (как у комбобокса). При нажатии на него можно привязать к TfrxMemoView поле из датасета бэнда. Если содержимое текстового компонента не полностью видно на экране (обрезано), то при наведении на такой компонент появляется подсказка с полным содержимым данного компонента. Эти подсказки можно убрать в настройках дизайнера, для этого перейдите в меню «Вид» -> «Настройки» и уберите галочку «Enable workspace hints».     Выносные линии Выносные линии – это набор вертикальных и горизонтальных линий для позиционирования вдоль них компонентов отчета. Управление видимостью выносных линий организовано с помощью подэлеменов меню «Вид».  «Выносные линии» – этот пункт меню разрешает использование выносных линий. Для создания выносной линии необходимо щелкнуть мышью 2 раза по линейке сверху или сбоку дизайнера. Выносные линии отображаются голубым цветом. «Автоматические выносные линии» – выносные линии появляются вдоль каждой границы компонента. Если выносная линия создана пользователем и не связана с границей компонента, то она исчезает, а если связана – то становится коричневого цвета. Создание пользовательских выносных линий в этом режиме невозможно.  «Использование горизонтальных и вертикальных выносных линий» – эти 2 пункта меню отвечают за видимость горизонтальных и вертикальных выносных линий. Также регулировать видимость выносных линий можно с помощью кнопки, находящейся на пересечении вертикальной и горизонтальной линеек, в верхнем левом углу поля редактирования дизайнера отчетов (скриншот ниже). Эта кнопка по кругу переключает режимы выносных линий в следующем порядке:-    без автоматических выносных линий;-    все автоматические выносные линии;-    горизонтальные автоматические выносные линии;-    вертикальные автоматические выносные линии. Для удаления пользовательской выносной линии достаточно переместить её за пределы области дизайнера или щёлкнуть правой кнопкой мыши по указателю выносной линии. В режиме автоматических выносных линий можно преобразовать эти линии в пользовательские, а затем вернуть обратно в автоматические. Для этого 2 раза нажмите по указателю выносной линии на линейке. Выносные линии применяются для расположения элементов отчета в нужном порядке. Главное свойство выносных линий – границы компонентов «прилипают» к выносным линиям при любом изменении размеров компонентов.  Помимо этого, при перетаскивании выносной линии вместе с ней перемещаются все «прилипшие» границы компонентов. Если противоположная граница компонента «прилипла» к другой выносной линии, то компонент изменяет свои размеры. Если противоположная граница компонента свободна, то компонент перемещается вслед за выносной линией, его размеры не меняются (каждую из настроек можно отключить в опциях дизайнера, например «Прилипать к выносным линям» и «Использовать выносные линии как якорь»).  Также выносные линии имеют способность «слипаться» между собой – если одну выносную линию переместить на другую, то они сольются. Таким образом с помощью выносных линий можно быстро выстроить компоненты отчета по пользовательской сетке. Данный функционал очень важен при экспорте отчета в некоторые форматы (например, в таблицу Excel), получение табличных отчетов без использования компонентов-сеток и так далее.     Дополнительные кнопки панели инструментов дизайнера На панель инструментов «Стандартная» добавлены 2 новые кнопки «Подсвечивать пересечение объектов» и «Поиск».  Первая кнопка переназначена для показа пересекающихся объектов, которые на изображении выше автоматически выделяются красным цветом. Сам цвет можно изменить в настройках редактора.  Вторая кнопка открывает окно поиска текста или его замены. В этом окне можно задать области поиска: искать в именах компонентов, в значениях строковых свойств, в содержимом, в тексте скрипта. Под содержимым понимается, например, значение свойства Memo компонента TfrxMemoView. Перейдем к настройкам поиска. Если активен чекбокс «Различать регистр», то будут различаться строчные и прописные буквы.  Если активен чекбокс «Искать все», то список найденного будет выведен на панели ниже, с пояснениями, какому элементу отчета принадлежит найденный текст. При щелчке мышью на любом элементе будет произведен переход к найденному элементу.  В ситуациях, когда чекбокс «Искать все» не активен, то по нажатию кнопки «Искать далее» (или клавиша F3 на клавиатуре) будет произведен переход к следующему найденному элементу. Переходы между элементами идут по вкладкам «Data», «Page», либо по «Code» в зависимости от активной вкладки. При наличии чекбокса на настройке «Заменить на» становится активным окно, в которое необходимо вписать новый текст для замены текущего. При этом надпись на кнопке «Искать текст» меняется на «Замена». Теперь при нажатии на кнопку «Замена» появляется диалог следующего вида: Этот диалог позволяет подтвердить или отменить замену текста. Данный функционал может понадобиться, например, при необходимости сменить один шрифт у всех компонентов на другой. Или, например, если вы переименовали датасет, который активно используется в скриптах. 
Читать
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

Под стилем (Style) в FastReport VCL понимается набор визуальных параметров компонента, а именно: шрифт, заливка, и рамка. Прямо в дизайнере отчетов вы можете создать стиль, который будет содержать только информацию о шрифте, либо только о рамке или заливке с рамкой. Вы можете одновременно использовать все эти параметры или чередовать в зависимости от ваших нужд. Стиль удобен для массового изменения внешнего вида компонентов. Это поможет при настройке нескольких параметров чтобы не выставлять одни и те же свойства вручную много раз. Также с помощью изменения параметров стиля можно быстро изменить внешний вид отчета. Готовую библиотеку стилей можно сохранить в отдельный файл, чтобы использовать для настройки нескольких отчетов. В FastReport VCL стили могут объединяться в «Страницу стилей (StyleSheet)». В совокупности набор страниц стилей называется «Таблица стилей» (или «Книга стилей»). Каждый стиль существует в каждой странице стилей. И в каждой странице стилей сам стиль может иметь разные параметры. При этом становится возможным быстро изменить настройки внешнего вида отчета, просто сменив текущую страницу стилей. Такое может быть полезно, например, если один и тот же отчет необходимо использовать в нескольких операционных системах с разными шрифтами. Тем самым необходимые стили устанавливаются просто переключением страницы стилей. Можно считать, что в FastReport VCL в каждом отчете имеется как минимум одна страница стилей с именем «По умолчанию» (Default).     Элементы управления стилями Для управления и работы со стилями и таблицами стилей имеется панель инструментов «Стили».   Управляет режимом использования таблиц стилей, содержит подменю с двумя элементами: «Designer style book» – разрешает использование таблиц стилей в дизайнере отчетов.«Preview Style book» – разрешает использование таблиц стилей в окне предварительного просмотра (изменение текущей таблицы стилей). Включает режим редактирования стилей непосредственно в отчете. Добавляет новую страницу стилей. Отвечает за выбор активной страницы стилей, а также за изменение имени страницы стиля. Удаляет текущую выбранную страницу стилей. Добавляет новый стиль. Позволяет выбрать стиль для текущего выделенного компонента, изменение имени текущего стиля. Удаление текущего стиля.   Также для редактирования и управления стилями можно использовать форму, которая доступна из меню «Отчет» -> «Стили». Кнопки тулбара этой формы имеют те же функции, что и на панели инструментов «Стили». Дополнительно можно сохранить и прочитать с диска таблицу стилей. Слева на форме расположен список стилей, доступных в отчете. При выборе любого стиля становится возможным редактирование его параметров. На панели ниже расположен образец применения стиля к элементу отчета. По центру на форме имеется 3 кнопки, с помощью которых можно отредактировать составляющие стиля. Рядом с кнопками расположены 3 чекбокса. В них можно указать содержит ли стиль тот или иной компонент – цвет фона, шрифт или рамку. Причем использование той или иной составляющей стиля одновременно разрешено или запрещено во всех страницах стилей.     Работа со стилями Для установки свойств стилей служит специальная форма, доступная из меню «Отчет –> Стили…» (скриншот выше). С помощью этой формы можно добавлять и удалять стили в отчет, переименовывать их, а также устанавливать их свойства. Также можно сохранять и загружать их из файлов стилей. Задать стиль выбранному компоненту отчета можно с помощью ComboBox на панели стилей, либо с помощью свойства «Style» в инспекторе объектов. Если задать для компонента отчета стиль под названием «Нет стиля» или удалить имя стиля в инспекторе объектов, то внешний вид компонента сохранится. Однако после этих действий данный компонент перестанет зависеть от стиля. Также можно перевести дизайнер отчетов в режим редактирования стилей с помощью кнопки на панели стилей (Edit Styles Mode).  В этом режиме становятся активными 2 кнопки по бокам ComboBox с именами стилей – можно добавлять и удалять стили с помощью них. При создании стиля с помощью кнопки на панели стилей, то такому стилю присваиваются свойства текущего выделенного компонента. При удалении стиля форматирование компонентов отчета сохраняется. Однако теперь форматирование будет храниться не в стиле, а в самом компоненте. Каждый пользователь имеет возможность редактировать стили непосредственно в отчете. Если отредактировать визуальные свойства элемента, которому назначен стиль, то фактически будут отредактированы свойства этого стиля. Такое поведение можно увидеть непосредственно в дизайнере. При изменении параметров одного компонента будут меняться все компоненты, имеющие данный стиль.      Работа с таблицами стилей Для работы с таблицами стилей сначала необходимо их включить. Это делается путем нажатия кнопки «Style Book Mode» и выбора режимов «Design Style Book» или «Preview Style Book». После этого становятся активными кнопки «Add Style Sheet», «Delete style Sheet» и ComboBox с именами таблиц стилей. Вы можете добавлять, удалять и переименовывать таблицы стилей, а также сделать какую-либо из них активной. При активации таблицы стилей все стили изменяют свое состояние на то, что хранится в текущей таблице стилей. При создании новой таблицы стилей данные для неё берутся из текущей активной таблицы стилей. При активной опции «Preview Style Book» изменение страниц стилей доступно в предварительном просмотре. Тогда у вас справа на панели инструментов появится ComboBox. В нем можно выбрать требуемую страницу стилей, и она немедленно применится к отчету.     Сохранение и чтение стилей Вернёмся в окно настройки стилей. В этом окне имеются кнопки «сохранить» и «прочитать». При нажатии на них вызываются диалоги чтения и записи файла, позволяющие сохранить и прочитать таблицу стилей в формате *.fs3. Независимо от режима работы со стилями, в файл записываются все таблицы стилей, которые находятся в отчете.  Как правило, конечный пользователь не должен редактировать отчет, у него есть только возможность предварительного просмотра. Поэтому программист должен уметь задавать текущий стиль отчета в коде приложения.  Это можно сделать так: begin  //загружаем отчет  frxReport1.LoadFromFile(DefPath+'main.fr3');  //загружаем стили  frxReport1.Styles.LoadFromFile(DefPath+'main.fs3');  //для управления таблицами стилей frxReport1.Styles.StyleBookMode не должно быть равно []  frxReport1.Styles.StyleBookMode:=[fsbDesigner];  //задаем стиль, который нам нужен  frxReport1.Styles.ActiveStyleSheet:='MyStyleSheet';  //применяем стиль к отчету  frxReport1.Styles.Apply;  frxReport1.ShowReport();end; Более подробно работа со стилями описана в руководстве программиста.     Таблицы стилей и условное форматирование Следует с осторожностью применять условное форматирование совместно с таблицами стилей. Если активен режим «Preview Style Book», то при изменении стиля условное форматирование теряется. Без проблем при этом можно менять те элементы форматирования, которые не используются стилем. Подведём итоги. Работать со стилями и со страницами стилей совсем не сложно. Данный функционал значительно упрощает и ускоряет построение отчетов. Это позволяет вам гораздо быстрее делать группы отчетов с одинаковым стилем оформления.
Читать