2013-07-24 2 views
6

То, что я пытаюсь выполнить:опустошить TMemo с помощью Ctrl + Enter

  • Пользователь вводит текст в поле ТМето
  • Если нажать Enter это создает новую строку
  • Если нажать Ctrl +Введите перемещает текст в другую коробку и опустошает TMemo

Я использую этот код [KeyPreview это правда]:

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 пустеет, но, кажется, принимает клавишу Enter, как курсор сидит мигает вторая строка

Любая помощь с благодарностью получена. Спасибо!

ответ

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; 

В этом коде я предполагаю, что есть несколько памяток и текст перемещается из одной записки к следующему в списке порядке. Но ваши потребности могут сильно отличаться. В этом случае я уверен, что будет очевидно, что вам нужно сделать для вашего сценария.

+0

Это превосходно, спасибо. В отличие от тех, кто пытается схожие, Ctrl + Enter не является одним из параметров по умолчанию в Object Inspector. Эта строка в FormCreate вручную добавила его: 'Action1.ShortCut: = ShortCut ($ 0D, [ssCtrl])'. –

-1
property WantReturns: Boolean; 
+2

Только сообщения с кодом не считаются ответами, особенно если они содержат одну строку и действительно не добавляют никакого значения. Можете ли вы [изменить], чтобы дать некоторое объяснение вашего ответа? Если нет, вероятно, он будет удален как «Не ответ». Благодарю. –

+1

См. [This Meta post] (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; 

Пожалуйста, обратите внимание, что вы должны проверить Line Feed (# 10), а не для возврата каретки (# 13).

Смежные вопросы