Все бесплатно
    Все ссылки на файлы, расположенные на страницах сайта, добавлены пользователями и доступны для бесплатного скачивания. За содержание этих файлов администрация сайта ответственности не несет.



Вопросы
  Перекодировка в DBASE
   Категория: Базы данных
  Упаковать TinyDB
   Категория: Базы данных
  Тpансляция ошибок в BDE
   Категория: Базы данных
  Изменить пароль для Paradox
   Категория: Базы данных
  Как поместить графический элемент в ListBox
   Категория: Компоненты
  Как найти наибольший общий делитель
   Категория: Математика
  Как подключить или отключить сетевой диск
   Категория: Интернет и Сети
  Распознавание кодировки. Перекодировка.
   Категория: Текст и строки
  Упаковка таблиц в BDE
   Категория: Базы данных
  Последний день месяца
   Категория: Базы данных

Delphi - База Знаний: Компонент 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:

не каскадное (т.е. состоит только из двух уровней — заголовков меню и выпадающих списков разделов)
в свойствах Caption разделов меню не использованы амперсанты
в меню отсутствуют разделители

Эти предположения сделаны просто для того, чтобы упростить код и не использовать функции, не описанные в данной книге.

Начните новое приложение, разместите на форме компонент MainMenu и сконструируйте с его помощью любое меню, удовлетворяющее перечисленным требованиям. Задайте каким-то из разделов меню быстрые клавиши. Один из разделов меню должен называться Настройка и при выборе его мы хотим предоставить пользователю вспомогательную форму для настройки быстрых клавиш.

Добавьте в приложение еще одну форму (команда File | New Form). Эта форма будет вспомогательной. В обработчик команды Настройка главной формы вставьте оператор

Form2.ShowModal;


Этот оператор покажет пользователю окно вспомогательной формы как модальное — т.е. пользователь не сможет вернуться в главную форму, пока не закроет вспомогательную. Чтобы компилятор понял этот оператор, надо в модуль главной формы Unit1 вставить оператор uses, ссылающийся на модуль вспомогательной формы Unit2. Можете сделать это вручную или, перейдя в окне Редактора Кода в модуль Unit1, выполните команду File | Use Unit и укажите, что хотите связаться с модулем Unit2. Поскольку из модуля Unit2 надо будет видеть меню модуля Unit1, то аналогичным образом введите и обратную связь — свяжите модуль Unit2 c Unit1.

Теперь давайте спроектируем вспомогательную форму. Она может иметь вид, представленный на рис. 6.6. На ней расположено два списка ListBox: ListBox1, в котором отображаются заголовки меню, и ListBox2, в котором отображаются разделы меню, соответствующие выбранному заголовку. В нижней части формы расположен компонент HotKey и кнопка Button, которая фиксирует в меню сделанный пользователем выбор и закрывает форму. В компоненте HotKey надо стереть с помощью Инспектора Объектов свойство 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. В этом выражении Form1.MainMenu1.Items[ListBox1.ItemIndex] — элемент головного раздела меню, выбранного пользователем в ListBox1. Каждый такой раздел можно рассматривать как элемент массива меню и в то же время он сам является массивом разделов второго уровня. Поэтому его свойство Items указывает на подраздел с индексом i.

При щелчке пользователя на списке ListBox2 происходит загрузка компонента HotKey1 символами горячих клавиш выбранного пользователем раздела. Если раздел не имеет горячих клавиш, то в окне HotKey1 отображается текст В«НетВ». Далее пользователь может войти в окно HotKey1 и нажать сочетание клавиш, которое он хочет назначить выбранному им разделу меню. Обработка щелчка на кнопке фиксирует это сочетание в разделе меню и закрывает вспомогательную форму.

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