method_missing
上からたどらないでも良いようにしてみた。
class Phi::Form def method_missing (name, *args) if @all_controls and result = @all_controls[name] result else update_all_controls @all_controls[name] or super end end def update_all_controls @all_controls = Hash.new find = proc do |c| return unless c.respond_to?(:controls) c.controls.each do |control| @all_controls[control.name.to_sym] = control find[control] end end find[self] end end
Delphiで作る限り同一フォーム内で名前が被ることはない。
ので、これで良いということにする。
method_missing を使わずに、はじめに全コントロールのメソッドを定義しようかと思ったけれど、動的にコントロールを追加する可能性があるのでやめた。
ただ、これもコントロールを削除した場合に困る。