[SML 7520] Cincom Smalltalk Daily: 11/1/06に関して

Akinori Sugitani asugitan @ kh.rim.or.jp
2009年 4月 24日 (金) 11:17:49 JST


はじめまして。京都のSmalltalk勉強会に参加させて戴いている杉谷と申します。
勉強会の経験でライブ学習のすばらしさを知り日頃はJames RobertsonさんのSmalltalk 
Dailyのスクリーンキャストで
自習しております。
http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=smalltalk_daily

今回は"Cincom Smalltalk Daily: 11/1/06"に関する投稿です。
(Connectivity→Working with Databases→Creating a UI for the database 
 code)

その前の段階"Mapping to a domain object"までは上手く行っていましたが、
GUIを立ち上げて"Do Query"ボタンを押すと
"Unhandled exception: Message not understod: #list:"
というエラーが出ていました。スクリーンキャストを何度もみなおしましたが、
コードの入力間違いはなさそうでした。

GUIがinstallされているクラスは

Smalltalk defineClass: #EmployeeUI
 superclass: #{UI.ApplicationModel}
 indexedType: #none
 private: false
 instanceVariableNames: 'employeeList employees queryExecutor '
 classInstanceVariableNames: ''
 imports: ''
 category: 'UIApplications-New'

で、キャンバス上のDataSet Widgetが"employees "
DataSetの各列(empno, empname, job, hiredate)に対するアスペクトがそれぞれ
"employeeList empno"等のように設定されています。

"初期化メソッド"
initialize

 self queryExecutor: QueryEx??

QueryExの後ろがダイアログで隠れて見えないので、よく解らないまま
self queryExecutor: QueryExecutor new
としました。

"Do Query"アクションボタンのについては、
doQuery
 "This stub method was generated by UIDefiner"

 | emps |
 emps := self queryExecutor executeQuery: 'select * from emp'.
 self employeeList list: emps

エラー:"Unhandled exception: Message not understod: #list:"
はここで生じているようです。

Robertsonさんは"employeeListはSelectionInListオブジェクト"と言っているように聞こえるのですが
(英語聞き取りには自信がありません)

employeeList
 "This method was generated by UIDefiner...."

 ^employeeList isNil ifTrue: [employeeList := nil asValue]
  ifFalse: [employeeList]

employees
 "This method was generated by UIDefiner...."
 ^employees isNil ifTrue:
   [employees := SelectionInList new.
   employees selectionIndexHolder compute:
     [:v | self employeeList value: employees selection].
   employees]
  ifFalse: [employees]

となっていて、"employeeList"はListらしくありません。
そこで、
"self employeeList list: emps" → "self employees list: emps"
に替えてみたところ、エラーにならず、empsの内容がDataSetに表示されました。
1月頃からずっと悩んでいましたので、感動しましたが、スクリーンキャストのコードが間違っていたということになり、
実際に操作しながら「撮影」されたもので、そのようなことが起りうるのか不思議です。 

Smalltalkに慣れた人にとっては、悩むようなことではないのかもしれませんが、
初心者の私にとっては、かなりの「難問」でした。


あと、動作し始めてから
initialize

 self queryExecutor: QueryExecutor new
を
 self queryExecutor: QueryExecutor
に替えてみましたが、どちらも動作しました。これは本来どう書くべきなのでしょうか?

当初は"Unhandled exception: Message not understod: #list:"の出る原因がどうしても解決できず、このMLで質問しようかと思い、準備をしていたのですが、とりあえず解決しました。同じ問題で悩んでいる方の参考になれば幸いです。

---------------------
杉谷明則



SML メーリングリストの案内