Как связать LabelMorph/TextMorph с переменной, чтобы Morph отражал изменения переменной?

  • У меня есть объект с переменной, содержащей строку.
  • У меня есть окно, содержащее LabelMorph/TextMorph (или какой-то другой Morph, который отображает текст?).

Как связать LabelMorph / TextMorph с переменной, чтобы метка обновлялась при изменении строки в переменной?

  • классический Smalltalk-80 механизм зависимости / изменения / обновления?
  • Рамки объявлений Pharo?
  • что-то другое??

Как бы я это сделал? Какой Morph я должен использовать?

3 ответа

Решение

Зависит от того, чего вы хотите достичь. Возможно, вы захотите взглянуть на способ сделать это с Glamour на текущем изображении Moose. В рабочей области сделай это:

GLMBasicExamples new magritte openOn: GLMMagrittePersonExample sampleData 

Это показывает, как работать с объявлениями при сохранении. Предыдущие примеры - лучший способ начать понимать, как работать с Glamour (и из-за способа сборки examplebrowser пример Magritte не обновляет список, когда он вложен):

GLMBasicExamples open

У этого есть несколько других примеров, которые обновляют при изменении.

Проще всего использовать обновление String morph:

UpdatingStringMorph on: self selector: #myLabel

Это отправит #myLabel (или любое другое сообщение) себе (или любому другому объекту) и отобразит его.

Это решение, предоставленное Бенджамином Ван Райсегемом в рассылке Pharo:

Для такой ситуации мое решение - использовать ValueHolder. Вместо того, чтобы хранить вашу строку непосредственно в переменной экземпляра, сохраните ее в ValueHolder.

Я попробовал это в рабочей области:

|string label|

string := 'Wait till i change..' asValueHolder.
label := LabelMorph contents: string contents.
string whenChangedDo: [:newValue | label contents: newValue ].
label openInWindow.
[ 5 seconds asDelay wait. string value: 'I changed :)' ] fork. 
Другие вопросы по тегам