各コントロールのEnabledをまとめて設定するスマートな方法

解決


takana  2011-06-27 20:46:37  No: 40708  IP: 192.*.*.*

フォームに複数のコントロールがあり
例えばエディトボックスで文字が選択されていなければCopyボタンが押せないような制御(あくまで例です)を
行うためにボタンのEnabled=Falseとしますが、
条件がいろいろあってまとめて1つのprocedureでまとめて複数のコントロールのEnabledを設定したいのですが
何かスマートに行うアイデアはないでしょうか?

試した方法
その①
Application.OnIdleに適当なメソッドを代入して、そこでEnabledを設定
この方法だとフォームが複数だと問題があると思った。

その②
フォーム上にTActionList、TAction、TButtonを配置し、TButtonのActionプロパティにTActionコンポーネントを
代入して、TActionコンポーネントのOnUpdateイベントでEnabledを設定
そしてFormCreateイベントでTButtonをフォームの可視領域から外へ移動

現在②の方法で行うつもりですが、もっとスマートな方法はないでしょうか?
ダミーのコンポーネントを配置しなくてすむような方法

TActionのOnUpdateプロパティをソースで追いかけてみましたが、仕組みが良く分かりませんでした。

編集 削除
takana  2011-06-27 21:16:59  No: 40709  IP: 192.*.*.*

付け足しです

当初TButtonなしで
TActionListのOnUpdateイベント
TActionのOnUpdateイベント
にそれぞれ記述してみましたが、イベントは起動されないようでした。
いずれかのコントロールのActionプロパティに関連させないと
OnUpdateイベントは起きないのでしょうか?

編集 削除
tor  2011-06-28 11:19:20  No: 40710  IP: 192.*.*.*

> ダミーのコンポーネントを配置しなくてすむような方法
ButtonのEnabledを制御したいのに、そのボタンを見えないところに移動してしまうのですか? やりたいことがよくわかりません。
(ちなみにボタンがフォームの外にいてもキーボード操作で押せるので、ユーザに触られないようにする手段だとしたら片手落ちですが)

複数のコントロールのEnabledを制御したいということですから、条件が全部同一であれば
全部に同じActionを割り当てて、OnUpdateを記述してやればいいだけだと思いますが。
(TAction.Enabledを設定すると、そのActionを持つコントロールすべてのEnabledが連動して変わります)

編集 削除
takana  2011-06-28 19:18:36  No: 40711  IP: 192.*.*.*

>ButtonのEnabledを制御したいのに、そのボタンを見えないところに移動してしまうのですか? やりたいことがよくわかりません。

ここで設定したボタンは本来設計上不要のボタンで、TActionのOnUpdateイベントを起こさせるために無理やり
配置したダミーのボタンです。これがないと、TActionのOnUpdateイベントが起きないようなので。。



>複数のコントロールのEnabledを制御したいということですから、条件が全部同一であれば
>全部に同じActionを割り当てて、OnUpdateを記述してやればいいだけだと思いますが。

条件はばらばらです。
個別のコントロールにそれぞれアクションを設定すれば可能だとは思うのですが、1つのprocedureでまとめて設定するほうが
プログラムが簡潔になると思ったしだいです。

編集 削除
tor  2011-06-28 21:43:34  No: 40712  IP: 192.*.*.*

そういう使い方だとすると、TAction.OnUpdateで自分以外を制御するのは本来の用途から外れているので
やはりOnIdleを使うのがいいのではないでしょうか。

> この方法だとフォームが複数だと問題があると思った。
というのが、一つのイベントハンドラを全体で共有することを問題視しているのだとしたら
それぞれのフォームにTApplicationEventsを貼り付けて、そのOnIdleを使うのはどうでしょう。

編集 削除
takana  2011-06-28 22:34:52  No: 40713  IP: 192.*.*.*

torさん

まさに望んだことができました。
非ビジュアルコンポーネントでTApplicationEventsというものがあるのをはじめて知りました。

どうもありがとうございました。

編集 削除