6

我要完成的工作:

  • 用户在 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 键,因为光标在第二行闪烁

感激地收到任何帮助。谢谢!

4

3 回答 3

7

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

  1. 创建操作列表或操作管理器,或重新使用现有列表。
  2. 添加一个清除备忘录并移至下一个的操作。您需要检查活动控件是否真的是备忘录。
  3. 为操作提供您想要的快捷方式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;

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

于 2013-07-24T10:52:09.307 回答
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)。

于 2014-03-19T11:36:13.413 回答
-1
property WantReturns: Boolean;
于 2013-11-30T04:47:33.573 回答