重複の可能性:
メニューを閉じずにメニュー項目を選択するには?
ポップアップ メニューが表示されているときに、アイテムをチェック/チェック解除する必要がありますが、ポップアップ メニューを閉じて再度開きたくありません。気になるちらつきの原因となります。
これまでの私のコードは次のとおりです。
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;
MenuSelectID
CheckMenuItem(Menu.Handle, ItemID, MF_BYCOMMAND or MF_CHECKED);
私の主な目標は、メニュー項目をチェック/チェック解除することなので、ゼロに戻ります。Microsoft Office のステータス バー コンテキスト メニューと同じ(少なくとも 2010):
EDIT 2:InvalidateRect(FPopupWindowHandle, nil, False);
設定直後に追加するChecked
と、無効化の問題が修正されました。