[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 メーリングリストの案内