1. Phi::Action クラス

1. 使い方

--ruby
require "phi"

form = Phi::Form.new

act = Phi::Action.new
act.caption = "action!"
act.on_execute = proc{|sender,*args| form.caption = "act!! by #{sender.action_component}"}

Phi.new_menu form, :menu, [
  Phi.new_item_ex('&Test1'  , ''         , act ),
  Phi.new_item_ex('&Test2'  , ''         , :mi_test1 , [
    Phi.new_item_ex('&Test3'  , ''       , act ),
  ]),
]

button = Phi::Button.new form
button.action = act

form.show
Phi.mainloop
--

1. インスタンスメソッド

: ==                    => Kernel#==
: ===                   => Kernel#===
: =~                    => Kernel#=~
: __id__                => Kernel#__id__
: __send__              => Kernel#__send__
: _dump                 => Phi::Component#_dump

: action_component      => Phi::BasicAction#action_component

action_component プロパティは，当該アクションを実行させたクライアントコンポーネントを示します。

action_component プロパティを使うと，当該アクションを実行させたクライアントコンポーネントを識別できます。たとえば，当該アクションを呼び出したユーザーアクションを知りたい場合に，on_execute イベントハンドラから action_component プロパティを調べます。
ユーザーがクライアントコントロールをクリックすると，そのクライアントは action_component プロパティを設定してから，アクションの Execute メソッドを呼び出します。アクションは実行後，action_component プロパティを nil にリセットします。

* on_executeのsenderはActionオブジェクト自体なので、実際にアクションを起動したコンポーネントを調べるには、sender.action_component を調べなければならないという意味。

以下のプログラムでは、メニューとボタンに"action!"というキャプションが付き、実際の動作はActionオブジェクトの act.on_execute に任されます。act.on_executeのハンドラで、メニューから呼ばれたのか、ボタンから呼ばれたのかsender.action_componentを使って調べて、フォームのキャプションに表示します。

--ruby
require "phi"

form = Phi::Form.new

act = Phi::Action.new
act.caption = "action!"
act.on_execute = proc{|sender|form.caption = "act!! called by #{sender.action_component}"}

button = Phi::Button.new form
button.action = act

form.menu = Phi::MainMenu.new(form)
mi_act = Phi::MenuItem.new
mi_act.action = act
form.menu.items.add( mi_act )

form.show
Phi.mainloop
--

: auto_check
: auto_check=
: auto_check?

auto_check プロパティは，アクションの実行時に Checked プロパティが切り替わるかどうかを制御します。

property auto_check: TShortCutList;

説明

auto_check プロパティは，Checked プロパティがアクションの実行時に切り替わるようにします。これによって，アクションの Checked プロパティとクライアントの Checked プロパティ（またはそれと同等のもの）と同期の状態にすることができます。クライアントがメニュー項目の場合（つまり，Checked プロパティが必ずしも切り替わる必要がない場合），auto_check の値はメニュー項目の auto_check プロパティに渡されます。

* VCLのみ？

: caption
: caption=

caption プロパティは，クライアントコントロールおよびメニュー項目のキャプションを表します。

property caption: TCaption;

説明

caption プロパティは，アクションのキャプションが設定されている場合にその文字列を保持します。caption の値は，クライアントコントロールおよびメニュー項目に渡されます。

* いわずもがな。

: category
: category=

Category プロパティは，アクションリストでアクションが表示されるカテゴリを指定します。

property Category: String;

説明

Category プロパティは，アクションが属するグループ（カテゴリ）です。アクションリストは，アクションをカテゴリでグループ化して表示します。通常，アクションは動作および機能の類似性によってカテゴリにグループ化されます。設計時には，オブジェクトインスペクタにおいて，アクションリストからアクションを選択し，Category を選択することによって，アクションの Category プロパティを変更または設定できます。

* ということではあるが、ActionListクラスがないので意味がない。

: checked
: checked=
: checked?

