К объектам внутри шаблона/шаблонного окна нельзя обратиться напрямую через скрипты, т.к. шаблон и объекты в нем не являются реальными объектами. Только после запуска проекта, на основе шаблона будет создано множество реальных объектов. А на основе шаблонных окон будет создано множество реальных окон. До запуска проекта эти объекты не существуют. Ниже будут рассмотрены способы работы с объектами внутри шаблона.
1. Управление объектом шаблона по значению переменной связанной с объектом.
Если требуется изменять свойство объекта шаблона(например цвет, видимость, прозрачность и т.д.) при изменении значения связанной с ним переменной, то для этого нужно использовать универсальные скрипты назначенные на событие OnDataChange/OnDataChangeEx требуемого объекта шаблона. Ознакомиться с примерами различных универсальных скриптов можно в разделе "Примеры скриптов".
2. Работа с объектами шаблона в скриптах.
Рассмотрим шаблон, в котором расположено только одно изображение (Image1). Нужно скрыть изображение если пользователь кликнул по нему. Т.к. изображение является объектом шаблона, мы не можем напрямую обратиться к нему. Например, этот код (назначенный на событие OnClick изображения) во время компиляции вызовет ошибку "Undeclared identifier Image1":
begin
Image1.Visible := False;
end.
Есть два способа решить задачу, первый - использовать универсальный скрипт. По возможности, следует всегда стараться использовать универсальные скрипты. Если применить универсальный скрипт для решения задачи нельзя, то можно воспользоваться вторым способом описанным ниже.
begin
// скрыть объект, который вызвал скрипт
Sender.Visible := False;
end.
Второй способ - обратиться к объекту, используя функцию GetTemplateObject:
var
aImage: TM_Image;
begin
// ищем среди всех объектов шаблона объект с именем Image1 и
// записываем результат в локальную переменную aImage
aImage := GetTemplateObject('Image1') as TM_Image;
// скрываем изображение
aImage.Visible := False;
end.
3. Инициализации шаблона.
Каждый шаблон/шаблонное окно имеет событие OnInit. Скрипт назначенный на это событие будет выполнен один раз, после создания шаблона/шаблонного окна. Данное событие удобно использовать для "настройки" шаблона. Рассмотрим простой пример: есть множество однотипных насосов. Одни относятся к группе А, другие к группе B. Насосы в группе А отображаются с зеленым заголовком и с полем оборотов насоса. Насосы в группе B отображаются с красным заголовком, а поле с оборотами у них отсутствует:
Для удобного тиражирования можно было бы создать два разных шаблона. Первый для насосов из группы А (с зеленым заголовком и с полем оборотов), а второй для насосов группы B (с красным заголовком и без поля). Но есть и другой способ: создать один шаблон и по событию OnInit, в зависимости от значения группы, менять цвет заголовка и скрывать поле оборотов. Применим данный способ. Для этого, создадим шаблон, разместим в нем компонент текст с именем "txtPumpTitle" для заголовка. Текст заголовка заменим подстановкой "Заголовок насоса". Поле оборотов насоса назовем "fldPumpFreq". Далее, разместим объекты на основе шаблона на мнемосхеме и заполним подстановки. У первого шаблонного объекта подстановку "Заголовок насоса" назначим "А1", у второго "А2", затем "B1" и "B2".
Затем, на событие OnInit шаблона назначим скрипт с таким кодом:
var
aTitle: TM_Text;
aField: TM_Field;
begin
// ищем среди всех объектов шаблона текст заголовка и поле оборотов насоса
aTitle := GetTemplateObject('txtPumpTitle') as TM_Text;
aField := GetTemplateObject('fldPumpFreq') as TM_Field;
// если первый символ заголовка равен "А"
if aTitle.Text[1] = 'A' then
begin
aTitle.Color := clGreen; // зеленый цвет фона заголовка
aField.Visible := True; // показать поле оборотов насоса
end else
// если первый символ заголовка равен "B"
if aTitle.Text[1] = 'B' then
begin
aTitle.Color := clMaroon; // красный цвет фона заголовка
aField.Visible := False; // скрыть поле оборотов насоса
end;
end.
Запустим проект - скрипт инициализации сработал правильно, заголовки выделены цветами, а поля с оборотами насоса не видны в группе B: