Проектирование графического интерфейса пользователя______________239

Выше говорилось, что в приложении с несколькими окнами редактирования,
в которые пользователь должен поочередно вводить какие-то данные, ему удобно
переключаться между окнами клавишей табуляции. Но еще удобнее пользовате-
лю, закончившему ввод в одном окне, нажать клавишу Enter и автоматически пе-
рейти к другому окну. Это можно сделать, обрабатывая событие нажатия клавиши
OnKeyDown (см. о событиях при нажатии клавиш в разделе 4.3.2). Например,
если после ввода данных в окно Editi пользователю надо переключаться в окно
Edit2, то обработчик события OnKeyDown окна Editi можно сделать следующим:

void _fasfcall TFormI: :Edi'tlKeyDown (TObject *Sender, WORD &Key,

TShiftState Shift)
(
if (Key == VK_RETURN) Edit2->SetFocus();

)

Единственный оператор этого обработчика проверяет, не является ли клави-
ша, нажатая пользователем, клавишей Enter (именованная константа, соответству-
ющая этой клавише — VK_RETURN). Если это клавиша Enter, то фокус передает-
ся окну Edit2 методом SetFocus.

Можно подобные операторы ввести во все окна, обеспечивая требуемую после-
довательность действий пользователя (впрочем, свобода действий пользователя от
этого не ограничивается, поскольку он всегда может вернуться вручную к нужно-
му окну). Однако можно сделать все это более компактно, используя один обработ-
чик для различных окон редактирования и кнопок. Для этого может использова-
ться метод FindNextControl, возвращающий дочерний компонент, следующий в
последовательности табуляции. Если компонент, имеющий в данный момент фо-
кус, является последним в последовательности табуляции, то возвращается пер-
вый компонент этой последовательности. Метод определен следующим образом:

TWinControl* _fastcall FindNextControl(TWinControl* CurControl,

bool GoForward, bool CheckTabStop,
bool CheckParent);

Он находит и возвращает следующий за указанным в параметре CurControl
дочерний оконный компонент в соответствии с последовательностью табуляции.

Параметр GoForward определяет направление поиска. Если он равен true, то
поиск проводится вперед и возвращается компонент, следующий за CurControl.
Если же параметр GoForward равен false, то возвращается предшествующий ком-
понент.

Параметры CheckTabStop и CheckParent определяют условия поиска. Если
CheckTabStop равен true, то просматриваются только компоненты, в которых
свойство TabStop установлено в true. При CheckTabStop равном false значение
TabStop не принимается во внимание. Если параметр CheckParent равен true, то
просматриваются только компоненты, в свойстве Parent которых указан данный
оконный элемент, т.е. просматриваются только прямые потомки. Если CheckPa-
rent равен false, то прорматриваются все, даже косвенные потомки данного эле-
мента.

Таким образом, для решения поставленной нами задачи — автоматической пе-
редачи фокуса при нажатий клавиши Enter, вы можете написать единый обработ-
чик событий OnKeyDown всех интересующих вас оконных компонентов, содержа-
щий оператор:

if (Key == VK_RETURN)FindNextControl(

(TWinControl *)Sender, true, true, false)->SetFocus();

Этот оператор обеспечивает передачу фокуса очередному компоненту. Для
кнопок аналогичный оператор можно вставить в обработчик события OnClick:

FindNextControl((TWinControl *)Sender, true, true, false)->SetFocus();