Popup Menu
TTMSFNCPopupMenu is a cross-platform context menu component for Windows and macOS. It supports hierarchical item structures, multiple item types (standard, separator, check, toolbar), embedded controls, and extensive appearance customization.
Key class: TTMSFNCPopupMenu
Note
TTMSFNCMenuItem defines the item's logical configuration (text, icons, sub-items, events). TTMSFNCMenuItemControl is the runtime control rendered when the menu is shown. In most events you work with TTMSFNCMenuItemControl; access the original configuration via its MenuItem property.
Basic Usage
uses
FMX.TMSFNCPopupMenu;
procedure TForm1.CreateMenu;
var
MenuItem: TTMSFNCMenuItem;
begin
MenuItem := TMSFNCPopupMenu1.AddMenuItem('Copy');
MenuItem.OnClick := CopyClick;
MenuItem := TMSFNCPopupMenu1.AddMenuItem('Paste');
MenuItem.OnClick := PasteClick;
TMSFNCPopupMenu1.AddMenuSeparatorItem;
MenuItem := TMSFNCPopupMenu1.AddMenuItem('Options');
MenuItem.AddMenuItem('Option 1');
MenuItem.AddMenuItem('Option 2');
// Assign to a control for right-click
MyControl.PopupMenu := TMSFNCPopupMenu1;
end;
// Or display programmatically
procedure TForm1.ShowMenuAt(X, Y: Single);
begin
TMSFNCPopupMenu1.Popup(X, Y);
end;
void __fastcall TForm1::CreateMenu()
{
TTMSFNCMenuItem *MenuItem = TMSFNCPopupMenu1->AddMenuItem("Copy");
MenuItem->OnClick = CopyClick;
MenuItem = TMSFNCPopupMenu1->AddMenuItem("Paste");
MenuItem->OnClick = PasteClick;
TMSFNCPopupMenu1->AddMenuSeparatorItem();
MenuItem = TMSFNCPopupMenu1->AddMenuItem("Options");
MenuItem->AddMenuItem("Option 1");
MenuItem->AddMenuItem("Option 2");
// Assign to a control for right-click
MyControl->PopupMenu = TMSFNCPopupMenu1;
}
// Or display programmatically
void __fastcall TForm1::ShowMenuAt(float X, float Y)
{
TMSFNCPopupMenu1->Popup(X, Y);
}
Checkable Items and Groups
Use mitCheck items with a shared GroupName for radio-style selection:
MenuItem := TMSFNCPopupMenu1.AddMenuItem('Small', mitCheck);
MenuItem.GroupName := 'Size';
MenuItem.Checked := True;
MenuItem := TMSFNCPopupMenu1.AddMenuItem('Medium', mitCheck);
MenuItem.GroupName := 'Size';
MenuItem := TMSFNCPopupMenu1.AddMenuItem('Large', mitCheck);
MenuItem.GroupName := 'Size';
// Retrieve the checked item:
MenuItem := TMSFNCPopupMenu1.GetCheckedMenuItemByGroupName('Size');
TTMSFNCMenuItem *MenuItem = TMSFNCPopupMenu1->AddMenuItem("Small", TTMSFNCMenuItemType::mitCheck);
MenuItem->GroupName = "Size";
MenuItem->Checked = true;
MenuItem = TMSFNCPopupMenu1->AddMenuItem("Medium", TTMSFNCMenuItemType::mitCheck);
MenuItem->GroupName = "Size";
MenuItem = TMSFNCPopupMenu1->AddMenuItem("Large", TTMSFNCMenuItemType::mitCheck);
MenuItem->GroupName = "Size";
// Retrieve the checked item:
MenuItem = TMSFNCPopupMenu1->GetCheckedMenuItemByGroupName("Size");
Embedded Controls
Embed any control inside a menu item:
var
MenuItem: TTMSFNCMenuItem;
SearchEdit: TEdit;
begin
MenuItem := TMSFNCPopupMenu1.AddMenuItem('', mitDefault);
MenuItem.Selectable := False;
SearchEdit := TEdit.Create(Self);
SearchEdit.Width := 150;
SearchEdit.TextPrompt := 'Search...';
MenuItem.Control := SearchEdit;
MenuItem.ControlAlignment := caClient;
end;
TTMSFNCMenuItem *MenuItem = TMSFNCPopupMenu1->AddMenuItem("", TTMSFNCMenuItemType::mitDefault);
MenuItem->Selectable = false;
TEdit *SearchEdit = new TEdit(this);
SearchEdit->Width = 150;
SearchEdit->TextPrompt = "Search...";
MenuItem->Control = SearchEdit;
MenuItem->ControlAlignment = TTMSFNCControlAlignment::caClient;
Toolbar Items
Use mitToolBar items to create compact button groups:
var
ToolbarItem, ButtonItem: TTMSFNCMenuItem;
begin
ToolbarItem := TMSFNCPopupMenu1.AddMenuItem('', mitToolBar);
ButtonItem := ToolbarItem.AddMenuItem('Bold', mitDefault);
ButtonItem.BitmapName := 'Bold';
ButtonItem.Hint := 'Bold (Ctrl+B)';
ButtonItem.ShowHint := True;
end;
TTMSFNCMenuItem *ToolbarItem = TMSFNCPopupMenu1->AddMenuItem("", TTMSFNCMenuItemType::mitToolBar);
TTMSFNCMenuItem *ButtonItem = ToolbarItem->AddMenuItem("Bold", TTMSFNCMenuItemType::mitDefault);
ButtonItem->BitmapName = "Bold";
ButtonItem->Hint = "Bold (Ctrl+B)";
ButtonItem->ShowHint = true;
Dynamic Menus
Use OnGetNumberOfPopupMenuItems and OnMenuItemControlAdded to build menus dynamically from data:
procedure TForm1.DoGetNumberOfPopupMenuItems(Sender: TObject;
var ADisplayItemCount: Integer);
begin
ADisplayItemCount := MyDataList.Count + 2;
end;
procedure TForm1.DoMenuItemControlAdded(Sender: TObject;
AMenuItemControl: TTMSFNCMenuItemControl);
begin
case AMenuItemControl.Index of
0: begin
AMenuItemControl.Text := 'Recent Files';
AMenuItemControl.Selectable := False;
end;
1: AMenuItemControl.ItemType := mitSeparator;
else
AMenuItemControl.Text := MyDataList[AMenuItemControl.Index - 2];
end;
end;
void __fastcall TForm1::DoGetNumberOfPopupMenuItems(TObject *Sender, int &ADisplayItemCount)
{
ADisplayItemCount = MyDataList->Count + 2;
}
void __fastcall TForm1::DoMenuItemControlAdded(TObject *Sender, TTMSFNCMenuItemControl *AMenuItemControl)
{
switch (AMenuItemControl->Index)
{
case 0:
AMenuItemControl->Text = "Recent Files";
AMenuItemControl->Selectable = false;
break;
case 1:
AMenuItemControl->ItemType = TTMSFNCMenuItemType::mitSeparator;
break;
default:
AMenuItemControl->Text = MyDataList->Strings[AMenuItemControl->Index - 2];
}
}
Custom Appearance
var
mp: TTMSFNCPopupMenuAppearance;
dip: TTMSFNCMenuItemAppearance;
begin
mp := TMSFNCPopupMenu1.Appearance;
mp.Fill.Color := $FF1E1E1E;
mp.Stroke.Color := $FF3A3A3A;
mp.MenuRounding := 12;
dip := mp.DefaultItemAppearance;
dip.Fill.Color := gcNull;
dip.Font.Color := $FFE4E4E4;
dip.SelectedFill.Color := $FF0E639C;
dip.SelectedFontColor := gcWhite;
dip.ItemRounding := 6;
dip.ItemHeight := 32;
end;
TTMSFNCPopupMenuAppearance *mp = TMSFNCPopupMenu1->Appearance;
mp->Fill->Color = (TAlphaColor)0xFF1E1E1E;
mp->Stroke->Color = (TAlphaColor)0xFF3A3A3A;
mp->MenuRounding = 12;
TTMSFNCMenuItemAppearance *dip = mp->DefaultItemAppearance;
dip->Fill->Color = gcNull;
dip->Font->Color = (TAlphaColor)0xFFE4E4E4;
dip->SelectedFill->Color = (TAlphaColor)0xFF0E639C;
dip->SelectedFontColor = gcWhite;
dip->ItemRounding = 6;
dip->ItemHeight = 32;
Properties Reference
TTMSFNCPopupMenu
| Property | Description |
|---|---|
Appearance |
Visual appearance settings for the menu |
BitmapContainer |
Centralized bitmap management |
Items |
Collection of TTMSFNCMenuItem |
TTMSFNCPopupMenuAppearance
| Property | Description |
|---|---|
Fill / Stroke |
Background fill and border stroke |
MenuRounding |
Corner radius (default: 8) |
MenuMargins |
Internal margins |
DefaultItemAppearance |
Default item appearance settings |
MinimumAutoSizeItemHeight |
Minimum item height (default: 23) |
CheckedIcon / SubMenuIcon |
Icons for checked and sub-menu items |
PopupMenuPlacement |
Placement strategy (default: ppAbsolute) |
TTMSFNCMenuItem
| Property | Description |
|---|---|
Text / Note |
Main text and secondary right-aligned text |
ItemType |
mitDefault, mitSeparator, mitCheck, mitToolBar, mitDropDownButton |
Enabled / Checked / Selectable |
State flags |
GroupName |
Radio-style group |
Bitmap / BitmapName |
Item icon |
Items |
Sub-items collection |
ShortCut |
Keyboard shortcut |
Control / ControlAlignment / ControlPosition |
Embedded control |
Action |
Associated action |
OnClick |
Click event |
TTMSFNCMenuItemAppearance
| Property | Description |
|---|---|
Fill / SelectedFill / DisabledFill |
Background fills by state |
Font / SelectedFontColor / DisabledFontColor |
Font settings by state |
ItemRounding |
Corner radius (default: 2) |
ItemHeight |
Fixed height (-1 for auto) |
LeftTextIndent |
Left text indentation (default: 24) |
Events
| Event | Description |
|---|---|
OnPopup / OnClose |
Before show / after close |
OnMenuItemClick |
Default handler for items without individual OnClick |
OnMenuItemAdd |
Filter items on addition |
OnMenuItemControlAdded |
After a control is added; use for dynamic population |
OnMenuItemSelectable |
Customize item selectability |
OnItemCheck |
Item checked/unchecked |
OnGetNumberOfPopupMenuItems / OnGetNumberOfSubMenuItems |
Dynamic item count |
OnBeforeDrawMenuItem / OnAfterDrawMenuItem |
Custom drawing around items |
OnGetContextMenu / OnGetPopupMenuForContextMenu |
Context menu customization (Edge browser integration) |