2013-07-24 48 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)。