2013-03-16 16 views
8

Tôi có biểu mẫu trong một ứng dụng được viết bằng FireMonkey. Trên đó (phương thức) hình thức có một nút OK mà tôi đã thiết lập tài sản mặc định là True. Ngoài ra còn có một thành phần ghi nhớ. Bây giờ nếu gõ gõ enter trong khi gõ vào bản ghi nhớ, sau đó biểu mẫu được đóng thay vì chèn ngắt dòng vào bản ghi nhớ.Các ngắt dòng trong TMemo trên biểu mẫu có nút Mặc định

Những gì tôi muốn thực hiện, là khi nhập (hoặc shift + enter hoặc smth like that) được nhấn trong thành phần ghi nhớ, sau đó ngắt dòng được nhập. Trong các thành phần khác, nơi bạn không thể nhập ngắt dòng, tôi vẫn muốn nhấn enter để đóng biểu mẫu. Điều tốt nhất tôi đã tìm thấy cho đến nay là thêm đoạn mã sau vào hành động hình thức OnCloseQuery:

if (Focused.GetObject.ClassName = 'TMemo') and (ModalResult = mrOk) then 
begin 
    CanClose := False; 
    Memo := TMemo(Focused.GetObject); 
    Memo.InsertAfter(Memo.CaretPosition, sLineBreak, [TInsertOption.ioMoveCaret, 
    TInsertOption.ioCanUndo]); 
end 
else 
    CanClose := True; 

này hoạt động, nhưng có ấy bây giờ có một sự chậm trễ gây phiền nhiễu nhỏ sau khi chạm vào và trước khi ngắt dòng xuất hiện. Ngoài ra tôi muốn giải pháp, đó sẽ là ít hacky.

Tôi cũng nên chỉ ra rằng tôi cũng có các biểu mẫu chứa nút OK chứ không phải thành phần ghi nhớ, tuy nhiên thư báo sẽ được chuyển sang biểu mẫu đó khi chạy bằng cách thay đổi thuộc tính gốc của nó.

+1

Cố gắng ghi nhớ của bạn 'Memo.Lines.BeginUpdate;' trước khi thay đổi nội dung Memo và 'Memo.Lines.EndUpdate; 'sau đó. – Abelisto

+3

Emba đã bỏ lỡ để thực hiện các thuộc tính TMemo WantReturns, WantTabs: o (Tôi sẽ sử dụng một sự kiện OnIdle trên biểu mẫu để kiểm tra xem có một TMemo tập trung để thiết lập thuộc tính mặc định hay không. Nhưng Emba cũng không có TApplicationEvent cho FMX: o (Chỉ có TActionList mới có Sự kiện OnUpdate được kích hoạt khi không hoạt động nếu có ít nhất một hành động được xác định và gán cho điều khiển –

+1

Trong sự kiện nút 'OnClick' mặc định của bạn, hãy kiểm tra xem bản ghi nhớ có tập trung không và đặt 'ModalResult' thành mrNone nếu trường hợp đó xảy ra –

Trả lời

2

Đặt btnOk.Default-False trong của OnEnter, và trở lại True vào những bản ghi nhớ OnExit

+0

Nó không phải lúc nào cũng dễ dàng. Tôi có các biểu mẫu ghi nhớ trên biểu mẫu khác được nhúng vào biểu mẫu bằng nút OK (như trong http://stackoverflow.com/a/9048640/721309). Do đó đôi khi bản ghi nhớ không có cách nào để biết liệu có nút nào hay không. –

+1

Trong trường hợp đó, bạn có thể tạo một hậu duệ của 'TMemo' tìm kiếm thông qua điều khiển của cha mẹ cho một nút có' Default' được đặt thành 'True' và đặt nó thành' False' trong phương thức 'CMEnter()' và quay lại 'True' trong' CMExit() ' –

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