Сосредоточиться на ключевых событиях на TImage?

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

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


person Jerry Dodge    schedule 11.12.2011    source источник
comment
Если вы серьезно относитесь к созданию редактора изображений, вам действительно следует создать свой собственный (оконный) элемент управления, происходящий от TCustomControl. (И, кстати, причина, по которой TImage не может получить фокус, заключается в следующем: TImage — это графический элемент управления VCL, что означает, что у него нет дескриптора окна; это не окно.)   -  person Andreas Rejbrand    schedule 12.12.2011
comment
Ну, это не какой-то огромный редактор изображений, у этого редактора только одна цель - рисовать многослойные прямоугольники на изображении. Многоуровневые означают, что они на самом деле не являются частью изображения. Я делаю это редактором карт изображений для HTML. Вы правы, но я не думаю, что ради этого стоит тратить всю работу по созданию пользовательского элемента управления.   -  person Jerry Dodge    schedule 12.12.2011
comment
Создание пользовательского элемента управления тривиально. Рисовать это банально.   -  person David Heffernan    schedule 12.12.2011
comment
@DavidHeffernan Действительно, создание пользовательского элемента управления - отличная идея, как всегда, но это одно крошечное препятствие, которое мне нужно преодолеть - вам не нужно прыгать на 100 футов через трехфутовое препятствие: P   -  person Jerry Dodge    schedule 12.12.2011
comment
Вам не нужно использовать какой-либо элемент управления или компонент для этого проекта! Для этого достаточно TForm :) вы должны узнать, что такое обработка изображений! Достаточно 1 формы и полотна такой формы   -  person relativ    schedule 13.12.2011
comment
@relativ Эммм ... Я не знаю, что вы имеете в виду с рисунком TForm (не говорю, что я не понимаю концепцию), но я не планирую создавать компонент, я все еще использую TImage и это тоже работает довольно красиво :) От синтаксического анализа HTML со скоростью 50 000 тегов в секунду до рисования / перемещения / изменения размера горячих точек на изображении - и все это работает отлично практически без каких-либо ресурсов (процессор не пиковый) благодаря использованию записей и Массивы: Д   -  person Jerry Dodge    schedule 13.12.2011
comment
Просто хочу отметить, что вот ссылка на парсер HTML, который я использую: yunqa.de/delphi/doku.php/products/htmlparser/index   -  person Jerry Dodge    schedule 13.12.2011


Ответы (1)


Только элементы управления, унаследованные от 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;
person Johan    schedule 11.12.2011
comment
Это отличный подход: я сделал что-то очень похожее в программном обеспечении нашей компании для нажатия F1, чтобы перейти к файлу справки - многие элементы управления (например, TBitBtn) не имеют фокуса, и я использовал этот метод, чтобы принудительно сфокусировать фокус на скрытом ( или вне поля зрения) управление редактированием, точно так, как вы упомянули. Стоит попробовать! Это также означало бы, что везде нужно распознавать, когда Фокус снимается с этого изображения. - person Jerry Dodge; 12.12.2011
comment
@JerryDodge: Хорошо, извини, не понял. - person Andreas Rejbrand; 12.12.2011
comment
@AndreasRejbrand, правда, вам нужно поместить панель поверх оконного элемента управления и изображение поверх панели, тогда это сработает. - person Johan; 12.12.2011
comment
@AndreasRejbrand Да, его ответ немного вводит в заблуждение, я тоже сначала подумал, что это именно то, что он имел в виду. - person Jerry Dodge; 12.12.2011
comment
+1. Вместо использования TPanel поверх TEdit вы также можете установить для TEdit.Width значение 0. - person Pol; 12.12.2011
comment
@Pol На самом деле, TEdit.Left:= -200 лучше: D И также не обязательно имеет значение, что является родителем TImage. - person Jerry Dodge; 12.12.2011