OnPopup イベントを処理する
コントロールの利用:インデックス への移動
ポップアップメニューを表示する前に,標準メニューの項目を使用可能または使用不可にすることがあるのと同じように,ポップアップメニューの項目を調整しなければならないことがあります。標準メニューでは,メニューの最上位にある項目の OnClick イベントを処理します。
しかし,ポップアップメニューでは最上位レベルのメニューバーがないので,ポップアップメニューのコマンドを作成するには,メニューコンポーネント自体のイベントを処理します。ポップアップメニューコンポーネントには,この処理のために OnPopup というイベントがあります。
表示する前にポップアップメニューの項目を調整する手順は次のとおりです。
- ポップアップメニューコンポーネントを選択します。
- ポップアップメニューコンポーネントの OnPopup イベントハンドラを作成します。
- イベントハンドラでコードを記述して,メニュー項目を使用可能,使用不可,あるいは非表示にしたり,表示したりします。
次のコードでは,メニュー項目を使用不可にする Disabling menu で説明した Edit1Click イベントハンドラをポップアップメニューコンポーネントの OnPopup イベントに結び付けます。次に,ポップアップメニューのそれぞれの項目に対応した 1 行の新しいコードを Edit1Click に追加します。
procedure TEditForm.Edit1Click(Sender: TObject);
var
HasSelection: Boolean;
begin
Paste1.Enabled := Clipboard.HasFormat(CF_TEXT);
Paste2.Enabled := Paste1.Enabled;{この行を追加する}
HasSelection := Editor.SelLength <> 0;
Cut1.Enabled := HasSelection;
Cut2.Enabled := HasSelection;{この行を追加する}
Copy1.Enabled := HasSelection;
Copy2.Enabled := HasSelection;{この行を追加する}
Delete1.Enabled := HasSelection;
end;
void __fastcall TMainForm::EditEditClick(TObject *Sender)
{
// [貼り付け]メニュー項目を使用可能または使用不可にする
Paste1->Enabled = Clipboard()->HasFormat(CF_TEXT);
Paste2->Enabled = Paste1->Enabled; // この行を追加する
bool HasSelection = (RichEdit1->SelLength > 0); // テキストが選択されている場合は true
Cut1->Enabled = HasSelection; // HasSelection が true であればメニュー項目を使用可能にする
Cut2->Enabled = HasSelection; // この行を追加する
Copy1->Enabled = HasSelection;
Copy2->Enabled = HasSelection; // この行を追加する
Delete1->Enabled = HasSelection;
}