アクションがメニューの二次項目以下にセットされている場合に、チェックマークが付きます。

: class                 => Kernel#class
: clone                 => Kernel#clone
: component_count       => Phi::Component#component_count
: components            => Phi::Component#components
: display               => Kernel#display
: dup                   => Kernel#dup
: enabled
: enabled=
: enabled?

enabled プロパティは，クライアントコントロールおよびメニュー項目が有効になっているかどうかを示します。

enabled プロパティは，アクションの有効/無効状態を指定します。enabled の値は，クライアントコントロールおよびメニュー項目に渡されます。

* Action#enabled の値を変更すると、アクションが設定されているボタンやメニューのキャプションの色が一斉にに変ります（有効色⇔無効色）。

次のプログラムではメニューの一時項目「Test1」と、「Test1」の下位項目「Test3」およびボタンに同一のアクションがセットされます。そして、button2 でアクションの enabled をトグルするようになっています。button2 をクリックすると、アクションがセットされたメニューやボタンの有効色が変わることが確認できます。

--ruby
require "phi"

form = Phi::Form.new

act = Phi::Action.new
act.caption = "action!"
act.on_execute = proc{|sender,*args| form.caption = "act!! by #{sender.action_component}"}

Phi.new_menu form, :menu, [
  Phi.new_item_ex('&Test1'  , ''         , act ),
  Phi.new_item_ex('&Test2'  , ''         , :mi_test1 , [
    Phi.new_item_ex('&Test3'  , ''         , act ),
  ]),
]

button = Phi::Button.new form
button.action = act

button2 = Phi::Button.new form, nil, "enable_action"
button2.on_click = proc{ act.enabled ^= true }
button2.top = button.bottom

form.show

Phi.mainloop
--

: eql?                  => Kernel#eql?
: equal?                => Kernel#equal?
: event_handle
: extend                => Phi::Persistent#extend
: freeze                => Kernel#freeze
: frozen?               => Kernel#frozen?
: group_index
: group_index=
: hash                  => Kernel#hash
: help_context
: help_context=
: help_keyword
: help_keyword=
: help_type
: help_type=
: hint
: hint=

hint プロパティは，クライアントコントロールおよびメニュー項目の Help ヒントを示します。

property hint: WideString;

説明

hint プロパティは，アクションのヒントが設定されている場合にその文字列を保持します。この値は，コントロールおよびメニュー項目に渡されます。

* のはずなのであるが……、

（１） Form#show_hint = true にしておく必要がある。
（２）ボタンでは有効だが、メニューではヒントが出てこない……。

--ruby
require "phi"

form = Phi::Form.new
form.show_hint = true         # ←（１）

act = Phi::Action.new
act.caption = "action!"
act.on_execute = proc{|sender,*args| form.caption = "act!! by #{sender.action_component}"}
act.hint = "ヒント欲しい？"   # ←

Phi.new_menu form, :menu, [
  Phi.new_item_ex('&Test1'  , ''         , act ),
  Phi.new_item_ex('&Test2'  , ''         , :mi_test1 , [
    Phi.new_item_ex('&Test3'  , ''         , act ),
  ]),
]

button = Phi::Button.new form
button.action = act

form.show
Phi.mainloop
--

: id                    => Kernel#id
: image_index
: image_index=

image_index プロパティは，クライアントコントロールおよびメニュー項目の image_index プロパティを示します。

image_index プロパティは，アクションを格納するアクションリストの images プロパティ（ Phi::ImageList クラス）に対するインデックスです。これは，このアクションを使うコントロールおよびメニュー項目と関連付けられているイメージを識別します。

* ActionListクラスがない。

