Delphi 使用Ctrl+清空TMemo;进入

Delphi 使用Ctrl+清空TMemo;进入,delphi,delphi-xe2,Delphi,Delphi Xe2,我正在努力实现的目标: 用户在TMemo框中输入文本 如果按Enter键,则会创建一条新行 如果按Ctrl+Enter,则会将文本移动到另一个框并清空TMemo 我正在使用此代码[KeyPreview为True]: procedure TFMsg.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift = [ssCtrl]) and (Key = $0D) then begin

我正在努力实现的目标:

  • 用户在TMemo框中输入文本
  • 如果按Enter键,则会创建一条新行
  • 如果按Ctrl+Enter,则会将文本移动到另一个框并清空TMemo
我正在使用此代码[KeyPreview为True]:

procedure TFMsg.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Shift = [ssCtrl]) and (Key = $0D) then
  begin
    Key := 0;
    btnSendClick(Sender); //this moves the text and empties the TMemo box
  end;
end;
实际发生的情况:

  • Ctrl+Enter将文本发送到另一个框
  • TMemo清空,但似乎接受Enter键,因为光标位于第二行闪烁

感谢您的帮助。谢谢大家!

处理此问题的最佳方法如下:

  • 创建操作列表或操作管理器,或重新使用现有操作列表或操作管理器
  • 添加一个清除备忘录并移动到下一个备忘录的操作。您需要检查活动控件是否真的是备忘录
  • 按CTRL+ENTER键为操作指定所需的快捷方式
  • 请注意,您不需要将操作附加到任何内容。只要有人在场就足以确保捷径得到处理

    对于使用修改键的复合键盘操作,使用操作快捷键总是最简单的,因此与较低级别的键盘处理代码保持一定距离

    您的操作处理程序可能如下所示:

    if ActiveControl is TMemo then
    begin
      Memo := TMemo(ActiveControl);
      Text := Memo.Text;
      Memo.Clear;
      SelectNext(Memo, True, True);
      if ActiveControl is TMemo then
      begin
        Memo := TMemo(ActiveControl);
        Memo.Text := Text;
      end;
    end;
    

    在这段代码中,我假设有多个备忘录,并且文本在选项卡顺序中从一个备忘录移动到下一个备忘录。但你的需求可能会有所不同。在这种情况下,我相信很明显您需要为您的场景做什么。

    使用备忘录的OnKeyPress事件:

    property WantReturns: Boolean;
    
    procedure TFMsg.Memo1KeyPress(Sender: TObject; var Key: Char);
    begin
      if (key=#10) and (GetKeyState(VK_CONTROL)<0) then
        begin
          key:=#0;
          btnSendClick(Sender);
        end;
    end;
    
    procedure TFMsg.Memo1KeyPress(发送方:TObject;变量键:Char);
    开始
    
    if(key=#10)和(GetKeyState(VK_控件)非常棒,谢谢。除了尝试类似操作的人之外,Ctrl+Enter不是Object Inspector中的默认选项之一。FormCreate中的这一行手动添加了它:
    Action1.ShortCut:=快捷方式($0D,[ssCtrl])
    。只写代码的帖子不被视为答案,特别是当它们只包含一行内容并且没有任何附加值时。您能否对您的答案提供一些解释?如果没有,它可能会被删除为“非答案”。谢谢。有关“只写代码的答案”不合适的原因的讨论,请参阅。