Лекция
доцента кафедры ИВТ Гродненского госуниверситета
канд. техн. наук Ливак Елены Николаевны
Фокусировка элементов
При проектировании приложения необходимо предусмотреть удобную для пользователя последовательность фокусировки элементов.
Желательно, чтобы фокус автоматически переключался с одного компонента на другой в оптимальной последовательности при нажатии пользователем клавиши Enter после окончания работы с компонентом.
Следует также предоставить пользователю возможность переключать фокус с помощью клавиши Табуляции. Очевидно, что с помощью мыши пользователь также имеет возможность переключать фокус.
Компонент формы, который в данный момент находится в фокусе, является значением (его имя) свойства формы ActiveControl.
Его можно установить во время проектирования на тот компонент, который должен быть в фокусе первоначально.
В процессе выполнения это свойство меняется.
Программная возможность переключения фокуса - это использование метода SetFocus.
Например, если в какой-то момент необходимо переключить фокус на компонент Memo1, следует вызвать этот метод Memo1.SetFocus;
Во время проектирования можно установить последовательность фокусировки с помощью Табуляции.
Последовательность табуляции задается свойством TabOrder.
Замечание. Первоначально последовательность табуляции определяется той последовательностью, в которой размещались компоненты на форме. (У первого элемента свойство = 0, у второго - 1 и т.д.). Если не задано свойство формы ActivControl, то первоначально в фокусе будет элемент, у которого TabOrder = 0.
Для задания последовательности табуляции проще всего воспользоваться командой Edit | Tab Order и в режиме диалога задать необходимую последовательность.
Для того, чтобы вывести компонент из последовательности табуляции можно использовать свойство компонента TabStop. Если TabStop=false, компоненту невозможно передать фокус с помощью клавиши Tab (мышью можно).
! |
Следует обращать внимание на значение свойства TabStop. (TabStop=true для компонентов, на которые должен переходить фокус при помощи клавиши табуляции)
Автоматическая передача фокуса очередному компоненту
при нажатии пользователем клавиши Enter
Это можно сделать, обрабатывая событие нажатия клавиши OnKeyDown, двумя способами.
1. Ввести во все окна операторы, передающие фокус, обеспечивая требуемую последовательность действий
Например, после ввода данных в окно Edit1 необходимо переключиться в окно Edit2
procedure TForm1.Edit1KeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) then Edit2.SetFocus;
end;
2. Использовать единый обработчик событий OnKeyDown для различных окон (для различных кнопок - обработчик события OnClick).
Для этого воспользоваться методом FindNextControl, который возвращает очередной компонент в последовательности табуляции.
Метод определен следующим образом:
FindNextControl (CurControl: TWinControl; GoForward, CheckTabStop,
CheckParent : boolean) : TWinControl;
Метод возвращает следующий за указанным в параметре CurControl дочерний оконный компонент в соответствии с последовательностью табуляции.
Здесь GoForward определяет направление поиска (True - вперед).
Параметры CheckTabStop, CheckParent определяют условия поиска:
если CheckTabStop=true, то просматриваются компоненты, у которых TabStop=True,
если CheckTabStop=false, то значение TabStop не принимается во внимание
если CheckParent =true, то просматриваются только прямые потомки
если CheckParent =false, то просматриваются все (и косвенные)потомки данного элемента
Итак, чтобы автоматически передавать фокус при нажатии клавиши Enter следует написать единый обработчик событий OnKeyDown для всех оконных компонентов, содержащий оператор
if (Key = VK_RETURN)
then FindNextControl (Sender as TWinControl, true, true, false).SetFocus;
Этот оператор обеспечивает передачу фокуса очередному компоненту.
Для кнопок в обработчик события OnClick следует вставить оператор
FindNextControl (Sender as TWinControl, true, true, false).SetFocus;
Заголовок обработчика события OnKeyUp имеет такой же вид, как и OnKeyDown, так что все сказанное в равной степени относится и к событиям при отпускании клавиш.
Рассмотрим событие OnKeyPress.
Заголовок обработчика этого события имеет вид:
procedure (Sender: TObject; var Key: Char);
В этот обработчик также передается пapаметр Key, определяющий нажатую клавишу символа.
Тип этого параметра не целое число, a Char.
В данном случае, в обработчик передается не виртуальный код клавиши, а символ, по которому можно определить, прописная это буква, или строчная, русская, или латинская.
Пусть, например, вы задали пользователю вопрос, на который он должен ответить символами “Д” или “д” (да) или символами “Н” или «н» (нет).
Тогда распознать положительный ответ в обработчике события OnKeyPress можно оператором: 1
if ((Key = 'Д') or (Key = 'д')) then ...
Или короче, воспользовавшись oперацией in: if (Key in ['Д', 'д']) then ...;
Приведенные операторы реагируют только на положительный ответ пользователя, не реагируя на отрицательный или ошибочный ответ.
Реакцию на все возможные ответы обеспечивает структура case:
case Key of
‘Д','д': ...;
‘Н',’н': ...;
else Beep;
end;
Здесь предусмотрена реакция на положительный и отрицательный ответ, а также звуковой сигнал при ошибочном ответе.
Параметр Key передается как var.
Это позволяет в обработчике изменять этот параметр, изменяя соответственно его стандартную обработку в компоненте, поскольку ваш обработчик события срабатывает раньше стандартного обработчика компонента.
Пусть, например, вы хотите иметь на форме окно редактирования Edit1, в котором пользователь должен вводить только целые числа без знака, разделенные запятыми или пробелами.
Вы можете обеспечить безошибочный ввод, подменяя все недопустимые символы нулевым с помощью, например, такого оператора:
if not (Key in ['0'..'9', ' ' , ', ']) then Key := #0;
При нажатии пользователем любой клавиши, кроме клавиш с цифрой, запятой или пробелом, символы подменяются нулевым символом и просто не появляются в окне редактирования.
Можно добавить в обработчик звуковой сигнал при нажатии пользователем ошибочной клавиши:
if not (Key in ['0'..'9', ' ', ',']) then
begin
Key := #0;
Beep;
end;