【问题标题】:How can I move a control in Delphi at runtime using the keyboard?如何在运行时使用键盘在 Delphi 中移动控件?
【发布时间】:2020-11-26 14:03:13
【问题描述】:

基于this,我添加了一个在运行时使用鼠标移动控件的选项,它运行良好。

但我试图找到一些代码来执行相同的技巧,但使用键盘 - 就像在设计时移动组件(仅移动)。

如何做到这一点?

【问题讨论】:

    标签: delphi keyboard controls delphi-2010


    【解决方案1】:

    如果你知道如何做它的不同部分,这很容易。

    1. 创建一个新的 VCL 应用程序。

    2. 在表单上添加TShape

    3. 将以下OnKeyDown 事件处理程序添加到表单中:

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    const
      D = 2;
    begin
      case Key of
        VK_UP:
          Shape1.Top := Shape1.Top - D;
        VK_DOWN:
          Shape1.Top := Shape1.Top + D;
        VK_LEFT:
          Shape1.Left := Shape1.Left - D;
        VK_RIGHT:
          Shape1.Left := Shape1.Left + D;
      end;
    end;
    
    1. 运行应用程序。

    话虽如此:

    通过在窗体上移动控件来创建动画是错误的。

    相反,如果您想创建动画,正确的做法是使用 GDI、GDI+、OpenGL 或 DirectX/Direct2D 手动绘制它们。 Here 是我如何做到这一点的标准示例。

    【讨论】:

    • 只有在没有其他组件能够自行处理键盘输入的情况下,您的示例才有效。为了允许 Form 在这种情况下处理键盘输入,您还应该将所述表单的 KeyPreview 属性设置为 True。
    • @SilverWarior:正确。但通常,当一个表单处理箭头键时,它完全没有任何控件使用:它只是一个绘图画布。我几乎认为KeyPreview = True 表明你没有以最合适的方式做事。
    • 问题的标题是 How can I move a control in Delphi at runtime using the keyboard? 因此我认为 OP 已经在表单上有多个控件。
    • @SilverWarior:它们很可能是非窗口控件(TLabelTShapeTImage,...),在这种情况下一切正常。另一方面,如果表单包含类TButtonTRadioButtonTCheckbox 等的控件,那么首先窃取箭头键是非常不可取的,因为它们用于移动焦点。更糟糕的是,如果你有TEditTListBoxTComboBoxTMemoTRichEditTListView 等,箭头键是它们自己的 UI 不可或缺的一部分。在这种情况下,你不能偷箭。在这两者之间,有一个小区域,KeyPreview 确实有用。
    • 关键是 OP 包含的信息太少,我们无法确切知道解决方案是什么。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多