2015-05-29 64 views
0

當在TEdits之間切換焦點時,選擇將根據您顯示錶單的方式而變化。 當您用Form.show顯示它,並在兩個TEdits之間切換時,將選中該文本。 當你表現出與Form.Showmodal形式,而且之間切換時,光標是在新的重點TEditTEdit和焦點選擇根據Show/showmodal的不同而不同

重現結束:創建一個新的形式,請在雙方一些文本。然後在兩個TEdits之間切換,選擇整個文本,但是當我用Modal顯示窗體時,插入符號位於文本後面。

爲什麼在功能上有所不同?我在哪裏可以改變它。

我找到負責代碼:

procedure TStyledEdit.DoEnter; 
var 
    Form: TCommonCustomForm; 
begin 
    inherited; 
    Form := TCommonCustomForm(Root); 
    if not Model.IsReadOnly and Model.InputSupport and not FTextService.HasMarkedText and 
    ((Form = nil) 
//next part returns false 
or (Form.FormState * [TFmxFormState.Showing] = [TFmxFormState.Showing]) or 
    (Form.FormState = [TFmxFormState.Engaged])) then 
    Edit.SelectAll 
    else 
    begin 
    UpdateSelectionPointPositions; 
    UpdateCaretPosition; 
    end; 
end; 
+0

我無法重現您所描述的問題。行爲完全一樣。 XE8。 – Zam

回答

0

DoEnter是一個受保護的方法,因此,你可以,如果你想用自己的方法來覆蓋。

您可以通過創建自己的後代類(使用不同的類型名稱)來執行此操作,也可以使用所謂的攔截器類,如本鏈接中所述:interceptor classes

我認爲你需要擴展if語句是這樣的(而不是測試 - 對不起)

if not Model.IsReadOnly and Model.InputSupport and not FTextService.HasMarkedText and 
    ((Form = nil) 
    or (Form.FormState * [TFmxFormState.Showing] = [TFmxFormState.Showing]) 
    or (Form.FormState * [TFmxFormState.Modal] = [TFmxFormState.Modal]) 
    or (Form.FormState = [TFmxFormState.Engaged])) then 
+0

也許這個問題並不清楚,但是運行的代碼來自TStyledEdit,當你關注TEdit時會觸發。我無法攔截TSyledEdit的代碼,因爲我的控件是一個TEdit類,當我爲TEdit創建一個攔截器類並執行'SelectAll'時,文本沒有突出顯示。 –

+0

好吧,我有Delphi XE7,我會盡力重現並回復給你。 – Dsm

+0

我已經按照您在XE7中的建議進行了構建和測試,並且可以在行爲中找到任何區別。所以別的東西一定是不一樣的。你可以發佈你的完整代碼,包括你爲TEdit屬性和TabOrder屬性設置的任何東西,我會再看一遍。還有您設置的任何樣式。 – Dsm

相關問題