Create  Edit  Diff  Phillro Industries  Index  Search  Changes  History  Source  RSS  Note  wikifarm  Login

tut-tut_menu

Author: NISHIO Mizuho

メニュー

その1(メニュー)

$(Apollo)/sample/tutorial/menu1.rb

   1|require 'phi'
   2|require 'dialogs'
   3|
   4|form = Phi::Form.new(:form1, 'formです')
   5|button = Phi::Button.new(form, :button1, 'ボタンです')
   6|
   7|$flag = true
   8|
   9|Phi::new_menu(form, :menu1, [
  10|  menu_file = Phi::new_item('ファイル(&F)', '', :menu_file1),
  11|  menu_edit = Phi::new_item('編集(&E)', '', :menu_edit1),
  12|  menu_help = Phi::new_item('ヘルプ(&H)', 'Ctrl+H', :menu_help1),
  13|  ])
  14|
  15|button.on_click = proc do
  16|  if $flag 
  17|    $flag = false
  18|    form.menu_file1.add( Phi::new_item("閉じる(&C)", '', :menu_close) )
  19|    menu_edit.add( Phi::new_item("コピー(&C)", '', :menu_copy) )
  20|  end
  21|end
  22|
  23|menu_help.on_click = proc do
  24|  Phi::message_dlg('ヘルプはありません。', Phi::MT_ERROR, [Phi::MB_OK], 0)  
  25|end
  26|
  27|form.show
  28|Phi.mainloop

このスクリプトを実行すると、このようなウィンドウがあらわれます。

menu1.gif

解説

起動時はメニューに「ファイル」「編集」「ヘルプ」の三つがあります。ボタンを押すことで「ファイル」には「閉じる」が、「編集」には「コピー」のメニューが追加されます。

7行目は「閉じる」と「コピー」のメニューを一度だけ追加するためのフラッグを設定しています。他にも方法はあるのですが、今回はad-hoc(場当たり的のこと 別名バータリー的(笑))にこの方法を取ることにします。

9〜13行で起動時に現れるメニューを生成しています。 Phi::new_menu は引数を三つ取ります。第1引数は親になるコントロール、第2引数は以前説明したSymbolのオブジェクト、第3引数は Phi::MenuItem のオブジェクトの集まり( Array のオブジェクト)になります。第3引数で使われる Phi::MenuItem のオブジェクトは Phi::new_item で生成することができます。

10〜12行は Phi::new_item を生成し、それを変数に代入しています。一見すると、生成された Phi::MenuItem のオブジェクトが第3引数のArrayのオブジェクトの要素にならないように見えますが、Rubyだとこういう書き方をすることが可能です。

このスクリプトで頻繁に使われている Phi::new_item の引数は最大5つです。上のスクリプトでは第4・5引数を省略しています。第4・5引数を取る場合については次のサンプルスクリプトで説明するので、ここでは第1〜3引数までの説明を行います。

最初に Phi::new_item の第1引数ですが、これはメニューの文字列になります。第1引数で気を付けることは「&」の扱いです。サンプルスクリプトを実行してみればわかりますが、メニューを見ても「&」の文字は現れず、その代わりに「&」の次の文字に下線がついています。これはWindowsのアクセラレーターキーというもので、Alt + 「&」の次の文字 でメニューを操作できるようにします。例えば、上のスクリプトではフォームがアクティブな時に Alt + F を押すと「ファイル」メニューがアクティブになります。

次に第2引数はショートカットキーの文字を表します。上のスクリプトでは「ヘルプ」メニューに'Ctrl+H'というショートカットキーが割り当てられているので、Ctrl + h を押すと、「ヘルプ」メニューがアクティブになります。

第3引数は今までよく出てきているSymbolのオブジェクトです。10行目を例に取ると、 第3引数が :menu_file1 となっているので、このメニューのオブジェクトの参照は form.menu_file1 で行うことができます(18行目はその実例です)。

以上の説明で 9〜13行ではメニューに「ファイル」「編集」「ヘルプ」の三つを付けていることが分かると思います。

