В зависимости от того, что вы делаете в случае получения itemClicked, вы можете вместо этого использовать currentItemChanged в качестве обходного пути. Это может быть даже полезно для пользователей клавиатуры. Но это действительно зависит от того, что вы хотите сделать после получения itemClicked.
Существует стандартная установка Windows (под свойствами дисплея) для нормального сокрытия тех акселераторов, если клавиша Alt не удерживается. Это объяснило бы, почему открытие меню с Alt+F10 показывает им для Вас. Возможно, это - причина?
[Править]: Нет, это не. Я просто попробовал, и простой TForm с пунктом меню показывает акселератор, но как только я добавляю TImageList и устанавливаю ImageIndex единственного пункта меню или просто устанавливаю OwnerDraw на истинный, затем подчеркивание акселератора исчезает. Я предполагаю, что действительно ошибка в VCL.
BTW, это находится на Windows XP.
Обходное решение:
Я отладил этот Delphi использования 2009 на Windows XP 64, и первопричина для недостающих акселераторов, кажется, что Windows отправляет WM_DRAWITEM
сообщения с ODS_NOACCEL
набор флага, который это не было должно, если система установлена показать акселераторы в любом случае. Таким образом, Вы могли сказать, что это не ошибка VCL, а проблема Windows, которая VCL не работает вокруг.
Однако можно работать вокруг этого в собственном коде, просто необходимо сбросить флаг прежде, чем передать сообщение VCL. Переопределите окно proc
protected
procedure WndProc(var Message: TMessage); override;
как так:
procedure TYourForm.WndProc(var Message: TMessage);
const
ODS_NOACCEL = $100;
var
pDIS: PDrawItemStruct;
ShowAccel: BOOL;
begin
if (Message.Msg = WM_DRAWITEM) then begin
pDIS := PDrawItemStruct(Message.LParam);
if (pDIS^.CtlType = ODT_MENU)
and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
then begin
if ShowAccel then
pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
end;
end;
inherited;
end;
Это - демонстрационный код только, Вы не должны звонить SystemParametersInfo()
каждый раз a WM_DRAWITEM
сообщение получено, но после того как в программе запускаются, и затем каждый раз, когда Ваша программа получает a WM_SETTINGCHANGE
сообщение.
Я не думаю, что это - сгенерированная ошибка Delphi, поскольку у Вас есть то же поведение с Блокнотом на Vista. Также в самом Delphi BTW...
Я должен признаться, что не обращал внимание перед Вашим вопросом. Спасибо за указание на него.
Как Jim McKeeth отметил выше (правильно), это - "дизайном" поведение. Если меню инициированы посредством действия клавиатуры, акселераторы нужно показать, но, если инициировано мышью акселераторы намеренно не показывают.
Мне настроили мой XP для показа акселераторов в любом случае, но быстрый тест с той измененной опцией подтверждает, что меню не должны показывать подчеркиваниям ни одного (Visual Studio ответила, как я ожидал, никакие подчеркивания при использовании мыши). Однако Microsoft Office игнорирует эту установку и всегда показывает подчеркивания. Таким образом, похоже на ошибку в том, как меню оттянуты в Delphi (у меня нет опыта с Delphi самого).
Я нашел опцию для Vista также: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html
Можно включить это в новой Простоте Центра Доступа (перейдите к Панели управления, нажмите Ease of Access и затем нажмите Ease of Access Center). В Простоте Центра Доступа нажмите Make, клавиатура, легче использовать, и в самой нижней части, устанавливает флажок сочетаний клавиш и ключей доступа Underline.
При проведении дальнейшего исследования я нашел эту связанную ошибку на форумах Delphi: http://qc.codegear.com/wc/qcmain.aspx?d=37403
Это похоже в Вашем случае, дочерние окна (оттянутые меню) не получают или не обрабатывают сообщение WM_UIUPDATESTATE из своего родительского окна, которое является тем, что вызывает перерисовку с акселераторами.
Это - "функция", начатая с Windows 2000:
Старая Новая Вещь: Почему Windows скрывает сочетания клавиш и прямоугольники фокусировки по умолчанию?
Казалось бы, что Delphi 4 не поддерживал эту функцию Windows.
Чтобы иметь 2000 и меню XP показывают сочетания клавиш, щелкают правой кнопкой по пустому месту по рабочему столу, выбирают Properties, нажимают вкладку Appearance, и под Эффектами, снятие флажка Скрывают Подчеркнутые Буквы для Перемещения с помощью клавиатуры, пока я Не Нажимаю Alt Key. Нажмите "OK" дважды.
Не уверенный, как сделать это в Vista.