6

Delphiでポップアップメニューを使用しています。ユーザーが項目を選択するとチェックされ、他の項目はチェックされない「ラジオグループ」方式で使用したいと思います。AutoCheckプロパティを使用してみましたが、これにより複数の項目をチェックできます。1つの項目だけをチェックできるようにポップアップメニューを設定する方法はありますか?

4

3 に答える 3

12

ポップアップ (またはその他の) メニュー項目をラジオ グループ項目のように扱うには、ラジオ グループに含めたい項目ごとに 'RadioItem' プロパティを true に設定します。

チェックマークを表示する代わりに、選択した項目に箇条書きが表示されますが、希望どおりに機能し、視覚的な合図は実際には Windows 標準に一致します。

于 2008-09-25T17:12:16.383 に答える
5

Zartog は正しいですが、チェックボックスを維持したい場合は、このイベントをポップアップ メニューのすべての項目に割り当てます。

このコードは、ポップアップ メニューの名前を知っているかどうかに依存しないため (つまり、"GetParentComponent" で調べます)、少し複雑に見えることに注意してください。

procedure TForm2.OnPopupItemClick(Sender: TObject);
var
  i : integer;
begin
  with (Sender as TMenuItem) do begin
    //if they just checked something...
    if Checked then begin
      //go through the list and *un* check everything *else*
      for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin
        if i <> MenuIndex then begin  //don't uncheck the one they just clicked!
          (GetParentComponent as TPopupMenu).Items[i].Checked := False;
        end;  //if not the one they just clicked
      end;  //for each item in the popup
    end;  //if we checked something
  end;  //with
end;

次のように、実行時にフォームのすべてのポップアップ ボックスにイベントを割り当てることができます (そうしたい場合)。

procedure TForm2.FormCreate(Sender: TObject);
var
  i,j: integer;
begin
  inherited;

  //look for any popup menus, and assign our custom checkbox handler to them
  if Sender is TForm then begin
    with (Sender as TForm) do begin
      for i := 0 to ComponentCount - 1 do begin
        if (Components[i] is TPopupMenu) then begin
          for j := 0 to (Components[i] as TPopupMenu).Items.Count - 1 do begin
            (Components[i] as TPopupMenu).Items[j].OnClick := OnPopupItemClick;
          end;  //for every item in the popup list we found
        end;  //if we found a popup list
      end;  //for every component on the form
    end;  //with the form
  end;  //if we are looking at a form
end;

この回答の下のコメントへの回答: 少なくとも 1 つの項目をチェックする必要がある場合は、最初のコード ブロックの代わりにこれを使用してください。oncreate イベントでデフォルトのチェック項目を設定したい場合があります。

procedure TForm2.OnPopupItemClick(Sender: TObject);
var
  i : integer;
begin
  with (Sender as TMenuItem) do begin
    //go through the list and make sure *only* the clicked item is checked
    for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin
      (GetParentComponent as TPopupMenu).Items[i].Checked := (i = MenuIndex);
    end;  //for each item in the popup
  end;  //with
end;
于 2008-09-25T17:07:07.860 に答える
4

Zartog の投稿を拡大するには: Delphi のポップアップ メニュー (少なくとも D6 以降) には、メニュー内にラジオ アイテムの複数のセットを含めることができる GroupIndex プロパティがあります。最初のグループの場合は GroupIndex を 1 に設定し、2 番目のグループの場合は 2 に設定します。

AutoCheck = True を設定 RadioItem = True を設定 ラジオ アイテムの複数のグループが必要な場合は GroupIndex を設定

于 2008-09-26T05:34:07.597 に答える