2013-07-24 15 views
6

co usiłuję osiągnąć:opróżnić TMemo z Ctrl + Enter

  • użytkownik wprowadza tekst w polu TMemo
  • Jeśli klawisz Enter tworzy nową linię
  • Jeśli naciśnij Ctrl + Wprowadź porusza tekst na innym polu i opróżnia TMemo

Używam tego kodu [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; 

Co się rzeczywiście dzieje:

  • Ctrl + Wprowadź wysyła tekst do innej skrzynki
  • TMemo opróżnia ale wydaje się akceptować klawisz Enter gdy kursor znajduje miga druga linia:

Każda pomoc otrzymana z wdzięcznością. Dziękuję Ci!

Odpowiedz

7

Najlepszym sposobem, aby obsłużyć to następująco:

  1. Utwórz listę działań, lub kierownik akcji, lub ponownie wykorzystać istniejący.
  2. Dodaj akcję, która usuwa notatkę i przechodzi do następnej. Musisz sprawdzić, czy aktywna kontrola naprawdę jest notatką.
  3. Daj akcji skrót, który chcesz, CTRL + ENTER.

Pamiętaj, że nie musisz dołączać akcji do niczego. Wystarczy sama obecność, aby zapewnić, że skrót będzie obsługiwany.

W przypadku złożonych operacji na klawiaturze przy użyciu klawiszy modyfikujących zawsze najłatwiej jest użyć skrótu akcji, a więc zachować na wyciągnięcie ręki z kodu obsługi klawisza niższego poziomu.

Twój handler działanie może wyglądać następująco:

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; 

W tym kodzie jestem przy założeniu, że istnieje wiele notatek, a tekst jest przenoszony z jednej notatki do następnego w kolejności zakładek. Ale twoje potrzeby mogą się różnić. W takim przypadku na pewno będzie oczywiste, co trzeba zrobić w swoim scenariuszu.

+0

To jest wspaniałe, dziękuję. Oprócz tego, że ktoś próbuje coś podobnego, Ctrl + Enter nie jest jedną z domyślnych opcji w Object Inspector. Ten wiersz w FormCreate ręcznie dodał: 'Action1.ShortCut: = ShortCut ($ 0D, [ssCtrl])'. –

-1
property WantReturns: Boolean; 
+2

Tylko posty z kodem nie są uważane za odpowiedzi, szczególnie jeśli zawierają pojedynczą linię i naprawdę nie dodają żadnej wartości. Czy możesz [edytuj] podać jakieś wyjaśnienie swojej odpowiedzi? Jeśli nie, prawdopodobnie zostanie usunięty jako "Brak odpowiedzi". Dzięki. –

+1

Zobacz [ten post Meta] (http://meta.stackexchange.com/q/148272/172661), aby dowiedzieć się, dlaczego "tylko odpowiedzi na kod" nie są tutaj odpowiednie. –

0

Użyj zdarzenia notatkę za onkeypress za to:

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; 

Należy pamiętać, że trzeba sprawdzić, czy linia zasilająca (# 10), a nie do powrotu karetki (# 13).