: inspect               => Kernel#inspect
: instance_eval         => Kernel#instance_eval
: instance_of?          => Kernel#instance_of?
: instance_variable_get  => Kernel#instance_variable_get
: instance_variable_set  => Kernel#instance_variable_set
: instance_variables    => Kernel#instance_variables
: is_a?                 => Kernel#is_a?
: kind_of?              => Kernel#kind_of?
: method                => Kernel#method
: methods               => Kernel#methods
: methods_for_pi        => Object#methods_for_pi
: name                  => Phi::BasicAction#name
: name=                 => Phi::BasicAction#name=
: nil?                  => Kernel#nil?
: object_id             => Kernel#object_id
: on_execute
: on_execute=

アクションの内容として行うイベント。

: on_hint
: on_hint=

OnHint イベントは，クライアントコントロールまたはメニュー項目の上でマウスが停止したときに発生します。

type THintEvent = procedure (var HintStr: WideString; var CanShow: Boolean) of object;
property OnHint: THintEvent;

説明

OnHint イベントを使うと，クライアントコントロールまたはメニュー項目の上でユーザーがマウスを止めたときに表示されるデフォルトのヒントを変更することができます。OnHint イベントハンドラは，HintStr パラメータを変更して表示されるヒントを変更できます。または，アプリケーション固有の方法でヒントを表示できます。
CanShow を設定すると，イベントハンドラ終了後にデフォルトのポップアップウィンドウに，HintStr で指定したヒントが表示されるかどうかを変更することができます。

* 飛んでこないような気がする……

: on_update
: on_update=

OnUpdate イベントは，アプリケーションがアイドルのとき，またはアクションリストが更新されたときに発生します。

property OnUpdate: TNotifyEvent;

説明

OnUpdate イベントハンドラを記述すると，アプリケーションがアイドルのときに一元化されたコードを実行できます。たとえば，クライアントターゲットの有効/無効，チェック/チェック解除などの状態を取得することができます。

* 意味が分からぬ。
* 飛んでこないような気がする……

: private_methods       => Kernel#private_methods
: prop_info             => Phi::Component#prop_info
: protected_methods     => Kernel#protected_methods
: public_methods        => Kernel#public_methods
: respond_to?           => Kernel#respond_to?
: secondary_short_cuts
: secondary_short_cuts=
: send                  => Kernel#send
: short_cut
: short_cut=

short_cut プロパティは，クライアントメニュー項目の short_cut プロパティを指定します。

short_cut プロパティは，アクションのショートカットが設定されている場合にその値を保持します。この値は，クライアントメニュー項目に渡されます。

short_cut プロパティの値は Integer です。ショートカットを表現する文字列を有効なショートカット整数に変換するには、 Phi.text_to_short_cut(text) で変換する必要があります。

* Action#short_cut で取り出した数値から文字列に変換するには、 Phi.short_cut_to_text を使用します。

* アクションをセットした場合には、 Phi.mew_item_ex でのショートカット指定は無効になるようです。下のプログラムで Ctrl+B は使えません。

--ruby
require "phi"

form = Phi::Form.new

act = Phi::Action.new
act.caption = "action!"
act.on_execute = proc{|sender,*args| form.caption = "act!! by #{sender.action_component}"}
act.short_cut = Phi.text_to_short_cut("ctrl+A")

p Phi.short_cut_to_text(act.short_cut) #=> "Ctrl+A"

Phi.new_menu form, :menu, [
  Phi.new_item_ex('&Test1'  , ''         , act ),
  Phi.new_item_ex('&Test2'  , ''         , :mi_test1 , [
    Phi.new_item_ex('&Test3'  , 'Ctrl+B' , act ),
  ]),
]

button = Phi::Button.new form
button.action = act

form.show
Phi.mainloop
--

: singleton_methods     => Kernel#singleton_methods
: singleton_methods_for_pi  => Object#singleton_methods_for_pi
: taint                 => Kernel#taint
: tainted?              => Kernel#tainted?
: to_a                  => Kernel#to_a
: to_s                  => Kernel#to_s
: type                  => Kernel#type
: untaint               => Kernel#untaint
: visible
: visible=
: visible?
: write_res_file        => Phi::Component#write_res_file

1. 関連

[ap-dev:1154] Phi::Action
