さっきの記事を書いた後に、もう少しIronRubyを触ってみたところ、なんかおかしい挙動がいろいろと。
当然ですが。
これ以降の内容は全部 pre alpha 1 の環境が前提になっていますので、ご注意くだされ。
とりあえず結構きついのがCLR上の列挙体が今のところ正しく取り扱えないので、WindowsFormのDockプロパティなどが設定できないってこと。
その辺が問題なければさくっと書けそうなところが厳しいですね。
あと、イベント記述方法に問題があるのか、同一クラスのオブジェクトが複数ある場合、先に宣言したイベントのみが有効になっているっぽいです。回避方法がないので、どうしようもない...
ともあれ、イロイロ試してみたブラウザプログラムのソースを以下に放置しておきます(^^;
require 'System.Windows.Forms'
require 'System.Drawing'
# CLRエイリアス
Form = System::Windows::Forms::Form
Panel = System::Windows::Forms::Panel
Label = System::Windows::Forms::Label
TextBox = System::Windows::Forms::TextBox
Button = System::Windows::Forms::Button
MessageBox = System::Windows::Forms::MessageBox
MainMenu = System::Windows::Forms::MainMenu
MenuItem = System::Windows::Forms::MenuItem
Point = System::Drawing::Point
# 土台となるフォーム
browserForm = Form.new()
[browserForm].each do |f|
f.Text = 'IronRubyでブラウザを動かすにょろん'
f.Width = 800
f.Height = 600
end
# ヘッダパネル
headerPanel = Panel.new()
[headerPanel].each do |c|
# 列挙体は動かない orz
# c.Dock = System::Windows::Forms::DockStyle.Top
c.Location = Point.new(0, 0)
c.Height = 24
c.Width = 780
end
# ボディパネル
bodyPanel = Panel.new()
[bodyPanel].each do |c|
# 列挙体は動かない orz
# c.Dock = System::Windows::Forms::DockStyle.Fill
c.Location = Point.new(0, 24)
c.Height = 560
c.Width = 780
end
# アドレス入力欄
addressLabel = Label.new()
[addressLabel].each do |c|
c.Text = 'アドレス'
c.Location = Point.new(0, 0)
c.Height = 24
c.Width = 48
end
addressText = TextBox.new()
[addressText].each do |c|
c.Text = 'http://www.yahoo.co.jp/'
c.Location = Point.new(48, 0)
c.Width = 544
end
# 移動ボタン
moveButton = Button.new()
[moveButton].each do |c|
c.Text = '移動'
c.Location = Point.new(592, 0)
c.Width = 48
end
# ブラウザ
browserCtrl = System::Windows::Forms::WebBrowser.new()
[browserCtrl].each do |c|
# 列挙体は動かない orz
# c.Dock = System::Windows::Forms::DockStyle.Fill
c.Location = Point.new(0, 0)
c.Height = 456
c.Width = 640
end
# Event記述
moveButton.Click do|sender, args|
browserCtrl.Navigate(addressText.Text)
end
# Event記述
browserCtrl.Navigated do|sender, args|
addressText.Text = sender.Url.ToString
browserForm.Text = sender.DocumentTitle
end
# 列挙体問題でDockとかつかえないから
# VB2時代の悪しき伝統を泣く泣く活用
browserForm.Resize do|sender, args|
headerPanel.Width = sender.Width
bodyPanel.Width = sender.Width
bodyPanel.Height = sender.Height - headerPanel.Height
browserCtrl.Width = sender.Width - 24
browserCtrl.Height = sender.Height - (64 + headerPanel.Height)
end
headerPanel.Resize do|sender, args|
addressText.Width = sender.Width - (addressLabel.Width + moveButton.Width)
moveButton.Location = Point.new(sender.Width - moveButton.Width, 0)
end
# とりあえずメニューもやってみる
mainMenu = MainMenu.new()
menuFile = MenuItem.new()
menuFile.Name = 'menuFile'
menuFile.Text = 'ファイル(&F)'
menuQuit = MenuItem.new()
menuQuit.Name = 'menuQuit'
menuQuit.Text = '終了(&Q)'
menuFile.MenuItems.Add menuQuit
menuHelp = MenuItem.new()
menuHelp.Name = 'menuHelp'
menuHelp.Text = 'ヘルプ(&H)'
menuAbout = MenuItem.new()
menuAbout.Name = 'menuAbout'
menuAbout.Text = 'このプログラムについて(&A)'
menuHelp.MenuItems.Add menuAbout
menuAbout.Click do|sender, args|
MessageBox.Show("IronRuby Sample Script\n(C)DonaDona(KITAO Masato)")
end
# なぜか動かない!!
menuQuit.Click do|sender, args|
browserForm.Close
end
mainMenu.MenuItems.Add menuFile
mainMenu.MenuItems.Add menuHelp
browserForm.Menu = mainMenu
# コントロールを追加
cs = headerPanel.Controls
cs.Add addressLabel
cs.Add addressText
cs.Add moveButton
# コントロールを追加
bodyPanel.Controls.Add browserCtrl
# フォームにコントロールの追加
browserForm.Controls.Add headerPanel
browserForm.Controls.Add bodyPanel
browserForm.ShowDialog