フォームに複数のコントロールがあり
例えばエディトボックスで文字が選択されていなければCopyボタンが押せないような制御(あくまで例です)を
行うためにボタンのEnabled=Falseとしますが、
条件がいろいろあってまとめて1つのprocedureでまとめて複数のコントロールのEnabledを設定したいのですが
何かスマートに行うアイデアはないでしょうか?
試した方法
その①
Application.OnIdleに適当なメソッドを代入して、そこでEnabledを設定
この方法だとフォームが複数だと問題があると思った。
その②
フォーム上にTActionList、TAction、TButtonを配置し、TButtonのActionプロパティにTActionコンポーネントを
代入して、TActionコンポーネントのOnUpdateイベントでEnabledを設定
そしてFormCreateイベントでTButtonをフォームの可視領域から外へ移動
現在②の方法で行うつもりですが、もっとスマートな方法はないでしょうか?
ダミーのコンポーネントを配置しなくてすむような方法
TActionのOnUpdateプロパティをソースで追いかけてみましたが、仕組みが良く分かりませんでした。
付け足しです
当初TButtonなしで
TActionListのOnUpdateイベント
TActionのOnUpdateイベント
にそれぞれ記述してみましたが、イベントは起動されないようでした。
いずれかのコントロールのActionプロパティに関連させないと
OnUpdateイベントは起きないのでしょうか?
> ダミーのコンポーネントを配置しなくてすむような方法
ButtonのEnabledを制御したいのに、そのボタンを見えないところに移動してしまうのですか? やりたいことがよくわかりません。
(ちなみにボタンがフォームの外にいてもキーボード操作で押せるので、ユーザに触られないようにする手段だとしたら片手落ちですが)
複数のコントロールのEnabledを制御したいということですから、条件が全部同一であれば
全部に同じActionを割り当てて、OnUpdateを記述してやればいいだけだと思いますが。
(TAction.Enabledを設定すると、そのActionを持つコントロールすべてのEnabledが連動して変わります)
>ButtonのEnabledを制御したいのに、そのボタンを見えないところに移動してしまうのですか? やりたいことがよくわかりません。
ここで設定したボタンは本来設計上不要のボタンで、TActionのOnUpdateイベントを起こさせるために無理やり
配置したダミーのボタンです。これがないと、TActionのOnUpdateイベントが起きないようなので。。
>複数のコントロールのEnabledを制御したいということですから、条件が全部同一であれば
>全部に同じActionを割り当てて、OnUpdateを記述してやればいいだけだと思いますが。
条件はばらばらです。
個別のコントロールにそれぞれアクションを設定すれば可能だとは思うのですが、1つのprocedureでまとめて設定するほうが
プログラムが簡潔になると思ったしだいです。
そういう使い方だとすると、TAction.OnUpdateで自分以外を制御するのは本来の用途から外れているので
やはりOnIdleを使うのがいいのではないでしょうか。
> この方法だとフォームが複数だと問題があると思った。
というのが、一つのイベントハンドラを全体で共有することを問題視しているのだとしたら
それぞれのフォームにTApplicationEventsを貼り付けて、そのOnIdleを使うのはどうでしょう。
torさん
まさに望んだことができました。
非ビジュアルコンポーネントでTApplicationEventsというものがあるのをはじめて知りました。
どうもありがとうございました。
ツイート | ![]() |