使用Ctrl + Enter清空TMemo

时间:2013-07-24 10:43:48

标签: 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
    Key := 0;
    btnSendClick(Sender); //this moves the text and empties the TMemo box
  end;
end;

实际发生了什么:

  • Ctrl + 输入将文本发送到另一个方框
  • 当光标在第二行闪烁时,TMem会清空,但似乎接受了Enter键

感激不尽的任何帮助。谢谢!

3 个答案:

答案 0 :(得分:7)

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

  1. 创建操作列表或操作管理器,或重复使用现有列表。
  2. 添加清除备忘录并移至下一个备忘录的操作。您需要检查活动控件是否真的是备忘录。
  3. 为操作提供所需的快捷方式, CTRL + ENTER
  4. 请注意,您无需将操作附加到任何内容。仅仅存在就足以确保处理快捷方式。

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

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

    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;
    

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

答案 1 :(得分:0)

使用备忘录的OnKeyPress事件:

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;

请注意,您必须检查换行(#10),而不是回车(#13)。

答案 2 :(得分:-1)

property WantReturns: Boolean;