2

接続された TAction を非表示に設定してコンポーネントを非表示にすると、onupdate イベントがトリガーされなくなります。再作成するには、次の手順を実行します。

  1. 新しい VCL フォーム アプリケーションを作成する
  2. ボタン、チェックボックス、およびアクションリストをフォームにドロップします。
  3. 新しいアクションを作成し、それにボタンを接続します。
  4. アクション OnExecute および OnUpdate イベントの次のコードを記述します。

    procedure TForm1.Action1Execute(Sender: TObject);
    begin
      ShowMessage('Test');
    end;
    
    procedure TForm1.Action1Update(Sender: TObject);
    begin
      TAction(Sender).Enabled := not CheckBox1.Checked;
      TAction(Sender).Visible := TAction(Sender).Enabled;
    end;
    

アプリケーションを実行します。ボタンが表示され、適切に機能します。チェックボックスにチェックを入れると、ボタンが消えます。チェックボックスをオフにします。ボタンが表示されません。実際、Action1Update にブレークポイントを設定すると、そこに到達することはありません。これはなぜですか、どうすれば修正できますか?

4

4 に答える 4

2

これを修正する必要はありません。設計どおりに動作します。表示されているコントロールのみが状態を更新する必要があるため、リンクされたコントロールが表示されているアクションのみが更新されます。ボタンを非表示にすると、アクションを更新する理由がなくなります。

于 2011-12-09T14:53:49.033 に答える
1

フォームの InitiateAction メソッドをオーバーライドできます。これは、OnUpdate イベントが各アクションに対して行うのと同様に、アプリケーションがアイドル状態になるたびに発生します。

于 2013-03-06T00:32:08.877 に答える
1

あなたがやろうとしていることは理解できますし、そのように動作させたいと思うのは理にかなっています。ただし、これが機能する方法の回避策があります。

他のコントロールも更新できますOnUpdate。通知を受け取るコントロールの更新に限定されません。したがって、可視性を決定するコントロールのアクションでは、そこで他のコントロールの可視性を設定できます。あなたの場合、それはチェックボックスです:

新しいアクション (Action2) を作成し、Checkbox1 に割り当てます。

次に、チェックボックス アクションの OnUpdate で:

procedure TForm1.Action2Update(Sender: TObject);
begin
  Button1.Visible := TAction(Sender).Checked;
end;

チェックボックスにも OnExecute を割り当ててください。次のような単純なもので問題ありません。

procedure TForm1.Action2Execute(Sender: TObject);
begin
  TAction(Sender).Checked := not TAction(Sender).Checked;
end;

私にとって、これはまだ論理的に理にかなっています。チェックボックスの設定に依存するすべてのコントロールを 1 か所で見ることができます。

于 2011-12-09T20:00:15.247 に答える
1

OnUpdateでは、必要なことを行う別のルーチンのみを呼び出すようにします。その後、そのルーチンを他の場所から呼び出すことができます。アクションリストはそのために設計されました。

于 2011-12-09T15:36:23.053 に答える