delphi 有没有可能有一个键“开始”,然后“停止”的功能?

xzv2uavs  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(188)

我希望实现以下目标:
我按下并释放C键,就像平常一样键入了字母C
但是,我想按下并释放C键,并让CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC..连续输入,直到我再次按C键。
后者在Delphi代码中作为一个关键函数看起来如何?
本质上,我有一个热键分配给一个函数,它工作,但我想改变它,使一个热键的单次按下导致函数继续重复,直到热键被再次按下。
下面是代码:

lka_Skip:
if Game.Playing then
  if func.Modifier < 0 then
  begin
    if GameParams.NoAutoReplayMode then Game.CancelReplayAfterSkip := true;
    if CurrentIteration > (func.Modifier * -1) then
      GotoSaveState(CurrentIteration + func.Modifier)
    else
      GotoSaveState(0);
  end else if func.Modifier > 1 then
  begin
    fHyperSpeedTarget := CurrentIteration + func.Modifier;
  end else
    if fGameSpeed = gspPause then fForceUpdateOneFrame := true;

我已经可以在lka_Skip函数中添加一个"Hold"复选框,但我需要一行代码,说明"如果选中了Hold框,则重复执行该操作,直到再次按下该键"。

7cwmlq89

7cwmlq891#

如果我没理解错的话,您正在研究如何在TrueFalse状态之间切换布尔值。
您可以使用布尔运算符not轻松完成此操作。您可以在文档中阅读更多关于布尔运算符的信息
因此,在TrueFalse之间切换某个布尔值的代码将非常简单:

SomeBooleanValue := not SomeBooleanValue;
ldfqzlk8

ldfqzlk82#

在窗体的OnKeyPress、OnKeyDown或OnKeyUp中,检查按下的键是否为“C”。如果是,则通过启动TTimer开始生成“ccccc”序列。还将布尔变量(我们称之为GenerateC)设置为True。

下一次按“c”键并进入OnKeyPress事件处理程序时,检查变量是True还是False。如果为True,则停止生成“ccccc”序列(停止计时器)。如果为False,则开始生成。当然,还将对变量求反:

GenerateC:= not GenerateC;

注意:您的表单可能需要将KeyPreview属性设置为True。KeyPreview默认为false!

如果KeyPreview为true,则键盘事件在活动控件上发生之前先在窗体上发生。(活动控件由ActiveControl属性指定。)
如果KeyPreview为false,则键盘事件仅在活动控件上发生。
定位键(Tab、BackTab、箭头键等)不受KeyPreview的影响,因为它们不生成键盘事件。同样,当按钮具有焦点或其Default属性为true时,Enter键不受KeyPreview的影响,因为它不生成键盘事件。
我个人经常使用KeyPreview,所以我可以用Enter和Escape关闭表单:

procedure TfrmCalendarEditor.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Ord(Key) = VK_RETURN then btnOkClick(Sender);
 if Ord(Key) = VK_ESCAPE then Close;
end;

相关问题