Delphi 关注一个时代的关键事件?

Delphi 关注一个时代的关键事件?,delphi,keyboard,focus,delphi-7,Delphi,Keyboard,Focus,Delphi 7,我正在构建一个编辑器,它使用TImage来显示图片,并具有鼠标事件,以便能够在图像上绘制、移动和调整框的大小。所有这些都非常有效。现在我正在尝试实现使用键盘上的箭头移动所选框的功能,但是A)TImage没有获得任何焦点,B)TImage没有任何按键事件(因为它无法获得焦点)。我想我可以作弊并打开表单的KeyPreview属性,然后在那里捕获它们,但是这个表单上还有许多其他控件,我需要确保用户打算使用图像。例如,如果用户在TEdit控件中具有焦点,则箭头键应仅影响此备忘录,而不修改图像 那么有没有

我正在构建一个编辑器,它使用TImage来显示图片,并具有鼠标事件,以便能够在图像上绘制、移动和调整框的大小。所有这些都非常有效。现在我正在尝试实现使用键盘上的箭头移动所选框的功能,但是A)TImage没有获得任何焦点,B)TImage没有任何按键事件(因为它无法获得焦点)。我想我可以作弊并打开表单的KeyPreview属性,然后在那里捕获它们,但是这个表单上还有许多其他控件,我需要确保用户打算使用图像。例如,如果用户在TEdit控件中具有焦点,则箭头键应仅影响此备忘录,而不修改图像


那么有没有办法在TImage中放置或伪造某种焦点来识别关键事件呢?

只有继承自
TWinControl
的控件才能接收键盘焦点。
TImage
TGraphicControl
中退出,无法接收键盘事件

您可以将图像放在位于另一个控件(如TEdit)顶部的面板上,并在选择图像时提供该焦点。
然后只需使用不可见编辑的
OnKeyPress
事件。
如果不想让tab键将焦点更改为其他控件,请确保不允许使用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;

只有继承自TWinControl的控件才能接收键盘焦点。
TImage
TGraphicControl
中退出,无法接收键盘事件

您可以将图像放在位于另一个控件(如TEdit)顶部的面板上,并在选择图像时提供该焦点。
然后只需使用不可见编辑的
OnKeyPress
事件。
如果不想让tab键将焦点更改为其他控件,请确保不允许使用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;


如果你真的想构建一个图像编辑器,你应该从
TCustomControl
开始构建你自己的(带窗口的)控件。(顺便说一下,
TImage
无法接收焦点的原因是:
TImage
是一个图形VCL控件,这意味着它没有窗口句柄;它不是一个窗口。)它不是任何大型图像编辑器,这个编辑器只有一个用途,在图像上绘制分层框。分层意味着它们实际上不是图像的一部分。我正在为HTML制作一个“图像映射”编辑器。你说的有道理,但我不认为仅仅为了这个而构建自定义控件是值得的。构建自定义控件是微不足道的。绘制它很简单。@DavidHeffernan的确,像往常一样,做一个自定义控件是一个好主意,但这是我需要跳过的一个小障碍-你不需要跳过100英尺3英尺的障碍:你不需要使用任何控件或组件来完成这个项目!只要有足够的格式:)你必须学习什么是图像处理的意义!仅此表单的1个表单和画布足够如果您真的想构建一个图像编辑器,那么您应该从
TCustomControl
开始构建自己的(带窗口的)控件。(顺便说一下,
TImage
无法接收焦点的原因是:
TImage
是一个图形VCL控件,这意味着它没有窗口句柄;它不是一个窗口。)它不是任何大型图像编辑器,这个编辑器只有一个用途,在图像上绘制分层框。分层意味着它们实际上不是图像的一部分。我正在为HTML制作一个“图像映射”编辑器。你说的有道理,但我不认为仅仅为了这个而构建自定义控件是值得的。构建自定义控件是微不足道的。绘制它很简单。@DavidHeffernan的确,像往常一样,做一个自定义控件是一个好主意,但这是我需要跳过的一个小障碍-你不需要跳过100英尺3英尺的障碍:你不需要使用任何控件或组件来完成这个项目!只要有足够的格式:)你必须学习什么是图像处理的意义!这是一个很好的方法:D我在我们公司的软件中做了一些非常类似的事情,按F1键将您带到帮助文件-许多控件(如TBitBtn)没有焦点,我使用这种方法将焦点强制到隐藏(或看不见)的编辑控件,正如您所提到的。值得一试!这也意味着当“焦点”从该图像上移开时,要在其他任何地方注意识别。@Jerrydoge:好的,对不起,没有注意到。@AndreasRejbrand,是的,你需要在窗口控件的顶部放置一个面板,在面板的顶部放置一个图像,这样才能工作。@AndreasRejbrand是的,他的回答有点误导,这正是我一开始认为他的意思。除了在TEdit上使用TPanel,您还可以将TEdit.Width设置为0。这是一个很好的方法:D我在我们公司的软件中做了一些非常类似的事情,按F1键将您带到帮助文件-许多控件(如TBitBtn)没有焦点,我使用此方法将焦点强制到隐藏(或看不见)的编辑控件,正如你所说的那样。值得一试!这也意味着当“焦点”从该图像上移开时,要在其他任何地方注意识别。@Jerrydoge:好的,对不起,没有注意到。@AndreasRejbrand,是的,你需要在窗口控件的顶部放置一个面板,在面板的顶部放置一个图像,这样才能工作。@AndreasRejbrand是的,他的回答有点误导,这正是我一开始认为他的意思。除了在TEdit上使用TPanel,您还可以将TEdit.Width设置为0。