2013-03-20 31 views
4
  • 我有一个包含一个字符串变量的对象。
  • 我有一个窗口包含一个LabelMorph/TextMorph(或其他一些显示文字的Morph?)。

如何将LabelMorph/TextMorph绑定到变量,以便标签在变量中的字符串更新时进行更新?如何将LabelMorph/TextMorph绑定到变量,以便Morph反映变量的变化?

  • 经典的Smalltalk-80依赖/更改/更新机制?
  • Pharo公告框架?
  • 有什么不同?

我该怎么做?我应该使用哪种Morph?

回答

1

取决于你想达到的目标。 你可能想看一下在目前的驼鹿形象中用Glamour做到这一点的方法。 在工作区,做它:

GLMBasicExamples new magritte openOn: GLMMagrittePersonExample sampleData 

这显示了如何在节省公告工作。前面的例子是一个更好的方式开始了解如何与魅力的工作(而且由于examplebrowser是建立,当它是嵌套马格利特例子不更新列表的方式):

GLMBasicExamples open 

这已其他几个更新变化的例子。

+0

谢谢你,我开始学习文档和例子。这很有趣。 – MartinW 2013-03-21 19:45:12

7

最简单的方法是使用一个更新字符串变形:

UpdatingStringMorph on: self selector: #myLabel 

这将发送#myLabel(或任何其他消息),自(或任何其它对象),并显示它。

+1

这工作得很好,我不知道它的存在。但是它使用Morph的#step方法来请求每一步的更改。你是否也知道更“观察者模式”的解决方案是什么样子? – MartinW 2013-03-21 10:16:59

+1

您可以使用任何框架,但没有什么能够胜过Morphic步进机制的简单性。这是Morphic打算如何使用的。 – 2013-03-21 13:01:48

+0

似乎,我只能接受一个答案。感觉都接受了,我投了两个答案:) – MartinW 2013-03-27 18:05:11

2

这是本杰明·范·Ryseghem上的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.