2013-07-24 28 views
6

我试图做到:空用Ctrl一个TMemo + Enter键

  • 用户输入文本到TMemo箱
  • 如果他们按Enter键创建一个新行
  • 如果他们按按Ctrl +输入移动文本到另一个框,并清空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 + 输入发送文本到其他盒子
  • 的TMemo清空,但似乎接受了回车键,光标位于闪烁第二行

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

回答

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; 

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

+0

非常棒,谢谢。除了任何人试图类似之外,Ctrl + Enter不是Object Inspector中的默认选项之一。 FormCreate中的这一行手动添加它:'Action1.ShortCut:= ShortCut($ 0D,[ssCtrl])'。 –

-1
property WantReturns: Boolean; 
+2

仅限代码帖子不被视为答案,特别是当它们包含单行并且实际上不添加任何值时。你能[编辑]提供你的答案的一些解释?如果不是,它可能会被删除为“不是答案”。谢谢。 –

+1

请参阅[此Meta帖子](http://meta.stackexchange.com/q/148272/172661)讨论为什么“代码只回答”在这里不合适。 –

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)。