Легко, отключите элемент.
Шутка в сторону, задача не из легких.
Если вы хотите, чтобы всплывающее меню действовало как самая верхняя форма (то есть вы можете взаимодействовать как с элементами, так и с элементами управления в вашей форме, не деактивируя меню), забудьте об этом, этого нельзя сделать с помощью стандартного меню. .
Но если ваше требование точно такое же, как указано в вашем вопросе (щелкните элемент, и меню не закрывается - щелкните снаружи, и оно закрывается), при некоторой работе это будет возможно.
Ваша цель - подкласс окно, в котором будет находиться ваше подменю, чтобы переопределить некоторую обработку сообщений. Во-первых, выведите новый класс из TPopupList и переопределите его WndProc. Вот пример , делающий это.
Если вы намерены предотвратить закрытие меню, выбрав корневые элементы, то в WndProc PopupList вы обработаете WM_ENTERIDLE и получите дескриптор окна всплывающего меню из lParam сообщения и создадите подкласс окна всплывающего меню.
Если вы намереваетесь предотвратить закрытие меню только путем выбора элементов подменю, то в WndProc PopupList вы будете следить за сообщениями WM_INITMENUPOPUP, где wParam - это не дескриптор самого PopupMenu, это будет означать, что подменю собирается быть показано. Только тогда вы обработаете WM_ENTERIDLE и получите дескриптор окна, в котором находится подменю, и создадите подкласс этого окна.
После создания подкласса окна, в котором находится всплывающее меню или всплывающее подменю, вы перехватите недокументированное сообщение «MN_BUTTONDOWN» ($ 01ED) и предотвратите дальнейшую обработку (не вызывая процедуру исходного окна). Возможно, вы также захотите предотвратить закрытие меню с помощью клавиатуры; вы будете следить за сообщениями WM_KEYDOWN (Enter) и WM_CHAR (ускоритель).
Ну, я бы подумал.