3

サブメニューを持つ PopupMenu があり、一度に合計 1 つの項目のみをチェックする必要があります。私が試した限り、プロパティはそれぞれのサブメニューの外では機能しませんGroupIndexRadioItem

PopupMenu とその直接のサブコンポーネントをチェックするためのこのコードを見つけましたが、これのさまざまなポップアップを作成することはできませんでした。高速なソリューションが必要です.PopupMenuには4x14のエントリがあり、常にすべてのメニューとサブエントリを繰り返し処理することは、これに対する最良のソリューションではありません.

私が見逃している単純なプロパティはありますか、それとも反復の岩だらけの道が私の唯一の選択肢ですか?

4

2 に答える 2

8

56個のアイテムすべてをアクションとして1つのActionListに追加し、すべてのGroupIndexプロパティに同じ値を指定します。

次に、メニュー項目、サブメニュー、およびサブサブメニューをツリーのように追加し、それぞれをアクションにリンクします。1つのメニュー項目をチェックすると、配置されている場所に関係なく、他のすべてのメニュー項目のチェックが自動的に解除されます。

Etvoilà!

于 2012-06-20T20:28:05.797 に答える
2

NGLN の回答の方が優れていますが、ActionList を使用したくない、または使用したくない場合は、次のルーチンでも実行できます。

procedure CheckMenuItem(Item: TMenuItem);

  procedure UncheckMenu(Menu: TMenuItem; GroupIndex: Byte);
  var
    I: Integer;
  begin
    if Menu.RadioItem and (Menu.GroupIndex = GroupIndex) then
      Menu.Checked := False;
    for I := 0 to Menu.Count - 1 do
      UncheckMenu(Menu[I], GroupIndex);
  end;

begin
  if (not Item.Checked) and Item.RadioItem and (Item.GroupIndex <> 0) then
  begin
    UncheckMenu(Item.GetParentMenu.Items, Item.GroupIndex);
    Item.Checked := True;
  end;
end;
于 2012-06-20T20:57:16.027 に答える