簡易ワークスペースを作る
やっぱり新しいバージョンのSeaSideが使えるsqueak版に乗り換え
80番起動
一旦停止させて80番で再起動
KomSeasideJ stop. KomSeasideJ startOn: 80.
今回のコード
formを作ろう
http://d.hatena.ne.jp/minekoa/20061002/1159813201
目的そのままなので、ここに載っているサンプルを利用させていただくことにする。
WAComponent subclass: #WebWorkspace instanceVariableNames: 'values' classVariableNames: '' poolDictionaries: '' category: 'MySeasideTutorial' initialize values := '' renderContentOn: html html form: [html textAreaWithValue: values asString callback: [:v | values := v]. html break. html submitButtonWithAction: [values := Compiler evaluate: values ] text: 'do it']
エラー
実際に動かしてみるとこんなエラーが出る。
MessageNotUnderstood: WARenderCanvas>>textAreaWithValue:callback:
以下試行錯誤。
ウェブブラウザのDebugのリンクを押すと、Squeak側でデバッガが起動。
デバッガを1段階戻してrenderContentOn:の画面にする。
デバッガでhtmlオブジェクトを選択すると中身は、WARenderCanvasのインスタンスであることがわかる。
そこで右クリックしてbrowse hierarchyを見ると、ProtoObject→Object→WACanvas→WAHtmlCanvas→WARenderCanvsとなっていることがわかる。
一方、Imprementors ofで、textAreaWithValue:callback:を探すと、WAHtmlRendrerクラスのみにメソッドがあることがわかる。
hierarchyボタンを押すと、ProtoObject→Object→WAAbstractHtmlBuilder→WAHtmlRendererとなっている。
別の階層ツリーになってるので、確かにこれだとメソッドが見つからないはずだ。
解決策
WAComponent>>rendererClassをオーバーライド
・WAHtmlRendererを使うこともできるがレガシー扱い
・WARenderCanvasのほうが綺麗に書ける。2.7からデフォルト
という情報により、以下のメソッドを追加したら動いた。
rendererClass ^WAHtmlRenderer
が、レガシー扱いか。
WARenderCanvasの方に同等の機能できれいに書けるメソッドがあるのかな?