Компонент HotKey, расположенный в библиотеке на странице Win32
, является вспомогательным, обеспечивающим возможность задания самим пользователем горячих клавиш, определяющих быстрый доступ к разделам меню. К тому же этот компонент позволяет задать такие сочетания горячих клавиш, которые не предусмотрены в выпадающем списке свойства разделов меню ShortCut.
Компонент HotKey внешне выглядит как обычное окно редактирования Edit. Но если в него входит пользователь, то оно переводит нажимаемые им клавиши в тип TShortCut, хранящий комбинацию горячих клавиш. Например, если пользователь нажимает клавиши Ctrl-ф, то в окне HotKey появится текст «Ctrl + ф
».
Основное свойство компонента — HotKey, равное по умолчанию комбинации клавиш Alt-А. Это свойство можно прочесть и присвоить свойству ShortCut какого-то раздела меню. Например, оператор
MOpen.ShortCut := HotKey1.HotKey;присваивает разделу меню с именем MOpen комбинацию клавиш, заданную в компоненте HotKey1.
Свойство Modifiers указывает модификатор — вспомогательную клавишу, нажимаемую перед символьной. Это свойство является множеством, которое может включать значения hkShift, hkCtrl, hkAlt, hkExt, что соответствует клавишам Shift, Ctrl, Alt, Extra. По умолчанию Modifiers =[hkAlt]. Если вы хотите, например, задать вместо этого значения в качестве модификатора клавишу Ctrl, вы должны выполнить оператор:
HotKey1.Modifiers: = [hkCtrl];
Свойство InvalidKeys задает недопустимые клавиши или их комбинации. Это свойство является множеством, которое может включать значения hcNone, hcShift, hcCtrl, hcAlt, hcShiftCtrl, hcShiftAlt, hcCtrlAlt, hcShiftCtrlAlt, что соответствует отсутствию модификатора и клавишам Shift, Ctrl, Alt, Shift-Ctrl, Shift-Alt, Ctrl-Alt, Shift-Ctrl-Alt.
Если вы хотите задать программно значение свойства HotKey, то можете это сделать, например, операторами
HotKey1.HotKey := ord('F'); HotKey1.Modifiers := [hkAlt];
Эти операторы зададут комбинацию горячих клавиш Alt-F.
В заключение приведем пример использования компонента HotKey и настройки горячих клавиш меню в процессе выполнения приложения.
Пусть у вас есть главная форма приложения, содержащая компонент MainMenu и пусть вы хотите ввести команду настройки, позволяющую пользователю изменить установленные для разделов меню горячие клавиши. Для упрощения задачи будем считать, что меню, сконструированное в MainMenu:
Эти предположения сделаны просто для того, чтобы упростить код и не использовать функции, не описанные в данной книге.
Начните новое приложение, разместите на форме компонент MainMenu и сконструируйте с его помощью любое меню, удовлетворяющее перечисленным требованиям. Задайте каким-то из разделов меню быстрые клавиши. Один из разделов меню должен называться Настройка
и при выборе его мы хотим предоставить пользователю вспомогательную форму для настройки быстрых клавиш.
Добавьте в приложение еще одну форму (команда File | New Form
). Эта форма будет вспомогательной. В обработчик команды Настройка
главной формы вставьте оператор
Form2.ShowModal;
Этот оператор покажет пользователю окно вспомогательной формы как модальное — т.е. пользователь не сможет вернуться в главную форму, пока не закроет вспомогательную. Чтобы компилятор понял этот оператор, надо в модуль главной формы Unit1 вставить оператор uses, ссылающийся на модуль вспомогательной формы Unit2. Можете сделать это вручную или, перейдя в окне Редактора Кода в модуль Unit1, выполните команду File | Use Unit
и укажите, что хотите связаться с модулем Unit2. Поскольку из модуля Unit2 надо будет видеть меню модуля Unit1, то аналогичным образом введите и обратную связь — свяжите модуль Unit2 c Unit1.
Теперь давайте спроектируем вспомогательную форму. Она может иметь вид, представленный на рис. 6.6. На ней расположено два списка ListBox (см. раздел 3.3.5): ListBox1, в котором отображаются заголовки меню, и ListBox2, в котором отображаются разделы меню, соответствующие выбранному заголовку. В нижней части формы расположен компонент HotKey и кнопка Button, которая фиксирует в меню сделанный пользователем выбор и закрывает форму. В компоненте HotKey надо стереть с помощью Инспектора Объектов свойство HotKey, которое содержит некоторое значение по умолчанию.
Рис. 6.6 Окно постройки горячих клавиш во время выполнения |
Теперь надо написать обработчики событий, которые загружали бы списки ListBox1 и ListBox2 названиями разделов и при выборе пользователем быстрых клавиш фиксировали бы этот выбор в соответствующем разделе меню формы Form1. Код может выглядеть следующим образом:
procedure TForm2.FormShow(Sender: TObject); var i: integer; begin {Загрузка ListBox1 заголовками меню при событии OnShow формы Form2} ListBox1.Clear; for i:=0 to Form1.MainMenu1.Items.Count-1 do ListBox1.Items.Add(Form1.MainMenu1.Items[i].Caption); ListBox1.ItemIndex:=0; {Обращение к процедуре загрузки ListBox2} ListBox1Click(Sender); end; procedure TForm2.ListBox1Click(Sender: TObject); var i: integer; begin {Загрузка ListBox2 заголовками разделов меню MainMenu1.Items[ListBox1.ItemIndex], выделенного пользователем в ListBox1 при событии OnShow формы Form2} ListBox2.Clear; for i:=0 to Form1.MainMenu1.Items[ListBox1.ItemIndex].Count-1 do ListBox2.Items.Add(Form1.MainMenu1.Items[ ListBox1.ItemIndex].Items[i].Caption); ListBox2.ItemIndex:=0; end; procedure TForm2.ListBox2Click(Sender: TObject); begin {Занесение горячих клавиш выделенного в ListBox2 раздела в компонент HotKey1} HotKey1.HotKey:=Form1.MainMenu1.Items[ ListBox1.ItemIndex].Items[ListBox2.ItemIndex].ShortCut; end; procedure TForm2.Button1Click(Sender: TObject); begin {Изменение горячих клавиш выбранного раздела меню и закрытие вспомогательной формы} Form1.MainMenu1.Items[ ListBox1.ItemIndex].Items[ ListBox2.ItemIndex].Shortcut := HotKey1.HotKey; Close; end;
При событии OnShow формы Form2 происходит загрузка списка ListBox1 заголовками меню. Цикл загрузки перебирает индексы от 0 до Form1.MamMenu1.Items.Count-1. Это значение на 1 меньше значения MainMenu1.Items.Count, которое равно числу элементов в свойстве MainMenu1.Items.
При щелчке пользователя на списке ListBox1 происходит загрузка списка ListBox2. При этом к соответствующим разделам меню получается доступ с помощью выражения Form1.MainMenu1.Items[ListBox1.ItemIndex].Items[i]. В этом выражении Form1.MainMenu1.Items[ListBox1.ItemIndex] — элемент головного раздела меню, выбранного пользователем в ListBox1. Каждый такой раздел можно рассматривать как элемент массива меню и в то же время он сам является массивом разделов второго уровня. Поэтому его свойство Items[i] указывает на подраздел с индексом i.
При щелчке пользователя на списке ListBox2 происходит загрузка компонента HotKey1 символами горячих клавиш выбранного пользователем раздела. Если раздел не имеет горячих клавиш, то в окне HotKey1 отображается текст «Нет
». Далее пользователь может войти в окно HotKey1 и нажать сочетание клавиш, которое он хочет назначить выбранному им разделу меню. Обработка щелчка на кнопке фиксирует это сочетание в разделе меню и закрывает вспомогательную форму.
Опробуйте это приложение в работе и вам станет яснее механизм работы с разделами меню и с быстрыми клавишами.