Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Так, если у меня есть своего рода кнопка (check, radio, speed и т.п.), то почему я не могу с помощью клавиш курсора управлять ею?
После некоторых экспериметов я создал метод, который привожу ниже, способный перехватывать в форме все нажатые клавиши позиционирования и управлять ими выбранным в настоящий момент элементом управления. Имейте в виду, что элементы управления (кроме компонентов Label) должны иметь возможность "выбираться". Для возможности выбрать GroupBox или другой компонент, удедитесь, что их свойство TabStop установлено в True. Вы можете переместить управление на GroupBox, но, так как он не выделяется целиком, узнать, что он действительно имеет управление, достаточно непросто. Если вам не нужно передавать управление в контейнерные элементы (нижеследующий код исходит из этого предположения), то вы можете управлять элементами, просто перемещая управление в сам GroupBox.
В нижеследующем коде FormActivate является обработчиком события формы OnActivate, тогда как ProcessFormMessages никакого отношения к событиям формы не имеет. Не забудьте поместить объявление процедуры ProcessFormMessages в секцию 'Private' класса вашей формы.
Надеюсь, что вам помог.
procedureTForm1.FormActivate(Sender: TObject); begin
{ Делаем ссылку на нового обработчика сообщений } Application.OnMessage := ProcessFormMessages; end
; procedure
tForm1.ProcessFormMessages(var
Msg: tMsg; var
Handled: Boolean); var
Increment: Byte; TheControl: tWinControl; begin
{ проверка наличия системного сообщения KeyDown } case
Msg.Message
of
WM_KEYDOWN: if
Msg.wParam in
[VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT] then
begin
{ изменяем величину приращения взависимости от состояния клавиши Shift } if
GetKeyState(VK_SHIFT) and
$80 = 0 then
Increment := 8 else
Increment := 1;
{ Этот код перемещает управление на родительский GroupBox, если один из его контейнерных элементов получает фокус. Если вам необходимо управлять элементами внутри контейнера, удалите блок IF и измените в блоке CASE TheControl на ActiveControl } if(ActiveControl.Parent is
tGroupBox) then
TheControl := ActiveControl.Parent else
TheControl := ActiveControl; case
Msg.wParam of
VK_UP: TheControl.Top := TheControl.Top - Increment; VK_DOWN: TheControl.Top := TheControl.Top + Increment; VK_LEFT: TheControl.Left := TheControl.Left - Increment; VK_RIGHT: TheControl.Left := TheControl.Left + Increment; end
;
{ сообщаем о том, что сообщение обработано } Handled := True; end
; end
; end
;