0

古き良きものを交換TMainMenuTActionMainMenuBarていますが、いくつか問題があります。

現在、メイン メニュー項目に「OnClick」ハンドラを使用していますが、同じ動作を で再現する方法が見つかりませんTActionMainMenuBar

たとえば、TAction「サンプル」カテゴリの「テスト」を作成し、これを にドラッグ アンド ドロップしTActionMainMenuBarます。サブメニュー「Test」の実行ハンドラには がTAction割り当てられているため、コードを追加できますが、メイン メニュー項目「Sample」には、単に Category / TActionClientItem であるため、イベント コードを追加できません」イベントなしでテストします。

これにアクションを割り当てようとしましたTActionClientItemが、Delphi XE3 は「プロパティを設定できません...」と言っています。

別の方法としてはTActions、"(カテゴリなし)" を使用して "Sample" と "Test" の 2 つを使用する方法ですが、先ほどドロップした "Sample" のサブメニューとして "Test" をドラッグ アンド ドロップできませんTActionMenuBar。空のメイン メニュー項目のサブメニュー項目ではなく、メイン メニュー項目のみをドラッグ アンド ドロップできるようです。

4

1 に答える 1

0

通常、メイン メニュー項目のハンドラーを使用する目的OnClickは、サブメニュー項目が有効/無効か、または表示されているかを判断することです。通常、同じ機能を実行するツールバー ボタンなどを有効/無効にする場所でもあります。

procedure TForm1.MyMainMenuItemClick(Sender: TObject);
begin
  SomeMenuItem.Enabled := SomeConditionTest;
  SomeToolButton.Enabled := SomeMenuItem.Enabled;
  AnotherMenuItem.Enabled := AnotherConditionTest;
  AnotherToolButton.Enabled := AnotherMenuItem.Enabled;
end;

TActionMainMenuBarアイテムの場合は、イベントではなく個々のアクションでこれを行いますOnUpdate。これの利点は、アクションを有効/無効にすると、そのアクションに接続されているすべてのコントロールも同時に有効/無効になることです。

procedure TForm1.SomeActionUpdate(Sender: TObject);
begin
  SomeAction.Enabled := SomeConditionTest;  // Also controls the toolbutton
end;

procedure TForm1.AnotherActionUpdate(Sender: TObject);
begin
  AnotherAction.Enabled := AnotherConditionTest; // Toolbutton too.
end;

このOnUpdateイベントは、子項目が表示される直前に呼び出されます。これは、古いメイン メニュー項目OnClickが呼び出されるのと同じ時間です。

于 2013-09-06T21:37:50.980 に答える