Почему я получаю ошибку с окном показа в Rebol / Red?

Когда я нажимаю кнопку "Обновить", я получаю сообщение об ошибке

v: [field1 "to refresh" field2 "to refresh" 
button "refresh" [show v]]
view v

Как можно обновить v?

Обновление: у меня нет ошибки, но она не обновляется:

    test: [
      ["a1" "b1"]
      ["a2" "b2"]  
    ]

    i: 1
    v: layout compose [
      field data test/:i/1 field data test/:i/2 button "refresh" [i: i + 1 show v]
    ]
    view v

person user310291    schedule 18.12.2017    source источник
comment
Можете ли вы показать, чего вы ожидаете от сценария? Вы просто подсчитываете значение, на которое указывает i. Это полностью не зависит от вашего макета.   -  person sqlab    schedule 19.12.2017


Ответы (2)


Шоу ожидает лица, а не блока. Вы, вероятно, хотите что-то вместе

  v: layout [
     f1: field "to refresh" 
     f2: field "to refresh" 
     button "refresh" [f1/text: f2/text show v ]
  ]

Чтобы увидеть изменение, вы должны ввести что-нибудь во второе поле ввода, прежде чем нажимать кнопку.

Чтобы что-то (с пользой) работало с вашим обновлением, вы можете использовать

i: 1
sw: true
v: layout compose [
    f1: field data test/:i/1 
    f2: field data test/:i/2 
    button "refresh" [
        i: pick [1 2] sw: not sw
        f1/text: test/:i/1
        f2/text: test/:i/2
        show v
    ]
]

show снова не загружает блок определения лица, но red-gui-system docs, например

«Red / View будет обновлять лица и графические объекты в реальном времени по мере изменения их свойств. Это поведение по умолчанию, но его можно отключить, когда желателен полный контроль над обновлениями экрана. Это достигается за счет:

system/view/auto-sync?: off

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

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

 test: [
  ["a1" "b1"]
  ["a2" "b2"]  
]
i: 1
sw: true

vvw: layout v:  [
  field data test/:i/1 
  field data test/:i/2 
  button "refresh" [
      i: pick [1 2] sw: not sw
      unview vvw
      view v
  ]
]
view vvw
person sqlab    schedule 18.12.2017
comment
Спасибо, я обновил свой код, ошибок больше нет, но он не обновляется - person user310291; 19.12.2017
comment
Это действительно обновляет. Содержимое первого поля f1 обновляется до содержимого второго поля f2. Но, конечно, вы должны сначала изменить содержимое второго поля, чтобы увидеть изменение. Иначе всегда будет так. - person sqlab; 19.12.2017
comment
вы помещаете f1 / text в кнопку обновления. Это не требуется, поскольку в макете уже есть f1: field data test /: i / 1, поэтому show должно перезагрузить v, но это не то, что я имею в виду под обновлением, как если бы v был загружен первый раз. - person user310291; 19.12.2017
comment
show не загружает блок определения лица снова, а просто запускает обновления изменений в случае, если синхронизация отключена - person sqlab; 19.12.2017
comment
sqlab, поэтому я понимаю, что нет функции, которая могла бы обновляться. - person user310291; 19.12.2017
comment
Я столкнулся с аналогичной проблемой обновления, face/text: "" было единственным решением. Это как-то заставляет лицо освежиться. - person endo64; 21.12.2017

Не уверен, что вы имеете в виду под «обновлением», но графический интерфейс Red реактивен, вам не нужно явно указывать ему обновление.

Если вы просто хотите обновить текстовые данные (увеличить их значение) - вот небольшой рабочий пример:

view [f: field "42" button "increment" [f/data: f/data + 1]]

То есть f назначается только что созданному field. При нажатии кнопки - получает новое значение, обращаясь к своему data члену.

person Eran W    schedule 15.01.2018