Как связать 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.