2015-07-26 4 views
1

Я использую Delphi XE7, и мой вопрос касается того, когда должны отображаться клавиши ускорителя (aka Access Keys). В частности, я заметил, что если я покажу вторичную форму (т. Е. Не основную форму) и нажмите клавишу Alt, отобразятся ускорители (ожидаемое поведение). Если я затем закрою и снова открою диалоговое окно, ускорители все еще отображаются (без нажатия Alt). Это считается правильным поведением Windows 7? Если это неправильное поведение, то какой код (если таковой имеется) можно было бы добавить в OnShow формы, который будет отображать ускорители?Должны ли ключи доступа оставаться подчеркнутыми при открытии диалогового окна?

ответ

2

Стандарт платформы - это то, что ключи доступа отображаются, если диалог был вызван действием клавиатуры. Как только появится диалоговое окно, если вы нажмете клавишу ALT, то будут показаны ключи доступа.

Итак, почему ключи доступа отображаются при открытии формы во второй раз? Ну, если вы создаете форму каждый раз, когда вы ее показываете, тогда вы получите стандартное поведение платформы, описанное выше. Поэтому я заключаю, что между первым и вторым показом формы вы просто скрываете ее, а не уничтожаете ее.

Итак, простой способ добиться желаемого поведения - это уничтожить форму, когда она закрыта, и создать ее, когда она будет показана. Не используйте глобальную переменную формы, которую создает IDE для вас. Не вызывайте Application.CreateForm в .dpr-файле, чтобы создать этот глобальный экземпляр. Всякий раз, когда вам нужно показать форму, создайте ее в этом экземпляре. Когда форма закрыта, уничтожьте этот экземпляр.

Если вам нужно повторно показать существующий экземпляр формы, отправьте сообщение WM_CHANGEUISTATE, чтобы инициализировать состояние. Проход UIS_INITIALIZE or (UISF_HIDEACCEL shl 16) как wParam. Если вы не можете это проверить, это будет происходить в этом направлении. Я думаю, этого достаточно, чтобы отправить это только в дескриптор окна формы. И я мог ошибаться в флагах. Документация здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms646342(v=vs.85).aspx

+0

Объяснение полезно. На данный момент в проекте будет значительная работа по изменению, когда/как создаются формы, поэтому остается вопрос - есть ли код, который может быть добавлен в Onshow, который восстановит ускорители? – TomT

+0

Я добавил дополнительную информацию. Надеюсь, поможет. –

+2

Это работает. В случае, если вы хотите сделать свой ответ более конкретным для потомков, при размещении в форме Onshow: SendMessage (Handle, WM_ChangeUIState, UIS_INITIALIZE или (UISF_HIDEACCEL shl 16), 0) работает следующее: – TomT

Смежные вопросы