2013-07-24 22 views
6

Những gì tôi đang cố gắng để hoàn thành:rỗng một TMemo với Ctrl + Enter

  • dùng nhập văn bản vào một hộp TMemo
  • Nếu họ nhấn Enter nó tạo ra một dòng sản phẩm mới
  • Nếu họ bấm Ctrl +Nhập nó di chuyển văn bản đến hộp khác và đổ các TMemo

tôi đang sử dụng mã này [KeyPreview là 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; 

gì thực sự xảy ra:

  • Ctrl + Nhập gửi văn bản đến các hộp khác
  • Các TMemo đổ nhưng dường như chấp nhận phím Enter như con trỏ ngồi nhấp nháy trên dòng thứ hai

Mọi trợ giúp đều được biết ơn. Cảm ơn bạn!

Trả lời

7

Cách tốt nhất để xử lý việc này như sau:

  1. Tạo một danh sách hành động, hoặc người quản lý hành động, hoặc tái sử dụng hiện có.
  2. Thêm hành động xóa ghi nhớ và chuyển sang ghi chú tiếp theo. Bạn sẽ cần phải kiểm tra xem điều khiển hoạt động thực sự là một bản ghi nhớ hay không.
  3. Đặt hành động cho phím tắt mà bạn muốn, CTRL + ENTER.

Lưu ý rằng bạn không cần phải đính kèm hành động vào bất kỳ thứ gì. Nó chỉ là sự hiện diện là đủ để đảm bảo rằng các phím tắt sẽ được xử lý.

Đối với các thao tác bàn phím phức hợp bằng cách sử dụng phím bổ trợ, việc sử dụng phím tắt hành động luôn đơn giản nhất và do đó giữ chiều dài cánh tay từ mã xử lý bàn phím cấp thấp hơn.

xử lý hành động của bạn có thể trông như thế này:

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; 

Trong mã này tôi giả định rằng có nhiều bản ghi nhớ và các văn bản được chuyển từ một bản ghi nhớ kế tiếp theo thứ tự tab. Nhưng nhu cầu của bạn cũng có thể khác nhau. Trong trường hợp đó tôi chắc chắn nó sẽ được rõ ràng những gì bạn cần làm cho kịch bản của bạn.

+0

Thật tuyệt vời, cảm ơn bạn. Đối với bất kỳ ai cố gắng tương tự, Ctrl + Enter không phải là một trong các tùy chọn mặc định trong Trình kiểm tra đối tượng. Dòng này trong FormCreate tự thêm nó: 'Action1.ShortCut: = ShortCut ($ 0D, [ssCtrl])'. –

-1
property WantReturns: Boolean; 
+2

Chỉ các bài viết mã không được coi là câu trả lời, đặc biệt khi chúng chứa một dòng và thực sự không thêm bất kỳ giá trị nào. Bạn có thể [sửa] cung cấp một số giải thích về câu trả lời của bạn không? Nếu không, nó có thể sẽ bị xóa là "Không phải là câu trả lời". Cảm ơn. –

+1

Xem [bài đăng Meta này] (http://meta.stackexchange.com/q/148272/172661) để thảo luận về lý do tại sao "chỉ câu trả lời bằng mã" không phù hợp ở đây. –

0

Sử dụng sự kiện OnKeyPress của Memo cho rằng:

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; 

Xin lưu ý rằng bạn phải kiểm tra các dòng thức ăn (# 10), không cho vận chuyển trở lại (# 13).

Các vấn đề liên quan