2013-03-20 32 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.