6.3 Горячие клавиши — компонент HotKey

Компонент 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 и нажать сочетание клавиш, которое он хочет назначить выбранному им разделу меню. Обработка щелчка на кнопке фиксирует это сочетание в разделе меню и закрывает вспомогательную форму.

Опробуйте это приложение в работе и вам станет яснее механизм работы с разделами меню и с быстрыми клавишами.


к началу страницы