Часть 2. Приложение с UI.
После знакомства с консольным приложением попробуем создать первое приложение с пользовательским интерфейсом.
Скачайте минимальный дистрибутив клиента.
Обратите внимание на содержимое папки Sample Client. Папка содержит минимальный набор файлов для запуска клиента SP-XML. Папка настроена для работы в локальном режиме, без использования сервера приложения.
SpXml.exe – исполняемый файл клиентской части.
app, app_ui – вспомогательные файлы (встроенные элементы UI, диалогов и пр.)
misc – внешние компоненты и библиотеки
Отдельно обратите внимание на файл SpXml.ini. Его создаете Вы, как разработчик приложения. Этот файл будет являться частью дистрибутива Вашего приложения.
Пока в нем всего одна строчка:
HOME: x-app://test/test.xml
Параметр HOME содержит url стартового документа (стартовой страницы). Обратите внимание на схему x-app. Это специальная схема для файлов, входящих в дистрибутив. Хост в данной схеме (в нашем примере это “test”) – имя модуля. По умолчанию модули располагаются в папке приложения.
В нашем примере уже создан модуль “test”, в котором есть два файла: test.xml и test.xms.
test.xml – файл, содержащий форму описания данных XML-документа, которую мы вкратце рассматривали в первой части, посвященной консольному приложению. Однако в предыдущем примере файл с формой имел расширение .xmd и содержал корневой элемент <SPXML-FORM>, а в данном случае имеет расширение .xml и содержит корневой элемент <SPXML-INLINE-FORM>.
В данном случае мы применили технологию так называемой inline-формы, когда форма и созданный по ней документ объединяются в одном файле. Без этой технологии пришлось бы создавать два файла: форму .xmd и пустой .xml, ссылающийся на эту форму.
Форма test.xmd описывает форму данных домашней страницы, содержащую 4 поля разных типов:
<?xml version="1.0" encoding="utf-8"?>
<SPXML-INLINE-FORM>
<test>
<name TYPE="string" DEFAULT="entry_1"/>
<flag TYPE="bool" NULL-FALSE="1"/>
<count TYPE="integer" NOT-NULL="1"/>
<date TYPE="date"/>
</test>
</SPXML-INLINE-FORM>
Форма test.xms содержит экранную форму домашней страницы.
<?xml version="1.0" encoding="utf-8"?>
<SPXML-SCREEN SOURCE="TopElem" TITLE="Hello world" RESIZE="1" WIDTH="700px" HEIGHT="400px">
<LABEL TITLE="Hello world!" BOLD="1"/>
<BR/>
<EDIT SOURCE="Ps.name" WIDTH="50zr" LABEL-TITLE="Name"/>
<CHECK-BOX SOURCE="Ps.flag" TITLE="Flag"/>
<IF EXPR="Ps.flag">
<EDIT SOURCE="Ps.count" WIDTH="10zr" LABEL-TITLE="Count"/>
</IF>
<LINE ADAPTIVE="1">
<DATE SOURCE="Ps.date" LABEL-TITLE="Date"/>
<LABEL TITLE-EXPR="'Selected date: ' + StrLongDate( Ps.date )"/>
</LINE>
<BR/>
<BUTTON TITLE="Test" ACTION="alert( 'Hello world!' )"/>
</SPXML-SCREEN>
Обратите внимание на следующие детали:
Каждый редактируемый элемент содержит атрибут SOURCE (источник данных). Это выражение, возвращающее элемент XML-документа, который редактирует данный элемент экрана. В нашем примере все выражения считаются от специального элемента “Ps” – источника, вышестоящего элемента, где он указан. В нашем примере это “TopElem” – корневой элемент.
WIDTH или HEIGHT может измеряться как в привычных единицах “px”, так и в “zr” – ширина символа “0”.
При смене значения поля на экране, сразу идет запись нового значения в элемент-источник, после чего идет перестроения элементов экрана. При перестроении часть элементов, находящихся внутри элемента <IF> может появиться на экране, или наоборот быть скрыта. Также при перестроении будут заново вычислены выражения в TITLE-EXPR.