logo

Уникальный идентификатор окна

Андрей Волков

Известно, что в FileMaker нет функции, которая возвращает уникальный идентификатор окна. Тем не менее, в работе, открывая несколько одинаковых макетов в разных окнах, мы хотели бы вести работу в каждом макете индивидуально: чтобы по-разному отображались разные записи в связанных таблицах, или чтобы по-разному работало условное форматирование в разных окнах в зависимости от действий пользователя в каждом.

Кейс 1.

Например, на макете есть две кнопки А и Б. Макет открыт в двух окнах. В левом нажимаем кнопку А и хотим, чтобы отобразилась надпись: нажата кнопка А. В правом нажимаем кнопку Б и хотим, чтобы отобразилась надпись: нажата кнопка Б.

Если бы у нас был вычисляемый идентификатор окна,  то задача не составила бы труда: в вычисляемом поле (Unstored calculation Text) мы поместили бы формулу:

Case(
$$ButtonPressed[hwnd] = “А”; “нажата кнопка А”;
$$ButtonPressed[hwnd] = “Б”; “нажата кнопка Б”;
)

Предлагается простой способ для создания собственного идентификатора. Что требуется для этого:

  1. на макете размещаем WebViewer с именем “hwnd”
  2. в Custom Funсtions добавляем пользовательскую функцию hwnd с формулой: GetLayoutObjectAttribute ( «hwnd»; «content» )
  3. в скрипт открытия конкретного окна помещаем в конце команду:
  4. Set WebViewer (“hwnd”; Go to URL […])
  5. где урл задается формулой: «data:text/html, »  & GetAsNumber(Get(CurrentTimestamp))]
  6.  Нажатие кнопки выполняет, в том числе, команду:
Set Variable[$$ButtonPressed[hwnd]; “A”]

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

В этом кейсе, работая в разных окнах, мы будем использовать глобальные переменные или глобальные поля с репетициями, записывать и брать значения из конкретных репетиций. Номер репетиции определяется по нашему идентификатору окна HWND (custom function)

Кейс 2.

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

Решение: заменим глобальное поле, значение которого мы хотели бы менять индивидуально в каждом окне, на калькулируемое не хранимое поле того же типа.

Калькуляция следующая: GetLayoutObjectAttribute ( «Object1»; «content» )

Object1 в данном случае – это имя вебвьюера. Управляя его контентом, мы изменяем значение калькулируемого поля. В разных окнах значение будет различным, и видимый результат тоже будет разным.

Для управления содержимым вебвьюера используем команду: Set Web Viewer (“Object1”; Go to URL […]), где урл задается как «data:text/html, »  & “Any Value”

Излишне говорить, что как полей, так и веб-вьюеров может быть несколько

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

67 − = 66