4

重複の可能性:
メニューを閉じずにメニュー項目を選択するには?

ポップアップ メニューが表示されているときに、アイテムをチェック/チェック解除する必要がありますが、ポップアップ メニューを閉じて再度開きたくありません。気になるちらつきの原因となります。

これまでの私のコードは次のとおりです。

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    N11: TMenuItem;
    N21: TMenuItem;
    N31: TMenuItem;
    procedure PopupMenu1Popup(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    PopupPt: TPoint;
    procedure OptionClick(Sender: TObject);
  public
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.PopupMenu := PopupMenu1;
  PopupMenu1.OnPopup := PopupMenu1Popup;
  N11.OnClick := OptionClick;
  N21.OnClick := OptionClick;
  N31.OnClick := OptionClick;
end;

procedure TForm1.OptionClick(Sender: TObject);
begin
  PopupMenu1.Tag := 1;
  try
    (Sender as TMenuItem).Checked := not (Sender as TMenuItem).Checked;
    PopupMenu1.Popup(PopupPt.x, PopupPt.y);
  finally
    PopupMenu1.Tag := 0;
  end;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  if PopupMenu1.Tag = 0 then
    PopupPt := Mouse.CursorPos;
end;

私の質問は、これをもっとうまく行うことができますか?


編集 1:受け入れられた回答の重複には小さな問題があります メニューを閉じずにメニュー項目を選択する方法:

(メソッド) のItem.Checked := not Item.Checked直後に設定した場合- アイテムは無効化されず、アイテム領域を離れてそこに戻るまでチェックは行われません... 私も試しました: - 同じ効果。Item.Click;MenuSelectIDCheckMenuItem(Menu.Handle, ItemID, MF_BYCOMMAND or MF_CHECKED);

私の主な目標は、メニュー項目をチェック/チェック解除することなので、ゼロに戻ります。Microsoft Office のステータス バー コンテキスト メニューと同じ(少なくとも 2010):


EDIT 2:InvalidateRect(FPopupWindowHandle, nil, False);設定直後に追加するCheckedと、無効化の問題が修正されました。

4

0 に答える 0