title: Phi::Menu
author: YOSHIDA Kazuhiro
mailto: moriq@moriq.com

1. Phi::Menu

1.1. properties

: auto_hotkeys : Fixnum
  メニュー項目のアクセラレータキーを自動的にリセットできるようにするかどうか

  %c:auto_hotkeys% プロパティを設定すると，メニュー内の項目のアクセラレータキーがリセットされているかどうかを必要に応じて Delphi が自動的に確認するように指定できます。これによって，各メニュー項目に 1 つのアクセラレータキーが存在し，しかも複数の項目が同じアクセラレータキーを持つことがなくなります。この結果，実行時に動的に追加された各メニュー項目は，衝突の発生しないアクセラレータキーを持てるようになります。 Delphi は，アクセラレータキーを調整するときに既存のアクセラレータキーマップをすべて保持しようとしますが，各項目に固有のアクセラレータを持たせるために，キーマップの一部が変更されることもあります。

  %c:auto_hotkeys% プロパティが MA_AUTOMATIC の場合，メニューを表示する前に， Delphi はアクセラレータキーマップを確認および調整します。

  %c:auto_hotkeys% プロパティが MA_MANUAL の場合， Delphi は，最上位レベルのメニュー項目は変更しませんが，サブメニューの親に当たるメニュー項目の %c:auto_hotkeys% プロパティの設定によっては，サブメニューのアクセラレータキーを調整します。

  %c:auto_hotkeys% プロパティが MA_MANUAL の場合，アプリケーションは， Items プロパティの RethinkHotkeys メソッドを呼び出してメニュー項目を調整できます。 %c:auto_hotkeys% プロパティは，この調整が自動的に行なわれるようにするかどうかを制御するだけのものです。

  : 注意
    メニューの %c:auto_hotkeys% プロパティは，そのメニューの Items プロパティが実装されている TMenuItems オブジェクトの %c:auto_hotkeys% プロパティに関連付けられています。したがって，一方を設定すると，自動的にもう一方に反映されます。

: auto_line_reduction : Fixnum
  重複する分割線をメニューから自動的に削除するかどうか

  %c:auto_line_reduction% を設定すると，メニューが分割線上で開始または終了していないこと，および 2 本の分割線が並んで表示されていないことを Delphi が自動的に確認するように指定できます。この結果，実行時に動的に作成したメニューから不要な分割線がなくなります。

  : MA_AUTOMATIC
    メニューを表示する前に， Delphi は不必要な分割線を削除します。

  : MA_MANUAL
    Delphi は，最上位レベルのメニュー項目から分割線を削除しませんが，サブメニューの親に当たるメニュー項目の %c:auto_line_reduction% の設定によっては，不必要な分割線をサブメニューから削除します。

    アプリケーションは #items の Phi::MenuItem#rethink_lines を呼び出すことによって不必要な分割線をさらに削除できます。 %c:auto_line_reduction% は単に，この調整が自動的に行なわれるようにするかどうかを指定します。

  : 注意
    メニューの %c:auto_line_reduction% は，そのメニューの #items が持つ Phi::MenuItem#auto_line_reduction に関連付けられています。一方を設定すると，自動的にもう一方に反映されます。

: images : Phi::ImageList
  個々のメニュー項目の横に表示されるイメージのリスト

  個々のメニュー項目は， Phi::MenuItem#image_index を設定して，リストのどのイメージを表示するか示します。

  : 参考
    アプリケーションが Phi::ActionList# を使う場合，この property は Phi::ActionList#images の値になります。このため，同じ処理を行う Phi::MenuItem# と Phi::ToolButton# とに，同じ image を表示することができます。

: owner_draw : Boolean
  メニュー項目がアプリケーションによって描画されるかどうか

  : true
    #on_draw_item でアプリケーションがメニュー項目を描画する。

    メニュー項目は，画面への描画が必要なときに #on_measure_item および #on_draw_item を呼び出します。

  : false (default)
    caption を表示します。 #images と #image_index が設定されている場合，左側に image を表示します。

  owner_draw menu は，項目の視覚化に効果があります。例えば，色を選択するメニューで，色の名前ではなく，指定した色で描画される四角形を表示できます。

1.1.1. BiDi 関連

: bi_di_mode : Fixnum ( BiDiMode )
  中東のロケールでのメニューのレイアウト

  : bdLeftToRight
    読み出し順序は左から右。アラインメントは変更されない。垂直スクロールバーはコントロールの右端に配置される
  : bdRightToLeft
    読み出し順序は右から左。アラインメントは変更される。垂直スクロールバーはコントロールの左端に配置される
  : bdRightToLeftNoAlign
    読み出し順序は右から左。アラインメントは変更されない。垂直スクロールバーはコントロールの左端に配置される
  : bdRightToLeftReadingOnly
    読み出し順序は右から左。アラインメントとスクロールバーは変更されない

  : 注意
    日本語 Windows95/98/NT4 では指定しても意味を持ちません。

: parent_bi_di_mode : Boolean = true
  #bi_di_mode が，メニューを使用するコントロールから継承されるかどうか

  : true (default)
    メニュー項目のレイアウトが関連付けられているフォームまたはコントロールの #bi_di_mode 設定に従う
  : false
    デフォルトの #bi_di_mode 設定をオーバーライドして，メニューのレイアウトを独立して制御できる

  : 注意
    日本語 Windows95/98/NT4 では指定しても意味を持ちません。

1.1. methods

: do_change(source, rebuild)
  change event を生成します。

  : source : Phi::MenuItem
    変更されたメニュー項目 ( ある場合 )

  : rebuild : Boolean
    変更によってメニューが項目を再生成する必要があるかどうか

  %c:do_change% は，メニュー項目の property が変更されたときに自動的に呼び出されます。
