さて、今回はせっかくの 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
さて、ここから黒魔術へ。
まずは、コンテキストメニューを動的に変更するために、アイテムの登録方法を変えてみる。お試しとして、カレントディレクトリのファイル名を列挙して、そのファイル名をアイテム名として表示する。
$ 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 操作に挑戦してみようと考え中。