2011-09-05 29 views
5

我有兩個TEdit控件。當我從edit1中刪除時, edit2收到焦點。在EDIT1 我的OnExit事件中,我有以下代碼:TEdit重點和脫光

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

EDIT2具有焦點。但是,它並沒有脫口而出。 我可以開始輸入,但它令人困惑,因爲我不知道哪個控件有重點,所以我不知道 。

我對 翻轉的內容感興趣嗎?導致某些消息不是 正確觸發的啓用屬性?例如,edit2的OnEnter事件 未被觸發。

這是在D2006,如果它很重要。

感謝您的回覆。

+1

爲什麼要這樣做? –

+0

在禁用和啓用edit2之間有一堆代碼。它不一定是edit2,但是無論是activecontrol。所以重新啓用activecontrol後,我想重新設置它的焦點。好吧,它肯定是主動控制,但沒有脫字符。 – Rick

回答

8

我不明白你爲什麼禁用和啓用edit2,但你這樣做:

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

BTW,我同意安德烈亞斯Rejbrand。

+1

我個人更喜歡這種方法 如果分配(ActiveControl),然後 PostMessage(ActiveControl.Handle,WM_SETFOCUS,0,0); 將焦點設置到另一個控件後。在某些操作之後,windows api似乎無法識別活動控件,因此OnExit/OnEnter事件不能正確觸發。這條線糾正它。 – ertx

+0

我同意但我不知道他是否可以將重點放在另一個組件上... – Whiler

+0

這工作,謝謝!我試圖追蹤一連串的事件,找出爲什麼它不會重新繪製焦點和插入符號。打在WndProc上的牆,它只是在那裏循環,我失去了追蹤它處理的消息。 – Rick

8

我認真地懷疑你在做一件壞事,最好的解決方案很可能是重新設計。您不應該禁用並在接收焦點時啓用控件。

+0

我同意,這並不理想。並確定有解決方法。但是我只對插畫和重點展示需要什麼而感到好奇。關於在打破Windows消息鏈的OnExit事件中禁用activecontrol w /。 – Rick

0

在禁用和啓用edit2之間有一堆代碼。

有大量的代碼在以前主動控制的OnExit事件處理程序要求禁用下一個活動的控制。該代碼執行之前,下一個主動控制顯示插入符號,並將能夠接收用戶輸入。只要確保它不會通過啓動新線程或使用Application.ProcessMessages來執行。

設置Screen.CursorcrHourGlass,使之明確爲下一次主動控制還沒有準備好用戶。

0

當MainForm的OnActive激活另一個表單時發現問題。

TMainForm.OnActivate; 
begin 
ChildForm.ShowModal; 
end; 

控制焦點已設置但不起作用。我發現的工作是發送PostMessage(Handle,WM_SETFOCUS,0,0);到表單句柄。

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;