Skip to main content
Table of Contents

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

Basic UsagePascalC++
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:

Checkable Items and GroupsPascalC++
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:

Embedded ControlsPascalC++
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:

Toolbar ItemsPascalC++
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:

Dynamic MenusPascalC++
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

Custom AppearancePascalC++
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)

See Also