15〜21行はフォームのボタンが押された時のアクションです。 $flag が true の時に17〜19行が実行されます。一度この部分が実行されると、 17行で $flag に false が代入されるので、17〜19行は2度と実行されません。18行は form.menu_file1.add( Phi::MenuItem#add )で「ファイル」のメニューに「閉じる」のメニューを追加していて、19行はmenu_edit.add( Phi::MenuItem#add )で「編集」のメニューに「コピー」のメニューを追加しています。

Phi::MenuItem#add は複数の Phi::MenuItem のオブジェクトを引数にとり、引数の Phi::MenuItem のオブジェクトが表すメニューを自分のメニューの下に作ります。その2のスクリプトにも例があるので、そちらの方も見てください。

23〜25行は「ヘルプ」のメニューが押されたときのイベントを設定しています。ここではエラーメッセージを表示します。

クラスやメソッド

Phi

  • Phi::new_menu
  • Phi::new_item

Phi::MenuItem

その2(色々なメニュー)

$(Apollo)/sample/tutorial/menu2.rb

   1|require 'phi'
   2|require 'dialogs'
   3|
   4|def ok_msg(msg)
   5|  Phi::message_dlg(msg, Phi::MT_INFORMATION, [Phi::MB_OK], 0)  
   6|end
   7|
   8|form = Phi::Form.new(:form1, 'formです')
   9|form.height = 95
  10|button = Phi::Button.new(form, :button1, 'ボタン')
  11|label = Phi::Label.new(form, :label1, '')
  12|button.align = Phi::AL_TOP
  13|label.align = Phi::AL_CLIENT
  14|label.color = Phi::CL_WHITE
  15|
  16|Phi::new_menu(form, :menu1, [
  17|  menu_file = Phi::new_item('ファイル(&F)', '', :menu_file1).add(
  18|    Phi::new_sub_menu('サブ', :menu_sub1, [
  19|        Phi::new_item("チェック1", '', :menu_check1, true),
  20|        Phi::new_line,
  21|        Phi::new_item("ラジオ1", '', :menu_radio1, false),
  22|        Phi::new_item("ラジオ2", '', :menu_radio2, false),
  23|      ]),
  24|    Phi::new_line,
  25|    Phi::new_item("閉じる(&C)", '', :menu_close1)
  26|  ),
  27|  menu_edit = Phi::new_item('編集(&E)', '', :menu_edit1).add(
  28|    Phi::new_item('切り取り(&T)', 'Ctrl+X', :menu_cut1),
  29|    Phi::new_item('コピー(&C)', 'Ctrl+C', :menu_copy1),
  30|    Phi::new_item('貼りつけ(&P)', 'Ctrl+V', :menu_paste1)
  31|  ),
  32|  menu_help = Phi::new_item('ヘルプ(&H)', 'Ctrl+H', :menu_help1).add(
  33|    Phi::new_item('このソフトについて(&A)', '', :menu_about1, false, false)
  34|  )
  35|  ])
  36|form.menu_attr_flatten
  37|
  38|form.menu_radio1.radio_item = true
  39|form.menu_radio2.radio_item = true
  40|form.menu_radio1.group_index = 0
  41|form.menu_radio2.group_index = 0  
  42|form.menu_radio1.checked = true
  43|
  44|
  45|# event
  46|form.menu_radio1.on_click = proc do
  47|  unless form.menu_radio1.checked?
  48|    form.menu_radio1.checked = true
  49|  end
  50|end
  51|
  52|form.menu_radio2.on_click = proc do
  53|  unless form.menu_radio2.checked?
  54|    form.menu_radio2.checked = true
  55|  end
  56|end
  57|
  58|form.menu_check1.on_click = proc do
  59|  if form.menu_check1.checked?
  60|    form.menu_check1.checked = false
  61|  else
  62|    form.menu_check1.checked = true
  63|  end
  64|end
  65|
  66|form.menu_close1.on_click = proc do
  67|  exit  
  68|end
  69|
  70|form.menu_copy1.on_click = proc do
  71|  ok_msg('コピー')  
  72|end
  73|
  74|button.on_click = proc do
  75|  if form.menu_check1.checked?
  76|    if form.menu_radio1.checked?
  77|      label.caption = 'チェック1とラジオ1がチェックされています。'
  78|    elsif form.menu_radio2.checked?
  79|      label.caption = 'チェック1とラジオ2がチェックされています。'
  80|    else
  81|      ok_msg('BUG')
  82|    end
  83|  else
  84|    label.caption = 'チェック1がチェックされていません。'
  85|  end
  86|end
  87|
  88|form.show
  89|Phi.mainloop

このスクリプトを実行すると、このようなウィンドウがあらわれます。

menu2.gif

解説

15行までは分かると思います。

16〜35行はメニューを生成しています。その1では Phi::new_menu の第3引数でメニューの先頭部分だけを生成しましたが、今回はすべてのメニューを一括して生成しています。

説明が前後しますが、先に20行の Phi::new_line を説明します。 Phi::new_line は引数を取らないメソッドで、メニューの区切り線を表わす Phi::MenuItem のオブジェクトを生成します。

元に戻って17行では「ファイル」メニューを生成し、生成されたメニューのadd( Phi::MenuItem#add )を使って、「ファイル」メニューの下にいくつかのメニューを生成します。この部分では Phi::new_item のすぐ後に add がきていますが、これは Ruby のメソッドチェーンというものです。ruby-listのMLの過去ログを見れば、面白い例がいくつもあるので、詳しくはそちらを参照してほしいのですが、一例をあげますと、

#/usr/bin/ruby

print File.readlines('hoge.txt').join(';').gsub('hoge','goo')

のようなものがあります。これがどういうことをするのかは一度調べてみてください。

Phi::MenuItem#add は複数の引数を取りますが、17行では Phi::new_sub_menu、Phi::new_line、Phi::new_item で生成される三つの Phi::MenuItem のオブジェクトが Phi::MenuItem#add の引数になります。これによってウィンドウ上では「サブ」、区切り線、「閉じる」の三つのメニューが「ファイル」メニューの下に生成されることになります。

18〜24行で「サブ」の下のメニューが生成されます。生成されるメニューは「チェック1」、「ラジオ1」、区切り線、「ラジオ2」の4つです。

18行目の Phi::new_sub_menu は4つの引数を取りますが、ここでは第4引数が省略されています。 Phi::new_sub_menu の第1引数はメニューの文字列を、第2引数は今まで紹介してきたSymbolのオブジェクトを、第3引数は サブメニューとなる Phi::MenuItem のオブジェクトの組み合わせ( Array のオブジェクト )を取ります。第4引数は Phi::new_item の第5引数と同じものです。その詳細は Phi::new_item の説明を読んでください(スクリプトの33行目の説明です)。

19行は Phi::new_item によって「チェック1」メニューを作っています。ここでは Phi::new_item の第4引数が true になっていることが今までと少し違います。Phi::new_item の第4引数はメニューの横にチェックマークをつけるかどうかを決めます。第4引数が省略されている場合は第4引数をfalseにしたとみなされ、チェックマークはつきません。19行では Phi::new_item の第4引数を true にしているので、「チェック1」メニューにチェックマークがつきます。

33行以外のメニュー生成の部分についてはその1の説明やその2のこれまでの説明で分かると思うので、省略します。

33行目では Phi::new_item に第5引数がありますが、これは数当てゲームで紹介した Phi::Button#enabled と同じような設定をしていて、第5引数をfalseにすることでメニュー項目は淡色表示になり,ユーザーはその項目を選択できなくなります。第5引数が省略された場合、第5引数は true として扱われるので、明示的にfalseにしない限りメニューが使えなくなることはありません。

36行目の form.menu_attr_flatten は、入れ子になったメニュー項目へのアクセスを簡単にするためのメソッドです。これを使わずに menu_radio1 にアクセスしようとすると form.menu_file.menu_sub1.menu_radio1 と書かなくてはいけません。--moriq

38〜42行はメニューの一部をラジオボタンと同じように使うための設定です。

38と39行で Phi::MenuItem#radio_item に true を代入してメニューをラジオボタンのようにし、40と41行で Phi::MenuItem#group_index に 0 を代入して二つのメニューをグループ化します。最後に42行で起動時に「ラジオ1」のメニューにチェックが入るようにします。

45〜85行はイベント処理ですが、特に難しいところはないと思います。

クラスやメソッド

Phi

  • Phi::new_line
  • Phi::new_sub_menu

Phi::MenuItem

Last modified:2004/11/26 11:01:45
Keyword(s):
References:[tut-tut_index]