MVC を利用して、次のようなツールを作成してみましょう。
|
サンプルプログラムのソースをファイルインします。
| aPoint | aPoint := -100 @ -50. ((OrderedCollection new) add: 'Exercise-Display.st' -> #('Foo-Display' #{FooDisplayModel}); add: 'Exercise-Clock.st' -> #('Foo-Clock' #{FooClockModel}); add: 'Exercise-Freehand.st' -> #('Foo-Freehand' #{FooFreehandModel}); yourself) do: [:each | | aString aURL aFilename aBrowser aWindow aRectangle aPackage aNavigator aClass aProtocol aSelector | aString := 'http://www.cc.kyoto-su.ac.jp/~atsushi/Programs/VisualWorks/Exercises/Exercise_MVC/' , each key. aURL := JunURL named: aString. aURL exists ifFalse: [^nil]. aFilename := Filename defaultDirectory construct: aURL asURI tail. aURL downloadTo: aFilename. aFilename exists ifFalse: [^nil]. aFilename fileIn. aBrowser := #{Refactory.Browser.RefactoringBrowser} value open. aWindow := aBrowser builder ifNil: [^nil] ifNotNil: [:aBuilder | aBuilder window]. aRectangle := JunGeometry alignedBoxWithScreenCenter: 800 @ 600. aWindow displayBox: (aRectangle translatedBy: aPoint). aPackage := Store.Registry packageNamed: each value first. aPackage ifNil: [^nil]. aNavigator := aBrowser navigator. aClass := each value last value class. aProtocol := #examples. aSelector := #example1. (aNavigator state) pundles: (Array with: aPackage); classesAndNameSpaces: (Array with: aClass); protocols: (Array with: aProtocol); selectors: (Array with: aSelector). aNavigator setState: aNavigator state; changed. aPoint := aPoint translatedBy: 100 @ 50]
|
プログラムは、一部虫食いになっています。
スーパクラスのMVCの機能も参考にして、それぞれのツールを完成させましょう。
各ツールのスーパークラスは以下のようになっています。
|
JunModel example1
|
ウィンドウを開いた直後や、再描画するような操作(最小化して元に戻すなど)を行うと、トランスクリプトに「view received a message 'displayOn: graphicsContext' at」に続いて、現在時間が出力されます。
ウィンドウの中をドラッグすると、トランスクリプトに「red button pressed」に続いて、マウスの座標と現在時間が出力されます。
選択した画像ファイルや、スクリーンから切り取ったものを、ウィンドウ内にきちんと表示できるようにしましょう。
|
FooDisplayModel example1
|
アナログ時計とデジタル時計を正常に動作させましょう。
|
FooClockModel example1
|
アナログ時計は秒針を表示してください。
FooClockModel example2
|
デジタル時計は中央に現在時間を表示してください。
FooClockModel example3
|
マウスでドラッグした軌跡を表示できるようにしましょう。
|
FooFreehandModel example1
|
いろいろな色を使って、素敵なイラストを描いてください。
|
オプション問題:塗りつぶし
塗りつぶしができるようにしてみましょう。(難易度:高)
|
歴代の学生さんたちが描いてくれたものを集めました。
|
青木塾で行っている「MyFirstMVC:初めてのアプリケーション」を以下に置きますので参考にしてください。