2011-09-05 37 views
5

Tôi có hai điều khiển TEdit. Khi tôi tab ra khỏi edit1, edit2 sẽ nhận được tiêu điểm. Trong sự kiện OnExit của tôi về Edit1 Tôi có mã sau:Tập trung vào TEDIT & caret

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
end; 

Edit2 có trọng tâm. Tuy nhiên, không có dấu mũ trong đó. Tôi có thể bắt đầu nhập nhưng khó hiểu vì tôi không biết kiểm soát nào có tiêu điểm.

Tôi quan tâm hơn đến những gì đang xảy ra với việc lật thuộc tính Kích hoạt đã khiến một số thông báo không phải là kích hoạt đúng cách? Ví dụ, sự kiện OnEnter của edit2 không được kích hoạt.

Đây là trên D2006 nếu nó quan trọng.

Cảm ơn bạn đã trả lời.

+1

Tại sao bạn muốn thực hiện việc này? –

+0

có một loạt các mã giữa tắt và bật chỉnh sửa2. nó không nhất thiết phải edit2, nhưng bất cứ điều gì là activecontrol. vì vậy sau khi kích hoạt lại bộ kích hoạt, tôi muốn đặt lại tiêu điểm trong đó. tốt, nó chắc chắn là activecontrol, nhưng không có dấu mũ. – Rick

Trả lời

8

Tôi không hiểu lý do tại sao bạn vô hiệu hóa và kích hoạt edit2, nhưng bạn làm điều này:

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
    PostMessage(edit2.Handle, WM_SETFOCUS, 0, 0); 
end; 

BTW, tôi đồng ý với Andreas Rejbrand.

+1

Cá nhân tôi thích phương thức này nếu được gán (ActiveControl) sau đó PostMessage (ActiveControl.Handle, WM_SETFOCUS, 0,0); sau khi đặt tiêu điểm cho điều khiển khác. Sau khi một số hoạt động cửa sổ api dường như không nhận ra điều khiển hoạt động và do đó OnExit/OnEnter sự kiện không kích hoạt đúng cách. Dòng này sửa chữa nó. – ertx

+0

Tôi đồng ý nhưng tôi không biết liệu anh ấy có thể tập trung vào một thành phần khác không ... – Whiler

+0

Công trình này, cảm ơn! Tôi đã cố gắng theo dõi chuỗi sự kiện tìm ra lý do tại sao nó sẽ không vẽ lại tiêu điểm và dấu mũ. Nhấn tường trên WndProc và nó chỉ vòng ở đó và tôi đã mất dấu theo dõi thông điệp của nó. – Rick

8

Tôi nghiêm túc nghi ngờ bạn đang làm điều gì đó một cách tồi tệ và giải pháp tốt nhất có nhiều khả năng là thiết kế lại. Bạn không được phép vô hiệu hóa và sau đó kích hoạt một điều khiển trong khi nó đang nhận được tiêu điểm.

+0

Tôi đồng ý, điều đó không lý tưởng. Và chắc chắn có cách giải quyết. Nhưng tôi chỉ tò mò về những gì cần thiết cho dấu mũ và tập trung để hiển thị. Một cái gì đó về việc vô hiệu hóa các activecontrol w/trong sự kiện OnExit phá vỡ chuỗi các cửa sổ tin nhắn. – Rick

0

Có một loạt các mã giữa tắt và bật chỉnh sửa2.

Có rất nhiều mã trong xử lý sự kiện OnExit của điều khiển hoạt động trước đó không không cần phải vô hiệu hóa việc kiểm soát hoạt động tiếp theo. Mã đó sẽ thực thi trước khi điều khiển hoạt động tiếp theo hiển thị dấu mũ và sẽ có thể nhận dữ liệu nhập của người dùng. Chỉ cần chắc chắn rằng nó không thực hiện vượt qua thực hiện bởi một cái gì đó giống như bắt đầu một chủ đề mới hoặc sử dụng Application.ProcessMessages.

Đặt Screen.Cursor thành crHourGlass để làm cho người dùng biết rằng điều khiển hoạt động tiếp theo chưa sẵn sàng.

0

Tìm thấy sự cố khi OnActive cho MainForm kích hoạt một biểu mẫu khác.

TMainForm.OnActivate; 
begin 
ChildForm.ShowModal; 
end; 

Tiêu cự điều khiển được đặt nhưng không hoạt động. Công việc xung quanh tôi thấy là gửi PostMessage (Handle, WM_SETFOCUS, 0, 0); để xử lý biểu mẫu.

procedure TChildForm.FocusControl(AWinControl: TWinControl); 
begin 
    try 
    // http://stackoverflow.com/questions/7305296/tedit-focus-caret 
    PostMessage(Handle, WM_SETFOCUS, 0, 0); 
    PostMessage(AWinControl.Handle, WM_SETFOCUS, 0, 0); 
    if AWinControl.CanFocus then 
     AWinControl.SetFocus; 
    except 
    on E: Exception do 
    begin 
     Error(Self, E); 
    end; 
    end; 
end; 
Các vấn đề liên quan