金曜日, 9月 25, 2009

OS X で IronRuby その2

前回の OS X で IronRuby その1 では、Windows.Forms を表示できるまで。

さて、今回はせっかくの IronRuby なので、Windows.Forms に黒魔術をかけてみる。

System::Windows::Forms::Form には、マウスを右クリックしたときにコンテキストメニューを表示させる ContextMenuStrip というプロパティがある。通常は、このコンテキストメニューにコマンドを実行するアイテム(ToolStripMenuItem) を登録して、アイテムがクリックされたら、イベントハンドラとしてコマンド処理を実行しましょうということになる。

こんな感じ。
$ vim winform_contextmenu.rb
 1 require 'System'
 2 require 'System.Windows.Forms'
 3
 4 Form = System::Windows::Forms::Form
 5 Application = System::Windows::Forms::Application
 6 MessageBox = System::Windows::Forms::MessageBox
 7 ContextMenuStrip = System::Windows::Forms::ContextMenuStrip
 8 ToolStripMenuItem = System::Windows::Forms::ToolStripMenuItem
 9
 10 class TestForm < Form
 11   def initialize
 12     self.Text = "Hello World Form"
 13    
 14     cms = ContextMenuStrip.new
 15     item = ToolStripMenuItem.new "hello"
 16     item.click { MessageBox.show "hello" }
 17     cms.items.add item
 18     self.ContextMenuStrip = cms
 19
 20   end
 21 end
 22
 23 Application.run TestForm.new



右クリックで表示されたコンテキストメニューの ”hello" をクリックしたら、メッセージボックスが表示される。

さて、ここから黒魔術へ。

まずは、コンテキストメニューを動的に変更するために、アイテムの登録方法を変えてみる。お試しとして、カレントディレクトリのファイル名を列挙して、そのファイル名をアイテム名として表示する。


$ vim winform_blackmagic.rb
 1     cms = ContextMenuStrip.new
 2     cms.opening do
 3       cms.items.clear
 4       Dir.glob("hoge_*.rb").each do |file|
 5         item = ToolStripMenuItem.new "#{file}"
 6         cms.items.add item
 7       end
 8     end
 9     self.ContextMenuStrip = cms

次のように空ファイルを作って
$ touch hoge_{1,2,3,4,5}.rb
 右クリックをすると、コンテキストメニューが表示される。



hoge_*.rb ファイルを一部削除すれば、右クリックのたびに、コンテキストメニューアイテムは減るし、追加すれば増える。

さて、次は黒魔術を実行できるように準備。hoge_*.rb は格好わるいので、わかりやすくするために、eval_*.rb に変えて、その名の通り、ファイルを読み込んで eval するイベントハンドラを登録する。


$ vim winform_blackmagic.rb
 1     cms = ContextMenuStrip.new
 2     cms.opening do
 3       cms.items.clear
 4       Dir.glob("eval_*.rb").each do |file|
 5         item = ToolStripMenuItem.new "#{file}"
 6         item.click do
 7           begin
 8             eval File.open(file) {|f| f.read}
 9           rescue Exception => e
 10             MessageBox.show e
 11           end
 12         end
 13         cms.items.add item
 14       end
 15     end
 16     self.ContextMenuStrip = cms

あとは、黒魔術の呪文ファイル(eval_*.rb)をそれぞれ用意するだけ。
試しに、 2つのファイルを用意してみた。

$ vim eval_msg.rb
 1 MessageBox.show "hello"

$ vim eval_add_button.rb
  1 self.text = "Hacked Form"
  2 @button = System::Windows::Forms::Button.new
  3 @button.text = "Hacked Button"
  4 @button.click { MessageBox.show "Hacked!!" }
  5 self.controls.add @button



eval_msg.rb を選択すると、メッセージダイアログが表示されて、eval_add_button.rb を選択すると、Form のタイトルがハックされて、ハックボタンが追加される。

これぞ IronRuby のスクリプトパワー。後付けで簡単にサクサクWindows.Formを拡張できる。

次回は、インタラクティブな Windows.Form 操作に挑戦してみようと考え中。

0 件のコメント: