永井@知能.九工大です. From: Hidetoshi NAGAI <nagai / ai.kyutech.ac.jp> Subject: [ruby-dev:38340] Re: [1.8.7][1.9.1][tk] 自前実装の拡張 widget を使いたい場合 Date: Mon, 27 Apr 2009 12:04:48 +0900 Message-ID: <20090427.120447.74747064.nagai / ai.kyutech.ac.jp> > 両方を殺さずに何とかできそうな対処案を思い付きました. > ちょっと今は本業の方が忙しいのですぐとはいかないかもしれませんが, > もう少しつめてみて,仕上りましたら本 ML で連絡します. > もし良かったら,その際にテストしていただけますと助かります. 長らく放置状態で申し訳ありませんでしたが, 近い内に仕上げて commit できそうです. 方針を簡単に説明しておきますと,以下のようになります. まず ・widget_set と toplevel 名の symbol とを管理する TABLE[set][sym] ・toplevel の alias を定義するモジュール ALIASES ・toplevel の alias (sym) を管理する OWNER[sym] というようなものを用意しておき, ALIASES を Oject クラスに Mix-in します. 操作時の条件は少しややこしいのですが, 必要に応じて Object クラス上にも ALIASES と同じものを定義します. 例えば TkButton(Tk::Button) と TkCombobox(Ttk::Combobox) において ALIASES Object ---------------------------------------------------- TkButton(Tk::Button) <- TkButton(Tk::Button) TkCombobox(Ttk::Combobox) <- 未定義 というような状況になるわけです. これにより,TkButton, TkCombobox 共に見えつつも TkCombobox については独自クラスを定義することが可能です. その場合, ALIASES Object ---------------------------------------------------- TkButton(Tk::Button) <- TkButton(Tk::Button) TkCombobox(Ttk::Combobox) TkCombobox(独自定義) となります. もし TkCombobox に独自クラスを定義せずに TkCombobox.new などと TkCombobox(Ttk::Combobox) を参照した場合は ALIASES Object ---------------------------------------------------- TkButton(Tk::Button) <- TkButton(Tk::Button) TkCombobox(Ttk::Combobox) <- TkCombobox(Ttk::Combobox) となります. 唯一(?)の問題は TkCombobox が Object クラス上で未定義の状態で TkCombobox に機能追加しようとして class TkCombobox とした場合です. この場合,新しいクラスが定義されてしまい,期待通りにはなりません. ですが,Ttk::Combobox を直接に参照した場合や 先に default_widget_set を :Ttk に切替えた場合には Object クラスへの定義を行うのでこの問題は生じませんし, 明示的に現在の default_widget_set の要素とするように宣言することで Object クラスへ定義させることも可能ですので 許容できるレベルではないかと思います. -- 永井 秀利 (nagai / ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門