Фокус для ключевых событий на TImage? - PullRequest
1 голос
/ 12 декабря 2011

Я создаю редактор, который использует TImage для отображения изображения и имеет события мыши, чтобы иметь возможность рисовать, перемещать и изменять размеры полей на изображении. Все это работает отлично. Сейчас я пытаюсь реализовать возможность использовать стрелки на клавиатуре для перемещения выбранного блока, но A) TImage не получает никакого фокуса, и B) TImage не имеет никаких ключевых событий (потому что он не может получить фокус). Я думаю, что я мог бы обмануть и включить свойство формы KeyPreview и поймать их там, но есть много других элементов управления в этой форме, и мне нужно убедиться, что пользователь намеревается работать с изображением. Например, если пользователь имеет фокус в элементе управления TEdit, клавиши со стрелками влияют только на это напоминание, но не изменяют изображение.

Так есть ли способ поместить или подделать какой-то фокус в TImage для распознавания ключевых событий?

1 Ответ

4 голосов
/ 12 декабря 2011

Только элементы управления, которые наследуются от TWinControl, могут получать фокус клавиатуры.
TImage спускаются с TGraphicControl и не могут получать события клавиатуры.

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

procedure TForm8.Image1Click(Sender: TObject);
begin
  Edit1.SetFocus;
end;

procedure TForm8.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #9 then Key = #0; //disable tab key.
  case key of
    //do stuff here
  end; {case}
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...